NodeMCU - ESPlorer и первый скрипт
Для написания первого скрипта, воспользуемся программой ESPlorer - это удобный, мультиплатформенный инструмент, который позволяет создавать, редактировать, загружать lua-скрипты в один клик.
Поддерживаемые платформы:
- Windows (x86, x86-64)
- Linux (x86, x86-64,ARM soft & hard float)
- Solaris (x86, x86-64)
- Mac OS X (x86, x86-64, PPC, PPC64)
Установка
Для работы программы нужно скачать и установить JAVA (стандартная - SE версии 7 и выше), ну и саму программу, которую можно скачать. Распаковываем архив,для Windows запускаем файл ESPlorer.bat для Linux
sudo java-jar ESPlorer.jar
Внешний вид

По мере развития программы интерфейс видоизменялся и к данному моменту времени выглядит так. Сам интерфейс на английском, но интуитивно понятен. Внешний вид программы можно изменить нажав в меню кнопку "View", тут можно выбрать одну из тем оформления, а также включить или отключить кнопки или панели. При наведении мышки на какой нибудь элемент появится краткая подсказка. Запустив программу, увидим основное окно программы, которое разбито на две части: левая - это редактор кода и правая - это окно терминала. В левой части в верху есть три вкладки - это выбор устройства с которым будет работать, так как программа может работать не только с прошивками на NodeMCU, но и с другими (MicroPython, на базе AT-команд).
По умолчанию выбрана вкладка (NodeMCU & MicroPythone), с ней мы и будем работать. в ней мы видим еще четыре вкладки "Scripts", "Commands", "Snippets" и "Settings".


Во вкладке "Scripts" в с самом верху находится стандартная панель инструментов (создать, открыть, перезагрузка файла, сохранить и т.д), чуть ниже редактор кода с подсветкой синтаксиса, который занимают основную часть вкладки и в самом низу находятся основные кнопки для сохранения (Save to ESP), отправки(Send to ESP), исполнения (Run), и загрузки (Upload...) скриптов в модуль. Вкладка "Commands" пропустим так как почти все ее функции продублированы в левой части программы. Во вкладки "Snippets" можно добавить до 16 фрагментов часто используемого кода для быстрой отправки на исполнения в модуль. Ну и последняя "Settings" это настройки, выбор используемой прошивки, изменения цветовой схемы редактора, настройки serial-порта, ну и в случае проблем с отправкой скриптов в модуль можно "поиграться" с задержками.

В правой же части вверху расположились настройки сом- порта, тут можно выбрать номер порта, его скорость, открыть или закрыть соединение, а так же поблагодарить автора. По середине находится терминала, в правой его части, расположены кнопки для работы с файловой системой модуля где можно отформатировать ее, узнать кол. используемой и оставшейся памяти, отобразить все файлы хранящиеся на ней. Ниже кнопки быстрого вызова фрагментов кода snippet о которых я писал выше и информационные кнопки о количестве оставшейся памяти Heap, общая информация Chip Info, серийный номер чипа Chip ID и флеш памяти Flash ID и кнопка программной перезагрузки модуля Reset. В самом низу командная строка.
Подключение ESP
Подключаем ESP к com-порту (в моем случает это 30 порт), выставляем скорость 115200 и открываем соединение нажав на кнопку Open, если все сделали правильно, то увидим вот такой лог в терминале программы.

На что хотел бы обратить внимание при использовании плат NodeMCU, Wemos D1 и подобных. У них распаяны пины "DTR" и "RTS" это сделано для автоматического перевода модуля в режим прошивки и аппаратного сброса.

