ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. swc

    swc Гик

    Только для float.
     
  2. serg3295

    serg3295 Гик

    В блоге Терри Эллисона есть возможность скомпилировать свои файлы, в том числе и для integer прошивки.
    Вот только, зачем вам нужна именно integer? Работа с целыми числами в Lua происходит без ошибок округления во float прошивке. По крайней мере так было до текущего релиза. А вот с ним могут быть вопросы по округлению. Хотя, если вы не используете серьёзную математику в своих программах, то не должно по идее влиять.
     
  3. Костя++

    Костя++ Нерд

    Float работает медленнее чем Integer
    причем значительно. Однако может это верно только для последней версии, пока не могу это уточнить. Но с последней версией однозначно что то не то, с Вами согласен.
     
    Последнее редактирование: 15 янв 2021
  4. swc

    swc Гик

    Float - летает.
    Если в LFS.
     
  5. serg3295

    serg3295 Гик

    При изучении Lua по книге Иерузалимски "Программирование на языке Lua" (PiL3) мне очень не хватало примеров из книги уже в виде введённой программы, и приходилось вводить их руками. Только сейчас нашёл ресурс, где внесены примеры к книге с разбивкой по главам. Также автор привёл там свои варианты решения упражнений из книги. Для тех, кто находится в процессе изучения Lua, и активно работает с учебником, это может оказаться полезным.
    Ссылка на github.
     
    swc и ИгорьК нравится это.
  6. Костя++

    Костя++ Нерд

    простите за глупый вопрос, как проверить строку кода LUA перед выполнением?
     
  7. serg3295

    serg3295 Гик

    Я бы по-простому сделал
    Код (C++):

    i = 5
    f = loadstring( "i = i + [1" )
    if (type(f) == "function") then
      f()
      print (i)
    end

    -- или так, с вызовом ошибки
    i = 5
    f = assert( loadstring( "i = i + [1"), "hren!" )
    if (type(f) == "function") then
      f()
      print (i)
    end
     
    Детали и варианты на стр. 97-99 учебника PiL3
     
  8. Костя++

    Костя++ Нерд

    Спасибо, понятный пример и без деталей.
     
  9. Костя++

    Костя++ Нерд

    Еще один вопрос не дает покоя, как выяснить подключен ли клиент к серверу(модуль net)? Там есть события "connection", "disconnection" по ним все понятно, но если произошло подключение а позже был запущен пользователем скрипт, которому нужно знать есть ли соединение на данный момент, как тут быть?
     
  10. alp69

    alp69 Форумчанин

    Фиксировать событие и выставлять флаг
     
  11. Костя++

    Костя++ Нерд

    Ну в общем это так себе решение, уже пытался применять. Если произошел обрыв связи по причине нестабильного Wifi, то об этом обрыве связи узнаешь при попытке что то передать от клиента к серверу, ответом что нет подключения, при всем при этом естественно событие "disconnection" не происходило на момент разрыва, а происходит сразу после попытки передать данные. Как бы это все не то, что хотелось бы.
     
  12. alp69

    alp69 Форумчанин

    Проверяйте по таймеру наличие Wi-Fi (или наличие полученного от роутера ip). Модуль net в данном случае не нужен. Используйте модуль wifi. Например wifi.sta.getip().
     
  13. serg3295

    serg3295 Гик

    В ходе своего развития прошивка nodemcu имеет тенденцию переходить на версию Lua 5.3. Например, планируемая новая функция поддержки двух областей LFS на ESP будет реализована только для версии прошивки с Lua 5.3 (по утверждению разработчика).

    Для полноценного использования версии 5.3 в nodeMCU необходимо иметь следующее:
    1. собранная прошивка для Lua 5.3.
      При самостоятельной сборке рекомендуется сначала выполнить команду make LUA=51 clean для того, чтобы последующая сборка командой make LUA=53 прошла без проблем.
      При переходе обратно на 5.1 выполнить, соответственно, make LUA=53 clean
    2. кросс-компилятор для сборки LFS.
      под Linux luac.cross получается автоматически. Под Windows пока не представлено ни exe'шника кросс-компилятора под 5.3 в релизах github, ни solution для Visual Studio.
    Однако, теперь можно просто из командной строки собрать кросс-компилятор luac.cross.exe как под версию 5.1, так и под версию 5.3, не устанавливая Visual Studio, а установив небольшой пакет mingw32.

    Makefile для luac.cross под версию 5.1 находился в каталоге nodemcu-firmware\app\lua\luac_cross\

    По аналогии с ним я сделал make файл для сборки luac.cross под версию 5.3.
    Файл из приложенного архива - mingw32-Makefile.mak необходимо будет положить в \nodemcu-firmware\app\lua53\host\
    Инструкции по сборке находятся внутри файла.

    Определить какой luac.cross у вас используется можно так:
    c:\nodemcu-firmware>luac.cross.exe -v
    Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio

    В приложенном архиве находятся:
    • собственнно Makefile, для сборки luac.cross ver. Lua 5.3;
    • уже собранный luac.cross.exe Lua 5.3 для прошивки 3.0.0-release_20210201.
     

    Вложения:

    • luacross53.zip
      Размер файла:
      165,7 КБ
      Просмотров:
      137
    swc нравится это.
  14. swc

    swc Гик

    Вопрос: будет ли эта прошивка работать под ESP32?
     
  15. serg3295

    serg3295 Гик

    Если я не ошибаюсь, для ESP32 еще нет релиза с LFS. Lua 5.3 я там тоже не нашёл.

    P.S. Обновил скрипты для поддержки компилятора для 5.3. Обновления на Github.
     
    swc нравится это.
  16. levae

    levae Нуб

    Игорь, если вы еще просматриваете старые страницы, может подскажете в чем моя беда. Заинтересовал язык Lua, но не могу тронуться с места. Скопировал ваш код "wifi station" или заход в сеть и даже здесь затык.
    Код (Text):
    do
        wifi.setmode(wifi.STATION)
        wifi.sta.clearconfig()
        local scfg = {}
        scfg.auto = true
        scfg.save = true
        scfg.ssid = 'Моя_Точка_Доступа' -- WiFi
        scfg.pwd = 'Мой_Пароль' -- Password
        wifi.sta.config(scfg)
        wifi.sta.connect()
        tmr.create():alarm(15000, tmr.ALARM_SINGLE, function() print('\n', wifi.sta.getip()) end)
    end
    Может подскажете.
     

    Вложения:

  17. naz

    naz Нерд

    Если у вас Esp32, то wifi настраивается по- другому. Для Esp8266 у меня такой же wifi.lua, заходит нормально
     
  18. serg3295

    serg3295 Гик

    scfg.ssid и scfg.pwd - тип string.
    Вы кавычки пропустили.
     
    alp69 и naz нравится это.
  19. naz

    naz Нерд

    Настраиваю модуль net, код взят у Игоря, переложил на Esp32:
    Код (C++):
    local function checkNet()
        local servrs = {"www.google.com", "www.ya.ru", "www.yahoo.com", "www.mail.ru"}
        local servNo = 1
        local function isconnect(srv)
            sk = net.createConnection(net.TCP, 0)
            sk:dns(srv, function(conn, ip)
                if (ip == nil) or (ip == "10.0.0.1") then
                    servNo = servNo + 1
                    if servNo <= #servrs then
                        sk = nil
                        isconnect(servrs[servNo])
                    else dat.netmsg = "Dns "..servrs[servNo - 1].." is fail!"
                    end
                    dat.net = nil
                else
                    dat.net = true
                    dat.netmsg = "Got ip: "..ip.." from "..servrs[servNo]
                    sk = nil
                end
            end)
        end
        isconnect(servrs[1])
    end
    local function maintask()
        print('  ------------------------- ')
        co = coroutine.create(function() checkNet() end)
        print('Start checkNet =',coroutine.resume(co))
    ...
    end
    timer = tmr.create()
    timer:alarm(40000,1,function()
        maintask()
    end)
    Стартует нормально, потом происходит потеря сети.. У кого нормально net c Esp32 работает?
    Сейчас так:
    Код (C++):
    Start checkNet =    true
    dat.netmsg =     Got ip: 64.233.165.106 from www.google.com    , dat.net =    true
    Ok: dat.checknet = 0, dat.checkwifi = 0
      -------------------------
    Start checkNet =    true
    dat.netmsg =     Got ip: 64.233.165.106 from www.google.com    , dat.net =    nil
    Not Ok: dat.checknet =    1    dat.checkwifi =    0
      -------------------------
    Start checkNet =    true
    dat.netmsg =     Dns www.mail.ru is fail!    , dat.net =    nil
    Not Ok: dat.checknet =    2    dat.checkwifi =    0
    Возможно, что-то в настройке роутера не так.. Вот лог в момент падения:
    Wed Mar 31 16:39:25 2021 daemon.notice hostapd: wlan0: AP-STA-DISCONNECTED 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:25 2021 daemon.info hostapd: wlan0: STA 24:6f:28:aa:26:ec IEEE 802.11: disassociated
    Wed Mar 31 16:39:26 2021 daemon.info hostapd: wlan0: STA 24:6f:28:aa:26:ec IEEE 802.11: deauthenticated due to inactivity (timer DEAUTH/REMOVE)
    Wed Mar 31 16:39:27 2021 daemon.info hostapd: wlan0: STA 24:6f:28:aa:26:ec IEEE 802.11: authenticated
    Wed Mar 31 16:39:27 2021 daemon.info hostapd: wlan0: STA 24:6f:28:aa:26:ec IEEE 802.11: associated (aid 2)
    Wed Mar 31 16:39:27 2021 daemon.notice hostapd: wlan0: AP-STA-CONNECTED 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info hostapd: wlan0: STA 24:6f:28:aa:26:ec WPA: pairwise key handshake completed (RSN)
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPDISCOVER(br-lan) 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPOFFER(br-lan) 192.168.8.163 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPDISCOVER(br-lan) 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPOFFER(br-lan) 192.168.8.163 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPREQUEST(br-lan) 192.168.8.163 24:6f:28:aa:26:ec
    Wed Mar 31 16:39:27 2021 daemon.info dnsmasq-dhcp[2017]: DHCPACK(br-lan) 192.168.8.163 24:6f:28:aa:26:ec espressif
     
    Последнее редактирование: 31 мар 2021
  20. levae

    levae Нуб

    Куда мне до ESP32, я еще с 8266 намучаюсь.