NodeMCU入門(3):斷線自動重連,指示燈顯示連接狀態


准備工作

1.NodeMCU模塊

2.ESPlorer v0.2.0-rc6

事件監聽器

NodeMCU采用了事件響應的方式。也就是說,只需為事件設置一個回調函數,當事件發生時,回調函數就會被調用。

注冊事件監聽器
wif.sta.eventMonReg()

Please update your program to use the wifi.eventmon API, as the wifi.sta.eventmon___()API is deprecated.

開始監聽
wifi.sta.eventMonStart()

通過監聽器獲取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可以設置自動連接:

自動連接
wifi.sta.autoconnect(1)

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)
init.lua

相關資源 

NodeMCU文檔

NodeMCU custom builds

nodemcu-flasher

ESPlorer.zip

你也可以在NodeMCU-Tutorial下載到本文的相關資源和代碼。

本文是在 NodeMCU之旅(二):斷線自動重連,閃爍連接狀態 基礎之上的學習過程,感謝原作者。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM