Проблема с tmr на Lua ESP8266

Я занят работой над затемнением света, которым будет управлять мой ESP-03. Но то, что я прочитал, у меня есть проблема. Пожалуйста, посмотрите мой код ниже, тогда я объясню:

device_id = "553CDA2DEAC90"
query_id = ""
dim = 120

wifi.setmode(wifi.STATION)
wifi.sta.config("SSID","PASSWORD")
wifi.sta.connect()
wifi.sta.setip({ip="10.0.0.122",netmask="255.255.255.0",gateway="10.0.0.2"})

outpin = 7 --GPIO13 
gpio.mode(outpin,gpio.OUTPUT)
gpio.write(outpin,gpio.LOW)
inpin = 6 --GPIO12
gpio.mode(inpin,gpio.INT,gpio.PULLUP)

function zero_cross()
    dt = 75*dim
    tmr.delay(dt)
    gpio.write(outpin,gpio.HIGH)
    tmr.delay(1)
    gpio.write(outpin,gpio.LOW)
    tmr.wdclr()
end

gpio.trig(inpin,"up",zero_cross)

function sendData()
    if(wifi.sta.status() == 5)then
        conn=net.createConnection(net.TCP, 0)
        conn:connect(PORT,'IP')
        if(firstStart == 0)then
            conn:send(device_id)
            conn:send("|0|")
        else
            if(query_id == nil)then
                conn:send(device_id)
                conn:send("|0|")
                conn:send(dim)
            else
                conn:send(device_id)
                conn:send("|")
                conn:send(query_id)
                conn:send("|")
                conn:send(dim)
                query_id = nil
            end
        end
        conn:on("receive", function(conn, payload)
            payload = string.gsub(payload, " ", "")
            dim = string.sub(payload, 0, string.find(payload, "|")-1)
            payload = string.gsub(payload, dim.."|", "")
            query_id = payload
            conn:close()
        end)
    else
        wifi.sta.connect()
    end
end
tmr.alarm(6, 1000, 1, sendData )

Проблема, с которой я сталкиваюсь, заключается в том, что когда в нижней части скрипта я запускаю tmr.alarm()... Но в функции zero_cross() он использует tmr.delay, и это, похоже, делает tmr.alarm() нефункционирующим больше. Все, что происходит, это то, что ESP просто продолжает перезапускаться. Если я запускаю приведенный выше код отдельно (только функцию затемнения или только функцию sendData, тогда все работает идеально). У кого-нибудь есть предложения?


person PHP Noob    schedule 30.11.2015    source источник


Ответы (1)


Nodemcu вызывает обратный вызов lua непосредственно из аппаратного прерывания, в то время как необходимость использовать luahook (поскольку Lua не не имеют прямой поддержки прерываний, их нужно эмулировать). Вероятно, это опасно.

Решение: используйте только одно прерывание одновременно:

local send_time, last_gpio
last_gpio = gpio.read(6)
send_time = 0

tmr.trigger(1, 10, 1, function()
    if (gpio.read(6) == 1 and last_gpio == 0) then
        last_gpio = 1
        zero_cross()
    else if (gpio.read(6) == 0 and last_gpio == 1)
        last_gpio = 0
    end

    send_time = send_time + 1

    if (send_time > 100) then
        send_data()
    end
end)
person TuanPM    schedule 05.12.2015