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

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

  1. Allex

    Allex Нуб

    Скажите как избавится от ошибки
    malformed number near '27.4'

    Как Lua воспринимает float ?
     
  2. ИгорьК

    ИгорьК Гуру

    Float воспринимает нормально, если залита прошивка, его поддерживающая.

    malformed number near '27.4' - это скорее всего выкрутасы ESPlorer, который шлет на модуль дополнительные скрытые данные. Бывает у него такой глюк.
    Проверьте тот же код через ESPCut. Он в целом такой же как и ESPlorer, но ЧУТЬ менее удобный.

    espcut.com

    Возможно (никогда не проверял!!!) так реагирует на float прошивка, его не поддерживающая. Хотя сомневаюсь. Уберите дробную часть, посмотрите. Если все будет нормально, значит надо менять прошивку на соответствующую.
     
    Последнее редактирование: 14 янв 2019
    Allex нравится это.
  3. Allex

    Allex Нуб

    Спасибо, попробовал версию ESPCut 0.78, к сожалению такая же ошибка. Видимо нужно более ранний софт использовать (пользуюсь ESPlorer 0.2.0)
     
  4. ИгорьК

    ИгорьК Гуру

    Извините, не понял.
     
  5. ИгорьК

    ИгорьК Гуру

    Напишите и выполните следующее:
    Код (C++):
    print(2.2/2)
    Что будет?
     
  6. Allex

    Allex Нуб

    malformed number near '2.2'
     
  7. ИгорьК

    ИгорьК Гуру

    ну а
    Код (C++):
    print(4/2)
     
  8. ИгорьК

    ИгорьК Гуру

    еще вариант
    Код (Lua):
    print(tonumber(3.3))
     
  9. Allex

    Allex Нуб

    так же, у Вас все нормально воспринимает?
     
  10. Allex

    Allex Нуб

    может какой то модуль не включил?
    crypto,file,gpio,mqtt,net,node,sjson,tmr,uart,wifi
     
  11. ИгорьК

    ИгорьК Гуру

    Обновите Java и скачайте последнюю версию ESPLorer. Начните с этого.
     
    Allex нравится это.
  12. SergeyT-ff

    SergeyT-ff Нуб

    Итак, код маленького сервера, когда память перестает течь:
    Кажется у меня что-то пошло не по плану с утечкой памяти в этом сервере.
    При отправке следующей страницы:
    Код (HTML5):
    <!DOCTYPE HTML>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>ESP8266 Smarthome web interface v0.2</title>
    </head>
    <body>
      <p align="center">Температура в доме: $temp</p>
      <p align="center">Датчик открытия двери: $door</p>
      <p align="center">Датчик открытия окон: $windows</p>
      <p align="center">Датчик утечки газа: $gas</p>
      <p align="center">Датчик протечки: $leakage</p>
      <p align="center">Датчик дыма: $smoke</p>
      <p align="center">Влажность в доме: $humi</p>
      <p align="center">Установить выключатели: $temp</p>
      <form action="/handler.php">
       <table align="center">
          <tr>
            <td><p align="center"><b>Свет1</b></p>
            <p><input name="light1" type="radio" value="on"> Включен</p>
            <p><input name="light1" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет2</b></p>
            <p><input name="light2" type="radio" value="on"> Включен</p>
            <p><input name="light2" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет3</b></p>
            <p><input name="light3" type="radio" value="on"> Включен</p>
            <p><input name="light3" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет4</b></p>
            <p><input name="light4" type="radio" value="on"> Включен</p>
            <p><input name="light4" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет5</b></p>
            <p><input name="light5" type="radio" value="on"> Включен</p>
            <p><input name="light5" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет6</b></p>
            <p><input name="light6" type="radio" value="on"> Включен</p>
            <p><input name="light6" type="radio" checked="checked" value="off"> Выключен</p></td>
          </tr>
          <tr>
            <td><p align="center"><b>Свет7</b></p>
            <p><input name="light7" type="radio" value="on"> Включен</p>
            <p><input name="light7" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет8</b></p>
            <p><input name="light8" type="radio" value="on"> Включен</p>
            <p><input name="light8" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет9</b></p>
            <p><input name="light9" type="radio" value="on"> Включен</p>
            <p><input name="light9" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет10</b></p>
            <p><input name="light10" type="radio" value="on"> Включен</p>
            <p><input name="light10" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет11</b></p>
            <p><input name="light11" type="radio" value="on"> Включен</p>
            <p><input name="light11" type="radio" checked="checked" value="off"> Выключен</p></td>
            <td><p align="center"><b>Свет12</b></p>
            <p><input name="light12" type="radio" value="on"> Включен</p>
            <p><input name="light12" type="radio" checked="checked" value="off"> Выключен</p></td>
          </tr>
        </table>
        <p align="center"><input type="submit"> <input type="reset"></p>
      </form>
      <div><p align="center"><b>Погода сегодня</b></p>
            <p align="center"><a href="https://clck.yandex.ru/redir/dtype=stred/pid=7/cid=1228/*https://yandex.ru/pogoda/22"
           target="_blank"><img src="https://info.weather.yandex.net/22/2_white.ru.png?domain=ru" border="0" alt="Яндекс.Погода"/>
            <img width="1" height="1" src="https://clck.yandex.ru/click/dtype=stred/pid=7/cid=1227/*https://img.yandex.ru/i/pix.gif" alt="" border="0"/></a>
            <a href="http://www.nepogoda.ru/russia/kaliningrad/" title="Погода в городе Калининград">
            <img src="http://inf.nepogoda.ru/c/8/418/101.png" alt="Прогноз погоды в городе Калининград" width=200 height=100 border=0></a>
            </p></div>
    </body>
    </html>
    находящейся в файле page.lua, получаю ошибку:
    35104
    <p><input name="light10" type="radio" value="on"> Включен</p>

    35072
    35072
    <p><input name="light10" type="radio" checked="checked" value="off"> Выключен</p></td>

    35048
    PANIC: unprotected error in call to Lua API (server.lua:28: out of memory)

    Код сервера:
    Код (C++):
    do
    local function expand (s)
        return (string.gsub(s, "$(%w+)", dat))
    end
    srv = net.createServer(net.TCP, 15)
    local function receiver(sck, data)
         local tg, val
        tg, val = string.match(data,"?(%a+)=(%d+%.*%d*)")
        print(tg, val)
        if val == 'light1' and tg == 'target' then
            print('light1 = '..val)
        end
        data = nil
        local function closec()
            sck:close()
            sck = nil
            closec = nil
        end
        local function send()
            if file.open("page.lua", "r") then
                repeat
                    print(node.heap())
                    local line = file.readline()
                    if line then
                        line = expand(line)
                        print(line)
                        print(node.heap())
                        sck:send(line)
                    end
                until line == nil
                file.close()
                file = nil
                line = nil
            else
              sck:close()
              sck = nil
            end
            print('on sent:', node.heap())
        end
        sck:on("sent", closec)
        send()
    end
    srv:listen(80, function(conn)
      conn:on("receive", receiver)
    end)
    tmr.create():alarm(30000, 1, function() print(node.heap()) end)
    print(node.heap())
    end
     
    Не могу понять куда так резко могла подеваться вся память?
     
  13. ИгорьК

    ИгорьК Гуру

    Смотрите:

    upload_2019-1-18_10-23-25.png

    Код память не губит. Она практически не изменяется.

    Тем не менее, падение идет на строке 28:
    Код (Lua):
    sck:send(line)
    Интерпретатор не в сосотянии отправить очередную строку.

    Можно предположить, что там, "в недрах" Lua существуют свои разборки, с которыми интерпретатор не справляется.
    Это ошибка реализации разработчиком, а не ваша.

    Еще вариант - какая-то строка просто не влазит в буфер модуля, который отведен системой для этих целей.

    Что же можно попробовать сделать.

    1. "Порубите" строки своей странички на части - на несколько строк.

    2. Выкиньте все ненужное - print, node.heap() etc.
    Они уже отработали свое - программа написана верно, больше ее проверять смысла нет.

    3. Более грустная вещь. Если пункты 1 и 2 не помогут, значит надо пробовать дать дополнительное время системе на самоочистку.

    Код (Lua):
    repeat
        print(node.heap())
        local line = file.readline()
        if line then
            line = expand(line)
            print(line)
            print(node.heap())
            sck:send(line)
        end
    until line == nil
    repeat - until цикл придется рушить, и менять его на нечто, что будет иметь таймер и "выпускать" код за своим пределы.
    Таймер должен через время, в пределах 15-35 мс выдавать клиенту по строчке. Полагаю, этого хватит чтобы "протащить" через себя любой файл.
     
    Последнее редактирование: 18 янв 2019
  14. Здравствуйте! Попробовал завести модуль в сеть.
    Вот что получилось.
    Подскажите, где ошибка? Scrin.PNG
     
  15. ИгорьК

    ИгорьК Гуру

    Как и чем вы прошивали модуль.
    Покажите скриншот перезагрузки модуля.

    upload_2019-1-21_9-45-58.png
     
    Последнее редактирование: 21 янв 2019
  16. Прошивал модуль ESP8266Flasher (NodeMCU firmware programmer)
    Скорость поставил такую, потому что на самом модуле написана эта скорость
    После прошивки отключил и включил модуль. Индиктаор на модуле начал быстро мигать(точнее- мерцать) 1.PNG 2.PNG 3.PNG 5_2.PNG
     
  17. Еще какая-то непонятка с портами.
    С разными прогами модуль общается или на COM3 или на COM13
     
  18. ИгорьК

    ИгорьК Гуру

    Что за модуль?
     
  19. ИгорьК

    ИгорьК Гуру

    Меня интересует скриншот ESPlorer, когда делается железная (кнопкой) перезагрузка модуля.
    Полагаю, вы накатили прошивку SDK 2.2.1 на старый загрузочный файл.
    В зависимости от типа модуля, вам надо будет подгрузить еще один файлик. Его место определяется размером памяти модуля.

    Вам бы почитать тему http://forum.amperka.ru/threads/esp-8266-esp32-как-залить-прошивку-невзирая-на-мнение-модуля.13616/
     
  20. NodeMCU V3 (LoLin)