准備工作
1.NodeMCU模塊
2.ESPlorer v0.2.0-rc6
事件監聽器
NodeMCU采用了事件響應的方式。也就是說,只需為事件設置一個回調函數,當事件發生時,回調函數就會被調用。
注冊事件監聽器
wif.sta.eventMonReg()Please update your program to use the
wifi.eventmon
API, as thewifi.sta.eventmon___()
API is deprecated.
通過監聽器獲取wifi連接狀態
status=nil wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() status = 'STA_WRONGPWD' print(status) end)
--啟動監聽器
wifi.sta.eventMonStart(1000)
通過http://nodemcu.readthedocs.io/en/master/en/modules/wifi/#wifistaeventmonreg 文檔可以獲取更多的例子,如:
--register callback wifi.sta.eventMonReg(wifi.STA_IDLE, function() print("STATION_IDLE") end) wifi.sta.eventMonReg(wifi.STA_CONNECTING, function() print("STATION_CONNECTING") end) wifi.sta.eventMonReg(wifi.STA_WRONGPWD, function() print("STATION_WRONG_PASSWORD") end) wifi.sta.eventMonReg(wifi.STA_APNOTFOUND, function() print("STATION_NO_AP_FOUND") end) wifi.sta.eventMonReg(wifi.STA_FAIL, function() print("STATION_CONNECT_FAIL") end) wifi.sta.eventMonReg(wifi.STA_GOTIP, function() print("STATION_GOT_IP") end) --register callback: use previous state wifi.sta.eventMonReg(wifi.STA_CONNECTING, function(previous_State) if(previous_State==wifi.STA_GOTIP) then print("Station lost connection with access point\n\tAttempting to reconnect...") else print("STATION_CONNECTING") end end) --unregister callback wifi.sta.eventMonReg(wifi.STA_IDLE)
斷線自動重連
有時因為路由器重啟等原因,NodeMCU可能會掉線,好在NodeMCU可以設置自動連接:
Auto connects to AP in station mode.
0 to disable auto connecting, 1 to enable auto connecting
修改上一節中的 wifi.sta.connect()
為 wifi.sta.autoconnect(1)
控制LED燈閃爍
在NodeMCU上有一個LED可用。可以用它來顯示當前的連接狀態。經測試,控制該LED的引腳為D4。
這是一個控制LED以特定延遲序列閃爍的函數。
---------------------- --define --------------------- IO_BLINK = 4 TMR_BLINK = 5 gpio.mode(IO_BLINK, gpio.OUTPUT) --------------------- -- blink --------------------- 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顯示連接狀態
現在就可以結合監聽器用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模塊里了,並且重新刷固件也不會丟失,通過輸出信息可以看到每一步操作,錯誤提示可以定位到行,有問題時可以仔細看看輸出。
連接上WIFI后LED常亮,重啟路由器,LED燈閃爍並輸出狀態信息。

-- init.lua ---------------------- --define --------------------- IO_BLINK = 4 TMR_BLINK = 5 gpio.mode(IO_BLINK, gpio.OUTPUT) --------------------- -- blink --------------------- 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 --------------------- -- wifi --------------------- print('Setting up WIFI...') wifi.setmode(wifi.STATION) wifi.sta.config('WX401901', 'smyh1234') wifi.sta.autoconnect(1) status=nil 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) wifi.sta.eventMonStart(1000)
相關資源
你也可以在NodeMCU-Tutorial下載到本文的相關資源和代碼。
本文是在 NodeMCU之旅(二):斷線自動重連,閃爍連接狀態 基礎之上的學習過程,感謝原作者。