Друзья. Только начинаю осваивать Lua и делаю первые шаги. Цель: сделать трекер солнечных панелей. Покритикуйте пожалуйста первые шаги в программировании. Код (Lua): Gsm = false -- событие для координаты по гор. от GSM Btn = false -- событие для координаты по гор. от кнопки Tbl = true h = 1 -- координата по горизонту из таблицы hEnc = 4 -- энкодер по горизонту -- hBtnNeg = false -- кнопка "минус по горизонтали" -- hBtnPos = false -- кнопка "плюс по горизонтали" -- hRelayNeg = false -- реле "минус по горизонтали" -- hRelayPos = false -- реле "минус по горизонтали" -- beep = false -- включается одинойчный звук -- dblBeep = false -- включается двойной звук выполнения if Gsm == true then Btn = false Tbl = false elseif hBtnNeg == true or hBtnPos == true then Gsm = false Tbl = false -- если нажата хоть одна кнопка (hBtnNeg или hBtnPos) не реагировать на сигналы от GSM или таблицы while hBtnNeg == true do -- пока нажата кнопка hBtnNeg local hBtnPos = false -- блокируется кнопка hBtnPos local beep = true -- включается звук Beep repeat local hRelayNeg = true -- активируется реле hRelayNeg print (hEnc, 'hBtnNeg pressed') -- печать текущего значения hEnc и "hBtnNeg pressed" until hEnc == 0 -- до момента пока hEnc == 0 if hBtnNeg == true and hEnc == 0 then -- если нажата hBtnNeg и hEnc == 0 dblBeep = true -- включается двойной звук выполнения print ('horizont homed') end end elseif Tbl == true then Gsm = false Btn = false if h < hEnc then -- если данные из таблицы h < показаний энкодера hEnc while hEnc >= h do local hRelayNeg = true -- активируется реле hRelayNeg print (hEnc, 'relay negative ON') hEnc = hEnc - 1 end local hRelayNeg = false -- выключается реле hRelayNeg print ('horizont OK') local dblBeep = true -- включается двойной звук выполнения elseif h > hEnc then while hEnc <= h do local hRelayPos = true -- активируется реле hRelayPos print (hEnc, 'relay positive ON') hEnc = hEnc + 1 end local hRelayPos = false -- выключается реле hRelayPos print ('horizont OK') local dblBeep = true -- включается двойной звук выполнения else print ('allready horizont OK') end end
Любой while что крутится больше 700 500 мс перегрузит модуль. Здесь надо проверить кнопку, выставить соответствующий пин в нужное положение и таймером проверять изменение кнопки с последующим необходимым действием. Ардуино стиль программирования здесь не прокатит. https://nodemcu.readthedocs.io/en/m...does-the-sdk-event-tasking-system-work-in-lua
Я пока описываю алгоритм работы. Сами функции и пины буду описывать потом. Уйти от while и применять if?
Применять таймер, что проверяет пин и действует в соответствии с задачей. Ещё лучше - вешать прерывания на пины. https://nodemcu.readthedocs.io/en/master/modules/gpio/#gpiotrig
Изучаю таймеры. Пробую таймер на пищалке от компа. По моей логике ШИМ вложен в таймер, а длительность таймера 1сек. Соотв. пищать должна циклично 1сек и прерываться. Но по логике чипа: пищит постоянно. Хотя "beep" пишет исправно - каждые 1сек. Код (Lua): pin = 1 pwm.setup(pin, 1000, 512) tmr.create():alarm(1000, tmr.ALARM_AUTO, function() pwm.start(pin) print("beep") end) pwm.stop(pin) Не ткнете носом?
Таймер каждую секунду заставляет бипер пищать. А что, по вашему, заставляет его прекращать это и как часто? Поставьте перед каждой инструкцией в вашем коде цифру - порядок действий, в какой последовательности, по-вашему, там происходят события. Я, конечно, могу написать этот код за вас, но для обучения это ничего не даст.
Конечно же я добавлял событие pwm.stop() после tmr.delay - но безрезультатно. Звук прерывался только для print("beep"). Код был таким: Код (Lua): pin = 1 -- назначаем переменной pin GPIO 1 pwm.setup(pin, 1000, 512) -- настройки ШИМ tmr.create():alarm(1000, tmr.ALARM_AUTO, function() -- запускаем таймер pwm.start(pin) -- запускаем ШИМ на pin tmr.delay(2000000) -- задержка выполнения таймера 2сек. pwm.stop(pin) -- останавливаем ШИМ print("beep") -- печать "beep" end) -- конец цикла т.к. вы писали что в Lua нет loop, то я думаю что таймер дожен выполнится один раз.
Жуть какая. Вроде в теме про азы Луа вы бывали. tmr.delay(2000000) - применение этой функции просто запрещено, если вы хотите чтобы устройство сработало. Запрещено! Смысл таймера - "дергать" некоторую функцию через равные промежутки времени. Попробуйте написать функцию, которая при одном вызове включает, а при другом - выключает бипер. А вызывать ее будете так: Код (Lua): -- флаг, который указывает состояние бипера flag = false function blinkBiper() -- если флаг false - включить бипер, изменить флаг -- если флаг true - выключить бипер, изменить флаг end tmr.create():alarm(1000, tmr.ALARM_AUTO, blinkBiper) И прочитайте, наконец, про таймер: http://forum.amperka.ru/threads/esp...зы-программирования.12558/page-12#post-160314
Код (Lua): pin=1 pwm.setup(pin, 1000, 512) flag = false function blinkBiper() if flag = false then pwm.start(pin) flag = true end if flag = true then pwm.stop(pin) flag = false end end tmr.create():alarm(1000, tmr.ALARM_AUTO, blinkBiper) Как-то много ошибок для такого короткого кода: Код (Text): pin=1 > pwm.setup(pin, 1000, 512) > flag = false > > function blinkBiper() >> if flag = false then stdin:2: 'then' expected near '=' > pwm.start(pin) > flag = true > end stdin:1: '<eof>' expected near 'end' > if flag = true then stdin:1: 'then' expected near '=' > pwm.stop(pin) > flag = false > end stdin:1: '<eof>' expected near 'end' > end stdin:1: '<eof>' expected near 'end' > > tmr.create():alarm(1000, tmr.ALARM_AUTO, blinkBiper) stdin:1: bad argument #3 to 'alarm' (Must be function) stack traceback: [C]: in function 'alarm' stdin:1: in main chunk >
Верно. Спасибо за подсказку. Код (Lua): flag = false pin = 1 pwm.setup(pin, 1000, 512) cnt = 0 tmr.create():alarm(1000, tmr.ALARM_AUTO, function(t) if flag == false then pwm.start(pin) print('Beep') flag = true end if flag == true then pwm.stop(pin) flag = false end cnt = cnt + 1 if cnt == 5 then print("Timer is stop") t:stop() end end) Воспроизводит короткий импульс с паузой одну сек. Я так понимаю что для регулировки длительности импульса необходимо сделать таймер для pwm.start(). Верно мыслю?