Так что имейте это ввиду, когда будете "играться" кнопками DTR или RTS. Если активировать DTR и аппаратно сбросить (нажмете кнопку сброса на плате), то ESP перейдет в режим прошивки и перестанет определяться программой, до тех пор пока вы не отключите ее и не сбросите ESP. Так что на месте разработчика я бы удалил эту кнопку из программы, ну или хотя бы убрал подальше))). Кнопка RTS дублирует (аппаратную) кнопку сброса на плате модуле, при активации ее, на порт RESET будет подан логический ноль, что приведет к сбросу ESP, а при отключении, вернет состояние обратно. Очень удобно при отладки кода, так как не нужно каждый раз тянуться к кнопки сброса на модуле.
Первый скрипт
После того как удачно подключились к модулю, переходим в левую часть программа и в редакторе кода пишем такую строку.
print("Hello, world!!!")
функция print() выводит информацию в окно терминала.
Далее в нижней части нажимаем на кнопку Send to ESP и в окне терминала увидим вот такой ответ.
NodeMCU custom build by frightanic.com
branch: master
commit: b62fae918b3627209fe434950cffb2506cee9a31
SSL: false
modules: adc,bit,crypto,file,gpio,http,i2c,mqtt,net,node,rtctime,sjson,sntp,spi,tmr,uart,wifi,ws2801,ws2812
build built on: 2017-08-12 14:31
powered by Lua 5.1.4 on SDK 2.1.0(116b762)
lua: cannot open init.lua
> print("Hello, world!!!")
Hello, world!!!
Теперь давайте разбираться, в окне терминала появились две строчки, первая с знаком ">" в начале - это строка нашего кода, которая была отправлена на исполнения в модуль, а вторая это ответ от модуля.
> print("Hello, world!!!")
Hello, world!!!
Кнопкой Send to ESP мы отправляем код на исполнения в модуль ESP, но для того чтобы наш код (скрипт) сохранился в файловой системе модуля, нужно дать ему имя и сохранить его. Для этого в верхней части программы наживаем на иконку в виде дискеты с надписью Save, в появившимся окне выбираем путь, куда будет сохранен файл и задаем имя нашему скрипту. По умолчанию программа присвоит имя "script1.lua", меняем его на "first_script.lua" и сохраняем. Теперь мы можем нажать на кнопку Save to ESP и наш файл будет записан в файловую систему.
В окне терминала увидим такой лог.
> file.remove("first_script.lua");
> file.open("first_script.lua","w+");
> w = file.writeline
> w([==[print("Hello, world!!!")]==]);
> file.close();
> dofile("first_script.lua");
Hello, world!!!
Программа записала наш скрипт в файловую систему и автоматом запустила его. Поэтому мы увидели в конце строки Hello, world!!!
Создайте новый файл, нажав на иконку в виде чистого листа и напишите в редакторе строчку.
dofile("first_script.lua")
функция dofile() запустить скрипт из файловой системы.
Теперь отправим скрип на исполнения кнопкой "Send to ESP". Мы увидим, что наш скрипт "first_script.lua" выполнился, а в окне терминала получим такой ответ.
> dofile("first_script.lua")
Hello, world!!!
Для того чтобы скрипт автоматически запускался при включении модуля, сохраним его, но только назовем его init.lua и запишем в модуль. Дело в том, что при запуске или перезагрузке модуля, NodeMCU проверяет наличия файл init.lua в файловой системе и если он есть, запускает его. Таким образом мы можем заставить запускаться наш скрипт автоматически.
Перезагрузим модуль и теперь в место ошибки lua: cannot open init.lua, увидим Hello, world!!!
NodeMCU custom build by frightanic.com
branch: master
commit: b62fae918b3627209fe434950cffb2506cee9a31
SSL: false
modules: adc,bit,crypto,file,gpio,http,i2c,mqtt,net,node,rtctime,sjson,sntp,spi,tmr,uart,wifi,ws2801,ws2812
build built on: 2017-08-12 14:31
powered by Lua 5.1.4 on SDK 2.1.0(116b762)
Hello, world!!!
>
Давайте разбираться, на файловой системе находится два файла init.lua и first_script.lua. При запуске, модуль автоматически запускает init.lua, а он в свою очередь, запускает first_script.lua и скрипт исполняет команду вывода Hello, world!!! в окно терминала. Конечно если проект не большой, то можно весь код записать init.lua и он автоматически выполнился при старте, но когда проект объемный и кода много, то лучше разбить его на отдельные скрипты и в init.lua вызывать их.
Если допустить критическую ошибку, то с большой вероятностью, получим циклический "ребут" (неприятная особенность NodeMCU) При отладки кода, запускайте скрипты в ручную и только после того как ваш код будет отлажен, добавляем его в init.lua.
Можно сделать 5-и секундную задержку в init.lua, чтобы скрипт запускался не сразу, этого времени будет достаточно, чтобы исправить ошибку или удалить скрипт.
mytimer = tmr.create() -- Создаем таймер
print("Wait... 5s");
mytimer:register(5000, tmr.ALARM\_SINGLE, function (t) -- таймер выполниться один раз через 5 сек
print("Start");
dofile("first_script.lua") --Запуск нашего скрипта
t:unregister()
end)
mytimer:start() -- стартуем таймер
Сохраним код в скрипте init.lua и перезагрузим устройство, в окне терминала увидим такой лог.
NodeMCU custom build by frightanic.com
branch: master
commit: b62fae918b3627209fe434950cffb2506cee9a31
SSL: false
modules: adc,bit,crypto,file,gpio,http,i2c,mqtt,net,node,rtctime,sjson,sntp,spi,tmr,uart,wifi,ws2801,ws2812
build built on: 2017-08-12 14:31
powered by Lua 5.1.4 on SDK 2.1.0(116b762)
Wait... 5s
> Start
Hello, world!!!
На этом пока все, подробную документацию на NodeMCU можно прочитать. https://nodemcu.readthedocs.io
