Для защиты от бутлупов и зависов сразу после старта системы (а то не один раз из-за этого приходилось NodeMCU перепрошивать) я одно время использовал паузу в 5 секунд в init.lua перед стартом остального кода. Этого времени хватает, чтобы, если возникли проблемы, успеть грохнуть init.lua через терминал.
Сейчас сделал лучше. Система теперь после старта считывает файлик, инкрементирует число в нём и записывает. Если результат становится более трёх — вываливаемся, ничего не делая. Иначе ставим таймер, по которому через несколько секунд файл удаляем, а систему тем временем грузим дальше.
Получается, что при обычной загрузке задержки нет вообще, а для аварийного сброса нужно нажать трижды reset за короткий период времени.
local count = 0
local pin = 4 -- D1-mini LED
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.LOW)
if file.open("fail-counter.txt") then
count = tonumber(file.read())
if count == nil then
count = 0
end
file.close()
end
if count >= 2 then
print("Emergency stop")
file.remove("fail-counter.txt")
return
end
print("Fail proof check: ", count)
file.remove("fail-counter.txt")
file.open("fail-counter.txt","w+")
file.writeline(count+1)
file.close();
if not tmr.create():alarm(3000, tmr.ALARM_SINGLE, function()
file.remove("fail-counter.txt")
print("Fail proof check passed")
end)
then
print("Can't start timer")
return
end
gpio.write(pin, gpio.HIGH)
dofile('main.lua')
- Если всё нормально, то
init.lua
грузит
main.lua
, в котором уже и хранится основной инициализирующий код.
- Если трижды быстро (в течении трёх секунд после запуска) нажать reset, то ничего не делаем. Кстати, надо доделать, поставить опционально загрузку
ide.lua
и тогда можно будет контроллер и к компу не цеплять — трижды reset и грузится удалённый редактор.
- Важно не нажимать очень-очень быстро, а то дело даже не дойдёт до чтения кода. Скрипт на время готовность нажатия reset зажигает светодиод. Период нажатия — от ~0.5 до 3 секунд после старта.