引言
在之前的代碼中,要連接的WIFI信息都已寫死在代碼里,這顯然不能適應我們的需求。所以需要想個辦法讓用戶可以配置這些信息。
WIFI工作模式
NodeMCU支持STATION,SOFTAP,STATIONAP,NULLMODE四種模式。
設置WIFI模式
wifi.setmode()
wifi.STATION
當設備需要連接到WIFI路由器時使用。常在訪問Internet時使用。wifi.SOFTAP
當設備需要作為熱點時使用。在此模式下你的設備會創建一個本地局域網,並出現在WIFI列表。在默認情況下,NodeMCU在本地局域網地址為192.168.4.1,其他設備將被分配為下一個的可用IP,比如192.168.4.2。wifi.STATIONAP
同時應用以上兩者。在此模式下你可以在創建一個熱點的同時連接到其他WIFI路由器。wifi.NULLMODE
關閉WIFI。
所以可以添加一個按鈕,當按鈕按下時,轉換模式為WIFI.STATIONAP
,然后通過手機接入NodeMCU的熱點,進入設置頁面配置WIFI信息。就像配置路由器一樣。
接線
-
綠色的LED就是未來被遠程控制的那顆,正極連接D1。
-
黃色的LED用於顯示當前的WIFI工作模式,正極連接D2。
-
白色的按鈕連接D3。
-
負極連接GND。
接線完成后,定義這些引腳:
IO_LED = 1
IO_LED_AP = 2
IO_BTN_CFG = 3
gpio.mode(IO_LED, gpio.OUTPUT)
gpio.mode(IO_LED_AP, gpio.OUTPUT)
gpio.mode(IO_BTN_CFG, gpio.INT)
注意,IO_BTN_CFG
被設置為了gpio.INT
模式,也就是中斷模式。
響應按鈕
通過gpio.trig()
設置響應中斷的回調函數。
設置響應中斷的回調函數
gpio.trig()
響應按鈕抬起時的事件:
function onBtnEvent()
print('up~')
end
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)
上傳代碼。測試按下按鈕,發現輸出正常。
但存在一個問題:有時只按了一次,輸出卻不止一次。因為按鈕的信號會有抖動。
這里提供一種去抖方法:
TMR_BTN = 6
function onBtnEvent()
gpio.trig(IO_BTN_CFG)
tmr.alarm(TMR_BTN, 500, tmr.ALARM_SINGLE, function()
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)
end)
print('up~')
end
gpio.trig(IO_BTN_CFG, 'up', onBtnEvent)
思路是,在首次觸發之后,清除按鈕的回調函數,在0.5秒后,恢復回調。
開始與結束配置
正如之前所講,平常運行時WIFI模式為wifi.STATION
,當按下按鈕后,WIFI模式轉為wifi.STATIONAP
,再次按下后恢復wifi.STATION
。
gpio.write(IO_LED_AP, gpio.LOW)
function switchCfg()
if wifi.getmode() == wifi.STATION then
wifi.setmode(wifi.STATIONAP)
gpio.write(IO_LED_AP, gpio.HIGH)
else
wifi.setmode(wifi.STATION)
gpio.write(IO_LED_AP, gpio.LOW)
end
end
注意,gpio.write(IO_LED_AP, gpio.LOW)
在函數外部,目的是在NodeMCU開機時,重置AP信號燈為熄滅狀態。
之后,修改上節按鈕事件函數里的print('up~')
為:
switchCfg()
這樣就可以通過按鈕來控制AP的開啟關閉了。
配置熱點信息
在print('Setting up WIFI...')
后添加下行代碼,來配置熱點名為 'mymcu' ,安全性為開放。
wifi.ap.config({ ssid = 'mymcu', auth = AUTH_OPEN })
關於wifi.ap.config()
的更多細節,請參閱:
配置熱點信息
wifi.ap.config()
最后,刪去之前寫死在代碼里的WIFI連接配置wifi.sta.config('MY_SSID', 'MY_PASSWORD')
。
因為隨后,我們將提供操作界面,讓用戶自己來設置它們。
相關資源
你可以在NodeMCU-Tutorial下載到本文的相關資源和代碼。