2020年10月15日 星期四

二、 存取點(AP)模式建立與連線測試


接下來我們就以一個範例程式來說明如何在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


程式說明與列表


下面是這個範例程式的完整列表



  1.   // 每隔3秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中

  2.   // 若有任一Station裝置連上,模組板上的LED(接在GPIO2上)會點亮以做為指示:

  3. #include <WiFi.h>   // 引入ESP32使用的WiFi函示庫

  4.  

  5. const char*  ssid = "ESP32_softAP01"; // 設定SSID名稱

  6. const char* password = "12345678";

  7. const byte  indLED=2; // 設定指示用LED輸出的腳位為GPIO2

  8.  

  9. void setup()

  10. {

  11.     Serial.begin(115200);

  12.     pinMode(indLED, OUTPUT);      // set the LED pin mode

  13.     delay(10);

  14.  

  15.     WiFi.softAP(ssid);        // 本範例暫時不使用WiFi AP連線密碼

  16.     Serial.println("Setting softAP ...");

  17.     Serial.println();

  18.     Serial.print("Your softAP is : ");

  19.     Serial.println(ssid);               // 顯示SoftAP的SSID名稱

  20.     Serial.print("IP address: ");

  21.     Serial.println(WiFi.softAPIP());    // 顯示本地伺服器的IP位址

  22.     

  23. }

  24.  

  25. void loop(){

  26.   // 每隔5秒讀取一次已連線上的無線WiFi裝置數目,並顯示在Arduino IDE序列監控視窗中

  27.   Serial.printf("Stations connectet = %d\n",WiFi.softAPgetStationNum());

  28.   if( WiFi.softAPgetStationNum() >0 )     // 測試是否有無線WiFi裝置連線上本系統

  29.     digitalWrite(indLED,1);               // 如果有點亮指示LED燈

  30.   else

  31.     digitalWrite(indLED,0);               // 若無則熄滅指示LED燈

  32.   delay(5000);

  33. }

程式名稱:ESP32_softAP0_getStNum.ino


程式的第3行在引入<WiFi.h>函式庫接著56行設定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 單一接點繼電器模組


沒有留言:

張貼留言

三、使用Line Notify傳送照片之安全監控系統之二---低功耗篇

在前一個章節中 , 我們建構了一個標準照片擷取 、 傳送與儲存的按全監控裝置 , 不過假如我們使用的場域中有許多的地方都必須按裝這類的裝置時 , 例如在一個有許多門 、 窗的家庭或辦公室 , 由於我們的系統使用無線WiFi作為信號傳輸之用 , 所以信號的傳輸除非裝置離WiFi分享...