事件監聽器
NodeMCU采用了事件響應的方式。也就是說,只需為事件設置一個回調函數,當事件發生時,回調函數就會被調用。
注冊事件監聽器
wif.sta.eventMonReg()
通過監聽器獲知wifi連接狀態
-- init.lua
print('Setting up WIFI...')
wifi.setmode(wifi.STATION)
wifi.sta.config('MY_SSID', 'MY_PASSWORD')
wifi.sta.connect()
status = nil
wifi.sta.eventMonReg(wifi.STA_GOTIP, function()
status = 'STA_GOTIP'
print(status, wifi.sta.getip())
end)
wifi.sta.eventMonStart(1000)
wifi.sta.eventMonStart(1000)
函數表明檢測網絡狀態的間隔是一秒。
不止如此,常用的監聽器還有:
wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function()
status = 'STA_WRONGPWD'
print(status)
end)
wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function()
status = 'STA_APNOTFOUND'
print(status)
end)
wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State)
status = 'STA_CONNECTING'
print(status)
end)
斷線自動重連
有時因為路由器重啟等原因,NodeMCU可能會掉線,好在NodeMCU可以設置自動連接:
替換上節代碼中的wifi.sta.connect()
為
wifi.sta.autoconnect(1)
這樣,當配置的wifi有效時,NodeMCU便能自動連入。
控制LED閃爍
在NodeMCU上有一個LED可用。可以用它來顯示當前的連接狀態。經測試,控制該LED的引腳為D4。
這是一個控制LED以特定延遲序列閃爍的函數。
IO_BLINK = 4
TMR_BLINK = 5
gpio.mode(IO_LED_BLINK, gpio.OUTPUT)
blink = nil
tmr.register(TMR_BLINK, 100, tmr.ALARM_AUTO, function()
gpio.write(IO_BLINK, blink.i % 2)
tmr.interval(TMR_BLINK, blink[blink.i + 1])
blink.i = (blink.i + 1) % #blink
end)
function blinking(param)
if type(param) == 'table' then
blink = param
blink.i = 0
tmr.interval(TMR_BLINK, 1)
running, _ = tmr.state(TMR_BLINK)
if running ~= true then
tmr.start(TMR_BLINK)
end
else
tmr.stop(TMR_BLINK)
gpio.write(IO_BLINK, param or gpio.LOW)
end
end
blinking()
函數需要傳入一個數組,數組元素依次表示LED亮滅的延遲。例子:
blinking({300, 300}) -- 循環閃爍:亮300ms,滅300ms
blinking({100, 100 , 100, 500}) -- 循環閃爍:亮100ms,滅100ms,亮100ms,滅500ms
blinking() -- 常亮
blinking(gpio.LOW) -- 常亮
blinking(gpio.HIGH) -- 常滅
閃爍顯示連接狀態
現在就可以結合監聽器用LED顯示連接狀態了。
在上一節的監聽器事件里,各添加一行閃爍的即可。
wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function()
blinking({100, 100 , 100, 500})
status = 'STA_WRONGPWD'
print(status)
end)
wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function()
blinking({2000, 2000})
status = 'STA_APNOTFOUND'
print(status)
end)
wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State)
blinking({300, 300})
status = 'STA_CONNECTING'
print(status)
end)
wifi.sta.eventMonReg(wifi.STA_GOTIP, function()
blinking()
status = 'STA_GOTIP'
print(status, wifi.sta.getip())
end)
相關資源
你可以在NodeMCU-Tutorial下載到本文的相關資源和代碼。