接下來我們就以一個範例程式來說明如何在ESP32上建立一個WiFi無線網路的AP存取點,在這個範例程式中我們將建立和產生一個名稱(SSID)為" ESP32_softAP01",密碼(Password)為"12345678"的AP存取點,而且每隔5秒會檢查一次有多少個無線WiFi裝置已經連上了這個AP存取點,並將這些訊息顯示在電腦上的Arduino IDE序列監控視窗中,如果有任一無線WiFi裝置連接上ESP32的AP存取點,則會點亮接在GPIO2腳的LED。
要將ESP8266設定在WiFi無線網路的AP存取點模式,必須使用
WiFi.mode(mode)
這個函式指令,其中的參數“mode”共有四種選擇,分別是:「WIFI_AP」、「WIFI_STA」、「WIFI_AP_STA」及「OFF」;而其中的「WIFI_AP」和「WIFI_AP_STA」兩種選擇都可讓ESP32工作在AP存取點模式,只是後者同時具備了站點(Station)的功能。如果在程式中使用者沒有使用到這個函式,那麼系統會預設為「WIFI_AP_STA」模式,也就是同時開啟了AP存取點與站點兩種功能模式。在後面的範例程式中會示範這個特性。
在宣告完之後,如果要在ESP32上建立一個WiFi無線網路的AP存取點,我們必須使用下面的函式指令:
WiFi.softAP(SSID,Password,channel,hidden,max_connection)
其中的第一個參數「SSID」是我們要設定的AP存取點名稱,而「Password」則是其他站點(Station)無線WiFi裝置連接這個AP存取點時使用的密碼。接著的「channel」這個參數代表這個AP存取點使用的無線WiFi通訊頻道,其號碼從1~13,預設頻道值為1。「hidden」代表這個AP存取點是否可被一般的無線WiFi裝置掃描到,如果設定值為”true”,代表AP存取點被隱藏起來無法看見。至於最後的「max_connection」參數,則是指同時間最多可以有幾個站點無線WiFi裝置可以連接到這個AP存取點,其範圍由0~8,而預設值為4。
上面括弧中的參數除了第一個「SSID」是必須要使用之外,其他的都是屬於可選用的,甚至連密碼「Password」都可以不用!在後面的範例程式中,為了方便測試,所以實際上只設定了「SSID」這個參數而已。『WiFi.softAP()』這個函式是一個布林(Boolean)型式的函式,如果設定成功的話,會傳回”true”的結果,反之則傳回”false”。
下面的範例程式將會建立一個WiFi無線網路的AP存取點,而且每隔5秒將連線到此AP存取點的無線WiFi裝置數目顯示在電腦上的Arduino IDE序列監控視窗中,如果有任一無線WiFi裝置連接上ESP32的話,會點亮接在GPIO2腳的LED。
◎ 範例程式功能與動作說明:
1、以ESP8266建立一無線WiFi存取點,其SSID名稱為『ESP32_softAP01』,且不使用密碼。
2、此AP存取點內建伺服器的IP位址為:[ 192.168.4.1 ]。
3、此AP存取點每隔5秒檢查一次目前已連線的WiFi裝置數目,並顯示在電腦上的Arduino IDE序列監控視窗中。
4、若有任一無線WiFi裝置連接上ESP32的話,則會點亮接在GPIO2腳的LED。
◎程式說明與列表:
下面是這個範例程式的完整列表:
// 每隔3秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中
// 若有任一Station裝置連上,模組板上的LED(接在GPIO2上)會點亮以做為指示:
#include <WiFi.h> // 引入ESP32使用的WiFi函示庫
const char* ssid = "ESP32_softAP01"; // 設定SSID名稱
const char* password = "12345678";
const byte indLED=2; // 設定指示用LED輸出的腳位為GPIO2
void setup()
{
Serial.begin(115200);
pinMode(indLED, OUTPUT); // set the LED pin mode
delay(10);
WiFi.softAP(ssid); // 本範例暫時不使用WiFi AP連線密碼
Serial.println("Setting softAP ...");
Serial.println();
Serial.print("Your softAP is : ");
Serial.println(ssid); // 顯示SoftAP的SSID名稱
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP()); // 顯示本地伺服器的IP位址
}
void loop(){
// 每隔5秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中
Serial.printf("Stations connectet = %d\n",WiFi.softAPgetStationNum());
if( WiFi.softAPgetStationNum() >0 ) // 測試是否有無線WiFi裝置連線上本系統
digitalWrite(indLED,1); // 如果有點亮指示LED燈
else
digitalWrite(indLED,0); // 若無則熄滅指示LED燈
delay(5000);
}
程式名稱:ESP32_softAP0_getStNum.ino
程式的第3行在引入<WiFi.h>函式庫,接著5、6行設定AP存取點的SSID名稱(在此為”ESP32_SoftAP01”)與密碼,程式的第7行設定指示用LED輸出的腳位為GPIO2。
在程式第15行用下列的指令建立了這個AP存取點:
WiFi.softAP(ssid);
其中的「ssid 」即為這個AP存取點的名稱,其內容為 "ESP32_softAP01";如果我們想加上密碼以提高安全性,只要改寫成下面的形式便可:
WiFi.softAP(ssid,password);
其中的第二個引數「password」便是上面範例程式第6行所定義的常數變數:
const char* password = "12345678";
接著16~21行的程式會將ESP32的soft AP名稱及所使用的伺服器IP位址顯示在Arduino IDE的序列監控視窗中。
剩下的25~33行是主迴圈 (loop())程式區,在此程式會每隔5秒讀取並顯示所有已經連線上的無線WiFi裝置數目在電腦上的Arduino IDE序列監控視窗中,下列指令便是用以取得連線的無線WiFi裝置數目:
WiFi.softAPgetStationNum()
如果這個值大於0,代表有裝置已經連線,則程式會點亮指示用的LED燈(29行),反之則熄滅指示用的LED燈(31行)。
◎執行結果:
圖二、1 手機/平板/筆電WiFi掃描與連線畫面
當程式上傳成功之後,請啟動手機或平板電腦的WiFi功能,便可以看到【圖二、1】這個掃描與連線畫面,使用者只要直接點選「ESP32_softAP01」這個WiFi熱點去連線,就可看到【圖二、2】中無線WiFi裝置數目值隨之增加,當然在切斷連線之後數目值也會跟著減少。
如果程式燒錄成功並啟動後,我們便可在電腦上的Arduino IDE串列監控視窗中看到類似【圖二、2】的內容,其中標記1是程式剛開始執行,還沒有任何無線WiFi裝置連接到ESP32模組,所以傳回已連線站點的數目為0,而標記2、3則分分別代表有1、2個無線WiFi裝置連上系統。
圖二、2 softAP初始化成功後串列埠監控視窗內容
【圖二、3】是本次範例所使用的ESP32開發板,型號為『WeMos Lolin32 D1 R32 』,圖中用紅線框起來的部份便是接在GPIO2上的LED(紅色),當有任何無線WiFi裝置連上這塊開發板時這顆LED燈便會點亮。
圖二、3 使用WeMos Lolin32開發板測試無線WiFi裝置連上系統狀況
◎動動腦:延伸應用—《建構一機車啟動暗鎖》
本範例的電路可說是最基本的架構,就是單純的實驗開發板而已,但是如果加上一塊Arduino中常見的繼電器模組板(如下面【圖二、4】所示),就可以延伸出不少的應用,例如啟動一個開關或是點亮一個燈,但主題好像不是很明顯。有時候同樣的東西,可是發想用在不同的場域,就會創造出不同的價值,這也是我在上課教學生時常強調的要有創意,這樣除了可以提高產品的價值,同時也可以提高自己的價值。
在此提供一個小構想範例,就是把這個組合拿來設計一個用在機車的啟動用暗鎖,以增加機車的安全性。一般機車要能發動,首先當然是用鑰匙去開啟電源,然後按下馬達啟動按鈕,等車子的引擎發動後,便可放開馬達啟動按鈕。如果我們把ESP32的GPIO2輸出接到下列繼電器模組板右邊的信號觸發腳(在此設定為高電位觸發),接著把機車鑰匙的開啟電源線或是馬達啟動按鈕的電線斷開後,兩端分別接在繼電器模組板左邊的共同接點(即「COM」)與常開接點(即「NO」),這樣就可以構成一個類似現在高階汽車上常可見到的Keyless近接感應鑰匙;使用者只要在接近機車時拿出手機並打開已經配對連線過的WiFi功能,就可以開啟這個暗鎖系統,這樣也不怕下車忘了拔下鑰匙了。
圖二、4 單一接點繼電器模組
沒有留言:
張貼留言