• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Где ошибка в 10 строках? Lua

Ed007

New member
Всем привет, пытаюсь создать свой скетч .. К рабочему измерителю со2 хочу подцепить 4 светодиода индикации. Но что то идет не так и вместо вывода в консоль уровня на назначенных гпио всё останавливается. Пробовал множество вариантов, в лучшем случае добился в консоли сообщения 1234out: 7 j 0 b и стоп. (Даже не столь важен вывод в консоль - возможно надо было добавить gpio.read, как почему не крутится раз в секунду таймер) Когда добавлял этот блок в рабочий файл, где ppm выводится в консоль постоянно - ничего не изменялось. Если не сложно, дайте совет.
Код:
Init.lua
g=7  --gp13
j=6  --gp12
r=0  --gp16 onlirw
b=4  --gp2 blue onboard
ppm=0 -- уровень со2 от 400 до 2000
gpio.mode(g, gpio.OUTPUT)
gpio.mode(j, gpio.OUTPUT)
gpio.mode(r, gpio.OUTPUT)
gpio.mode(b, gpio.OUTPUT)

function led()
if ppm < 800 then gpio.write(g, gpio.HIGH)
if (ppm - 800) > 0 then gpio.write(j, gpio.HIGH)
if (ppm - 1300) > 0 then gpio.write(r, gpio.HIGH)
if (ppm - 1600) > 0 then gpio.write(b, gpio.HIGH)
          print(" 1234out  : "..g.."..j.."..r.."..b..")
          end
tmr.alarm(1, 1000, 1, function() led() end )
 
Последнее редактирование:

nikolz

Well-known member
Всем привет, пытаюсь создать свой скетч .. К рабочему измерителю со2 хочу подцепить 4 светодиода индикации. Но что то идет не так и вместо вывода в консоль уровня на назначенных гпио всё останавливается. Пробовал множество вариантов, в лучшем случае добился в консоли сообщения 1234out: 7 j 0 b и стоп. (Даже не столь важен вывод в консоль - возможно надо было добавить gpio.read, как почему не крутится раз в секунду таймер) Когда добавлял этот блок в рабочий файл, где ppm выводится в консоль постоянно - ничего не изменялось. Если не сложно, дайте совет.
g=7 --gp13
j=6 --gp12
r=0 --gp16 onlirw
b=4 --gp2 blue onboard
ppm=0 -- уровень со2 от 400 до 2000
gpio.mode(g, gpio_OUTPUT)
gpio.mode(j, gpio_OUTPUT)
gpio.mode(r, gpio_OUTPUT)
gpio.mode(b, gpio_OUTPUT)

function led()
if ppm < 800 then gpio.write(g, gpio.HIGH)
elseif ppm >1600 then gpio.write(b, gpio.HIGH)
elseif ppm >1300 then gpio.write(r, gpio.HIGH)
elseif ppm >=800 then gpio.write(j, gpio.HIGH)
end
print(" 1234out : "..g.."..j.."..r.."..b..")
end
tmr.alarm(1, 1000, 1, function() led() end )
 

Ed007

New member
@nikolz большое спасибо, Ваш скрипт работает. Получается у меня нарушена грамматика if... then.. ? Но я пробовал добавлять else gpio.write(... к каждой строке и все равно таймер стоял. В чем ошибка?
 

nikolz

Well-known member
@nikolz большое спасибо, Ваш скрипт работает. Получается у меня нарушена грамматика if... then.. ? Но я пробовал добавлять else gpio.write(... к каждой строке и все равно таймер стоял. В чем ошибка?
У Вас две ошибки
синтаксис - пропущен end
и логическая (если я правильно понял)
т е у вас ppm >1600 то
b=HIGH
r=HIGH
j=HIGH
----
В моем варианте лишь b=HIGH
============================
если вам надо включить три как у Вас , то поменяйте в моем варианте
if ppm < 800 then gpio.write(g, gpio.HIGH)
elseif ppm >1600 then gpio.write(b, gpio.HIGH)
elseif ppm >1300 then gpio.write(r, gpio.HIGH)
elseif ppm >=800 then gpio.write(j, gpio.HIGH)
end
на ваш в виде:
if ppm < 800 then gpio.write(g, gpio.HIGH) end
if ppm >1600 then gpio.write(b, gpio.HIGH) end
if ppm >1300 then gpio.write(r, gpio.HIGH) end
if ppm >=800 then gpio.write(j, gpio.HIGH) end
 

Юрий Ботов

Moderator
Команда форума
Пардон за то что встреваю в разговор, но ... если всегда gpio.HIGH то все зажжется и никогда (до выключения) не погаснет. Видимо где то надо и gpio.Low ставить? Или это есть в не обсуждаемой здесь части кода?
 

Ed007

New member
@Юрий Ботов приведенный кусочек просто как пример - я пытался понять, где ошибка, почему таймер не молотит. А с логикой горения еще не разбирался - наверное придется добавлять шим. Ну или делать вертикальный линейный индикатор.
@nikolz большое спасибо за помощь!
Видимо проблема неработы была именно в end - я их все посадил в конец программы. С количеством эндов ошибка маловероятна - ноте+ считает)

Нарисовалась еще проблема: как организовать скетчи. Их скопилось уже более 20, в нескольких каталогах. Я в них запутался.
 

nikolz

Well-known member
@Юрий Ботов приведенный кусочек просто как пример - я пытался понять, где ошибка, почему таймер не молотит. А с логикой горения еще не разбирался - наверное придется добавлять шим. Ну или делать вертикальный линейный индикатор.
@nikolz большое спасибо за помощь!
Видимо проблема неработы была именно в end - я их все посадил в конец программы. С количеством эндов ошибка маловероятна - ноте+ считает)

Нарисовалась еще проблема: как организовать скетчи. Их скопилось уже более 20, в нескольких каталогах. Я в них запутался.
Для начала Вы определитесь на чем Вы будете писать
В данных примерах - это луа.
Если в дальнейшем тоже будете все делать на луа, то
1) поищите в соответствующим разделе про nodemcu на этом форуме. Примерно года два назад я писал как я организовывал работу скриптов (так корректнее называть проги на луа)
2) Особенности создания программ в NODEMCU ESP8266 для «интернета вещей»
3) Установите себе SciTe это редактор текста который написан на луа с встроенным отладчиком и транслятором. На нем можно проверять ошибки и отлаживать логику скриптов.
4) Изучите программирование на луа без привязки к ESP и с привязкой на примерах их много.
-------------------------------------------
Если будете писать на дурине скетчи, то изучите дурину и работы со средой программирования на примерах их много.
-----------------------------------------
Если будете писать на СИ, то ставьте UDK (см на форуме) и изучайте СИ и руководство по SDK.
 
Сверху Снизу