Покритикуйте пожалуйста код

Тема в разделе "ESP8266, ESP32", создана пользователем Nikomas, 22 апр 2020.

  1. Nikomas

    Nikomas Нерд

    Друзья. Только начинаю осваивать 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
     
  2. ИгорьК

    ИгорьК Гуру

    Любой while что крутится больше 700 500 мс перегрузит модуль.

    Здесь надо проверить кнопку, выставить соответствующий пин в нужное положение и таймером проверять изменение кнопки с последующим необходимым действием.

    Ардуино стиль программирования здесь не прокатит.

    https://nodemcu.readthedocs.io/en/m...does-the-sdk-event-tasking-system-work-in-lua
     
  3. Nikomas

    Nikomas Нерд

    Я пока описываю алгоритм работы. Сами функции и пины буду описывать потом.

    Уйти от while и применять if?
     
  4. ИгорьК

    ИгорьК Гуру

    Применять таймер, что проверяет пин и действует в соответствии с задачей.

    Ещё лучше - вешать прерывания на пины.
    https://nodemcu.readthedocs.io/en/master/modules/gpio/#gpiotrig
     
  5. Nikomas

    Nikomas Нерд

    Изучаю таймеры. Пробую таймер на пищалке от компа. По моей логике ШИМ вложен в таймер, а длительность таймера 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)
     
    Не ткнете носом?
     
  6. ИгорьК

    ИгорьК Гуру

    Таймер каждую секунду заставляет бипер пищать. А что, по вашему, заставляет его прекращать это и как часто?

    Поставьте перед каждой инструкцией в вашем коде цифру - порядок действий, в какой последовательности, по-вашему, там происходят события.

    Я, конечно, могу написать этот код за вас, но для обучения это ничего не даст.
     
    Последнее редактирование: 24 апр 2020
  7. Nikomas

    Nikomas Нерд

    Конечно же я добавлял событие 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, то я думаю что таймер дожен выполнится один раз.
     
  8. ИгорьК

    ИгорьК Гуру

    Жуть какая. Вроде в теме про азы Луа вы бывали.
    tmr.delay(2000000) - применение этой функции просто запрещено, если вы хотите чтобы устройство сработало.

    Запрещено!

    Смысл таймера - "дергать" некоторую функцию через равные промежутки времени. Попробуйте написать функцию, которая при одном вызове включает, а при другом - выключает бипер.

    А вызывать ее будете так:

    Код (Lua):
    -- флаг, который указывает состояние бипера
    flag = false

    function  blinkBiper()
        -- если флаг false - включить бипер, изменить флаг
        -- если флаг true - выключить бипер, изменить флаг
    end

    tmr.create():alarm(1000, tmr.ALARM_AUTO, blinkBiper)
    upload_2020-4-24_13-4-40.png

    И прочитайте, наконец, про таймер: http://forum.amperka.ru/threads/esp...зы-программирования.12558/page-12#post-160314
     
    ДеКодер нравится это.
  9. Как-то так:
    Код (C++):
    function  blinkBiper()
        flag = !flag;
    end
     
  10. Nikomas

    Nikomas Нерд

    Код (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
    >
     
     
  11. ИгорьК

    ИгорьК Гуру

    Знак равно как присвоение значения и как проверка равенства пишутся поразному.
     
  12. Nikomas

    Nikomas Нерд

    Верно. Спасибо за подсказку.
    Код (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(). Верно мыслю?