2015-11-30 5 views
3

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

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, тогда все работает отлично). У кого-нибудь есть предложения?

ответ

0

Nodemcu call lua callback directly from hardware interrupt, в то время как необходимо использовать luahook, (поскольку у Lua нет прямой поддержки прерываний, их нужно эмулировать). Это, вероятно, опасно.

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

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) 
Смежные вопросы