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

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

  1. serg3295

    serg3295 Гуру

    Если будете пробовать ещё curl запускать в PowerShell, то учтите - у них там вроде войнушки windows с curl'ом. Поэтому в cmd работает команда
    curl что-то там,
    а вот в powershell для запуска "правильной" curl только
    curl.exe что-то там
     
    Последнее редактирование: 12 окт 2020
    swc и ИгорьК нравится это.
  2. swc

    swc Гик

    Отличная серия статей по LFS и автоматизации. Как раз то, чего не хватало.
    Придется перелопатить код приложений под новые изменения.
    Мой bat-файл выглядит так:
    Код (C++):
    echo Y|del out_img\LFS_UI.img
    luac.cross -o out_img/LFS_UI.img -f -m 0x40000 -l in_files/*.* > out_img/log.log
    pause
    Удаление старого образа и остановка по паузе помогает понять, успешна ли компиляция.
    Полезно при отладке.
    Запускается по F9. В ярлыке достаточно вписать горячую клавишу.

    По компилятору. Собирал его в мае через Ubuntu - размер: 252 kb
    Cкачанный по ссылке имеет размер: 1 841 kb.

    Видимо внесены крутые изменения. Ждем 5.3.
     
    Последнее редактирование: 13 окт 2020
    serg3295 и ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Эх, то ли я делаю что не так, то ли объёмы у меня не те - ни одного проекта с LFS.
    Но вот уже VSCode установил, прогресс :)

    Кстати, если в vscode в терминале набрать nodemcu-tool -port upload и потянуть мышкой необходимый файл(ы) то путь к нему с названием записывается аргументом. Это привело меня в детский восторг :)
     
    Последнее редактирование: 13 окт 2020
    serg3295 и SergeiL нравится это.
  4. serg3295

    serg3295 Гуру

    Очень хорошее замечание! Поправил скрипт auto.ps1. Теперь стирает lfs.img и, если всё хорошо, то выгружает новый img. Иначе ругается в терминале желтеньким сообщением. То есть, вместо паузы останавливаемся в терминале и смотрим в каталог .output.

    Можно просто представить, что LFS - это как исходная прошивка. Залил туда всего один раз ftp, или http сервер, и в общем то всё. Дальше файлы как обычно складывать на spiffs. Они всё равно имеют приоритет при загрузке перед такими же, лежащими в LFS.
    Мне FTP сервер понравился. Загрузка просто моментальная, и прогресс бар прикольными решёточками :). После прогона init.lua через диету вообще незаметно, что в памяти что-то есть. Написал в ftpserver.lua ещё отдельно команду сброса ESP и запуска файла для удобства отладки. Теперь думаю как бы отладочную информацию с print гнать не в COM порт. Но, боюсь ftp тут уже не поможет.
     

    Вложения:

    • auto.zip
      Размер файла:
      540 байт
      Просмотров:
      294
    Последнее редактирование: 14 окт 2020
    ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Ну ужо я вас вопросами закидаю от имени уборщицы тёти Сони как руки дойдут до повторения...

    Мне вполне хватало Sublime + ESPlorer. Причём последний имеет как плюсы, так и недостатки. Из плюсов - удобная отладка в диалоге. Из минусов в Win10 - нестабильность по ряду действий вплоть до невозможности.

    Понимаю, что LFS надо осваивать, иначе отстаёшь, но я диайвайщик - приоритет дела над теорией, коей LFS для меня остаётся, ибо не "упирался".

    Единственный проект, где возникли сложности, - часы. Там завес mqtt пересекается с http запросами к серверам и запросами серверов времени. Там пришлось покумекать и неоднократно переписать код, что зело полезно.

    В общем, ваши записки буду изучать как полный нуб.

    Что сразу скажу. Мелкие недочёты губят хорошее дело. Где взять сейчас luacross и откуда вы устанавливали lua на комп - информация для нуба непостижимая. (Я с Lua развлекаюсь в среде ZeroBrain Studio).
    Помню, что в предыдущих заметках об этом сказано. Но это я помню, а вновь прибывший будет считать это шарадой.
     
    swc и serg3295 нравится это.
  6. serg3295

    serg3295 Гуру

    Да, вы абсолютно правы. Я давно всё это устанавливал, поэтому упустил при описании процесса. Кое что просто забыл, где брал. Попозже попробую на чистой машине установить всё заново и написать недостающую информацию.
    Пока, вкратце, lua.cross берём здесь.
    Запустил telnet сервер в старте в дополнение к ftp серверу. Теперь вывод print'a выводится в окошко телнета на компьютере. То есть от COM порта отвязались. В сочетании с Total Conmmander'ом для редактирования файлов notepad++ и манипуляции файлами, получилось очень даже ничего экосистема...
    Исправленный проект потестирую получше, и выложу с описанием.
     
    swc и ИгорьК нравится это.
  7. swc

    swc Гик

    Собранный мною luacross здесь: https://drive.google.com/file/d/1ZnuOXdt9t_FD1f8TH9YzzbchZqRFRYK6/view
    с github: здесь: https://github.com/nodemcu/nodemcu-firmware/releases (ссылка от ioex #1058)
    Компилируют одинаково. Последний дает на 80 байт больше при 60 kb выходного кода *.img.
     
    serg3295 и ИгорьК нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Маленький лайфхак. Еще в init.lua делаю такую конструкцию:
    Код (Lua):
    prt = function (...)
        if dbug then print(...) end
        -- по факту
        -- if dat.dbug then print(...) end
        -- потому что все глобальные переменные храню в одной таблице dat  
    end
    И далее везде prt() вместо print()

    Если работаю с отдельным чанком, то в начале пишу:
    Код (Lua):
    if not prt then prt = print end
     
    Последнее редактирование: 14 окт 2020
    swc и serg3295 нравится это.
  9. ИгорьК

    ИгорьК Гуру

    Lua for Windows: https://github.com/rjpcomputing/luaforwindows/releases

    И маленький прикол:

    upload_2020-10-14_9-40-23.png

    Немало поудивлялся расширению Project Manager: на первом компьютере, где его установил, значок расширения не появился картинкой, а лишь "по факту". Поломал голову. Так его и нет - просто нажимаю на это место мышкой и все работает.
     
    Последнее редактирование: 14 окт 2020
    swc и serg3295 нравится это.
  10. serg3295

    serg3295 Гуру

    ИгорьК, спасибо за ссылку. Установлю оттуда.
    Про Project Manager. У меня такого не встречалось ни на одной из трёх машин с win10. Видимо глюк автора дополнения. Попробуйте набрать Ctrl+Shift+P далее icon theme -> preferences: file icon theme. И там повыбирать из нескольких вариантов. Может это поможет. И проверьте наличие галочки
    PM1.jpg
    ещё можно поставить расширение vscode-icons и активировать его через icon theme.
    Будут везде очень красивые значки :)

    И ещё, хорошая статья для начала работы с VS Code
     
    Последнее редактирование: 14 окт 2020
    swc и ИгорьК нравится это.
  11. serg3295

    serg3295 Гуру

    Дополнение к посту про VSCode & FTP

    Для вывода отладочной информации через print будем использовать телнет.
    Подключение Телнета, возможно, имеет смысл тогда, когда устройство переехало на шкаф, или в колодец. Там через Тотал коммандер и notepad++ немножко правим файлы и чуть-чуть доотлаживаемся. В противном случае достаточно запустить только FTP сервер, так как это даёт скорость загрузки файлов и стандартно отлаживаться через Esplorer по COM'у.
    Для вывода отладочной печати по телнету необходимо установить какого-либо клиента телнет. Например, PuTTY.
    Настройки телнета в PuTTY (ну совсем для новичков)
    PuTTY -> Session -> Host Name (or IP address) = 192.168.адрес вашей ESP
    PuTTY -> Session -> Port = 2323
    PuTTY -> Session -> Connection type = Telnet
    PuTTY -> Terminal -> Implicit CR in every LF = поставить галочку (не забудьте поставить!)
    PuTTY -> Session -> Saved Session = придумайте_ваше_название -> Save -> Open

    Особенность. После рестарта telnet сервера надо переконнекчиваться putty, иначе вывод снова пойдёт на стандартный stout (в COM).

    в аттаче новая версия проекта. В нём -
    Изменены файлы auto.ps1, tasks.json, ftpserver.lua а именно:
    • Добавлена возможность операций с файлами в подкаталогах
    • исправлены ошибки в файле auto.ps1
    • добавлена проверка факта компиляции перед операцией с файлом
    • переделан файл tasks.json для поддержки новых команд FTP
    • в файл ftpserver.lua добавлены новые команды
    1. RUN <имя_файла>
    2. LFS - flashreload & restart
    3. RST - теперь просто рестартует ESP (node.restart())
    в файле startsrvs.lua заменяем на свои данные wifi сети в строчке
    tlnt open('ssid', 'pass', 2323)

    в каталоге /src лежат исходники. В каталоге верхнего уровня исходники, пропущенные через LuaSrcDiet. Из них и собираем LFS для уменьшения занимаемого места. init.lua тоже прогоняем через диету и кладём на spiffs.

    Для проверки работоспособности системы выкладываем на spiffs файл src/test.lua, запускаем PuTTY, выполняем test.lua. Если всё хорошо, то видим напечатанные сообщения в окне PuTTY. Если они лесенкой - снова читаем про настройки PuTTY.

    @ИгорьК , Установил zero brain. Интересная вещь. Особенно понравилось обилие примеров.
    А они денег просят просто так, или ограничение по функциональности какое-либо будет, если денег не дам?
     

    Вложения:

    Последнее редактирование: 14 окт 2020
    ИгорьК и swc нравится это.
  12. swc

    swc Гик

    По идее LuaSrcDiet для компиляции в LFS рояли не играет. Для *.lc файлов - может быть, хотя разницы не заметил.
     
    serg3295 нравится это.
  13. serg3295

    serg3295 Гуру

    Да, вы правы! Это я ввёл в заблуждение. Разницы практически нет. На примере проекта FTPandTelnet:
    Код (C++):
    не пожатые
    lfs_base = 0x07c000, lfs_mapped = 0x4027c000, lfs_size = 0x010000, lfs_used = 0x007f1c }
    пожатые диетой
    lfs_base = 0x07c000, lfs_mapped = 0x4027c000, lfs_size = 0x010000, lfs_used = 0x007ef8 }

    Да, и для .lc тоже без разницы

    ftpserver.lс  13788 байт
    ftpserverDIET.lс  13735 байт
     
    Тем лучше, сжимать для LFS не надо, одной операцией меньше. :)
     
    Последнее редактирование: 14 окт 2020
    ИгорьК и swc нравится это.
  14. serg3295

    serg3295 Гуру

    VS Code & Lua
    Prerequisites.


    Для успешной работы системы автоматизации работы с Lua на базе VSCode необходимо установить и настроить несколько дополнительных программ.
    Цель данного поста – уточнить некоторые особенности при установке этого пакета программ на машину «с нуля». При этом вещи, подробно описанные в других источниках, я повторять не буду. Установка проводилась на Windows 10 и Windows 7 максимальная.
    Перед началом работы убедитесь, что у вас есть права администратора на данной машине.

    1. Устанавливаем Node.js LTS Windows Installer
    2. Из командной строки cmd под администратором устанавливаем утилиту nodemcu-tool командой

    npm install nodemcu-tool -g

    Для подхватывания новых путей закройте cmd и снова зайдите в неё. Проверьте правильность установки, набрав

    nodemcu-tool

    Если после установки не удаётся вызвать nodemcu-tool из любого каталога, то перезагрузитесь.

    3. Устанавливаем Lua for Windows
    Для этого скачиваем и запускаем LuaForWindows_v5.1.5-52.exe
    При установке можно сбросить галочку ScriptEditor, так как мы будем использовать VS Code. Каталог установки
    c:\Program Files (x86)\Lua\5.1\ оставляем по умолчанию.

    4. Устанавливаем Luacross
    • Берём файл Luacross отсюда . Этот файл может быть разным для разных версий NodeMCU, поэтому надо следить, чтобы они соответствовали.
    • Переименовываем его в luac.cross.exe и кладём в c:\Program Files (x86)\Lua\5.1\
    • Запускаем cmd, находясь в каталоге c:\Program Files (x86)\Lua\5.1\. Проверяем правильность установки, набрав
    luac.cross

    5. Устанавливаем LuaSrcDiet
    Для этого из командной строки cmd в каталоге c:\Program Files (x86)\Lua\5.1\ выполняем команду

    luarocks install luasrcdiet

    6. Разрешаем запуск скриптов PowerShell
    Для этого запускаем Windows PowerShell с правами администратора и выполняем команду:

    Set-ExecutionPolicy Unrestricted

    Подтверждаем своё согласие, набрав большую букву А (в случае Windows 7 - букву Y)

    Для проверки создаём файл t.ps1 командой

    echo 'write-host("OK")' >> t.ps1

    и запускаем его на исполнение

    ./t.ps1

    7. Устанавливаем VSCode
    Затем устанавливаем необходимый вам набор расширений. Различные расширения были описаны ранее, начиная отсюда.

    Берём из аттача hello.zip - пример простого проекта, в котором в каталоге .vscode лежат уже все последние версии скриптов. Далее, для примера, положим распакованную папку hello в каталог C:\Users\ИМЯ\Documents\Lua\nodeMCU\hello
    Вы можете раскладывать проекты по любым своим каталогам, это только для примера. Открываем папку проекта.
    Ctrl+K Ctrl+O -> hello

    Настройки VS Code
    1. Вызвать терминал нажатием Ctrl+`. В появившемся внизу окне терминала в выпадающем списке выбрать оболочку по умолчанию - Windows PowerShell. Закрываем терминал.
    2. Настроим вызов задач.

    Задачи можно вызвать из меню Terminal -> RunTask (Терминал -> Запуск задачи). Или назначить ‘горячую клавишу’ на вызов этой функции.
    Если у вас установлено и включено расширение PlatformIO IDE, то на запуск задач уже настроена комбинация клавиш Ctrl+Alt+T. Вы можете оставить эту комбинацию клавиш для быстрого запуска задачи, либо переназначить её на более удобную вам комбинацию. При этом позаботьтесь о том, чтобы не было конфликтов с уже использующимися клавишами. Если PlatformIO нет, или оно выключено, то назначаем свою комбинацию.
    Для этого внесём изменения в файл keybindings.json. Жмём Ctrl+K Ctrl+S, открываем KeyboardShortcutsFile (в правом верхнем углу иконка «Открыть сочетания клавиш (JSON)») и добавляем внутрь квадратных скобок нужные комбинации клавиш.
    Код (C++):
     {
      "key": "Ctrl+Alt+T",
      "command": "workbench.action.tasks.runTask",
      "args": ""
      }
     
    Если вы захотите перенести свои глобальные настройки VS Code с однажды полностью настроенной машины на другую, то VS Code предоставляет мощные средства для синхронизации настроек для команды программистов в масштабах Вселенной. Я с этим механизмом так и не разобрался, поэтому просто копирую файлы
    keybindings.json и settings.json, из каталога c:\Users\ИМЯ\AppData\Roaming\Code\User\ в этот же каталог на другой машине.

    На этом основные действия по вводу экосистемы автоматизации в эксплуатацию можно считать законченными.
     

    Вложения:

    • hello.zip
      Размер файла:
      3,8 КБ
      Просмотров:
      245
    ИгорьК нравится это.
  15. serg3295

    serg3295 Гуру

    Теперь отдельно, вне рамок инструкции, пара слов по настройке расширения lua-language-server. Там есть параметр "Lua.workspace.library” Если прописать сразу в User в нём свой путь к библиотекам, например
    Код (C++):
    "Lua.workspace.library": {
      "c:/Users/ИМЯ/Documents/Lua/Lib/": true
    }
    То туда можно сложить определения внешних функций nodeMCU. То есть, делаем какой-нибудь файл nodemcu.lua, туда пишем что-то вроде
    tmr = function() end – ну, и все остальные...

    И глобальные неопределённые переменные становятся определёнными. То есть уходим от дублирования функций nodemcu в каждом workspace в "Lua.diagnostics.globals"
    Если ещё разобраться с EmmyLuaAnnotation, то, наверное, можно будет эти функции как-то более полезно описать. Как-нибудь так:
    Код (C++):
    --***********************************--
    node = {}

    --***********************************--
    file = {}

    ---@param filename string | '""'
    ---@return boolean
    function file.exists(filename) end

    ---@param filename string | '""'
    ---@param mode string | '"r"' | '"w"' | '"a"' | '"r+"' | '"w+"' | '"a+"'
    ---@return boolean | any
    function file.open(filename, mode) end

    ---@param oldname string | '""'
    ---@param newname string | '""'
    ---@return boolean
    function file.rename(oldname, newname) end

    --***********************************--
    mqtt = {}

    ---@alias Handler fun(client: any, topic: string, message: string)
    ---@alias IOEventEnum string | '"connect"'| '"connfail"' | '"suback"'
    ---@param event IOEventEnum
    ---@param handler Handler | " function(client, topic)"
    function mqtt:on(event, handler) end

    -- вот только с tObj из tmr не всё так просто
     
    Кстати, этот метод относится и к своим библиотечным функциям, только их при компиляции надо будет отдельно цеплять, так как они в другом каталоге.
     
    Последнее редактирование: 17 окт 2020
    ИгорьК нравится это.
  16. ИгорьК

    ИгорьК Гуру

    +100500 - коротко и ясно. Отлично повторяемо!
     
    serg3295 нравится это.
  17. NoteBook

    NoteBook Нуб

    На ESP-8266 хотел сделать управление освещением кукольного домика со смартфона. На сайте несколько кнопок и движок для регулировки яркости. Самим освещением управляет другой контроллер, на него данные поступают по SPI или I2C с ESP-8266.

    Читал форум читал про утечки памяти и дочитался до этого: «Если вы пытаетесь внедрить пользовательский интерфейс или веб-сервер HTTP в свой ESP8266, то вы действительно злоупотребляете его предполагаемым назначением. Когда дело доходит до определения масштабов ваших приложений ESP8266, действительно применима поговорка Keep It Simple Stupid». Так, что мне сразу к ардуринщикам? В LUA серверы не прокатывают?
     
  18. ИгорьК

    ИгорьК Гуру

    Да.
     
  19. NoteBook

    NoteBook Нуб

    А подробней можно? Где слабое место у сервера на ESP-8266? Тут еще пишут, что при использовании LFS, приведенная мною цитата уже не актуальна.
     
  20. ИгорьК

    ИгорьК Гуру

    Подробно: берете и делаете. Что не получается - спрашиваете. Для абстракций есть флудилка.