七.1-1 連接固定的WiFi分享器實習
這種方式就是在程式碼中直接指定無線WiFi分享器的名稱(或稱為SSID)及密碼,然後使用WiFi初始指令讓ESP系列晶片開始連接上WiFi分享器,一般制式的程式寫法如下:
const char* ssid=”mySSID”;
const char* password=”myPassword”;
……………………
……………………
WiFi.begin(ssid,password);
…………………….
if (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
很多網路上或教科書上的範例都是這樣教學者的,這樣的程式寫法簡單直接,但問題也不少,首先就是一旦程式燒進ESP晶片之後,就永遠固定無法改變,除非重新燒錄過!這對於一般自學者或是玩家、創客來說還不是問題,但是要做成商品就無法使用了,因為這麼一來ESP晶片跟WiFi分享器就必須綁在一起,變成生命共同體,缺一就無法使用了,這樣的產品應該沒人會買才是!
此外不管有沒有連線上WiFi分享器,從IOT物連網系統上或是說ESP系列晶片及模組上都無法分辨出來,一般必須透過程式的設計與開發軟體的協助,也就是使用Arduino IDE的序列監控視窗上的提示文字才能得知;如果已經是成品了,大概一般人也不會特意去開啟這個序列監控視窗,因此當系統出現問題時就很難得知是否因為連線沒有成功所導致。
前述的第一個問題對這種連接WiFi分享器的方式來說已經是宿命了,孤臣無力可回天!但對第二個問題倒是有一些可以改善的方法,而這也就是本範例打算要示範給大家看的。
◎ 功能與動作說明:
1、使用內建的WiFi分享器名稱及密碼,令ESPXX系列晶片模組連接固定的WiFi分享器。
2、在等待連接WiFi分享器的過程中,ESPXX系列晶片模組板上內建的指示LED會每隔0.5秒亮滅一次,如果到達設定的連線時間(在本範例中設定為15秒)尚未連線成功,則會進入內建指示LED快速(間隔0.1秒)閃爍的無窮迴圈中,不再離開。
3、如果連線成功,則內建的指示LED會以間隔0.3秒的速度亮滅5次後,進入 恆亮的狀態代表連線成功。
◎電路圖:
本次實習的範例程式可同時適用於ESP8266系列與ESP32系列各式的擴充模組實驗板,對於ESP8266系列模組板來說,都是使用ESP-12X的郵票貼片板,在這些板子上都有內建一顆並接在GPIO02腳位的LED,這顆LED在燒錄程式時可以看到閃爍的現象。但是到了ESP32以後,像ESP-WROOM-32等的郵票貼片板這顆LED就被拿掉了,可是在一些使用這片模組板所開發出來的延伸實驗板,如下面【圖七•1-1】的NodeMcu DevKit R32模組板,和【圖七•1-2】WeMos D1 R32模組板等,在外部又把這顆LED給補上去,而且同樣是並接在GPIO02(D2)腳位,只是亮滅的位準跟ESP8266系列相反;這點在我們的範例程式中都有加以考慮,以便讓同樣的程式,可以在不同系列的模組板上呈現同樣的結果。
圖七•1-1_1 NodeMcu DevKit R32模組板外觀與LED D2位置圖
圖七•1-1_2 WeMos D1 R32模組板外觀與LED D2位置圖
◎ 程式列表與說明:
#ifdef ESP32
#include <WiFi.h>
int ledOn=1;
int ledOff=0;
#else
#include <ESP8266WiFi.h>
int ledOn=0;
int ledOff=1;
#endif
const char* ssid = "mySSID"; // 要連線的WiFi分享器名稱
const char* password = "myPassword"; // 要連線的WiFi分享器密碼
const byte indLED=2; // ESP系列模組郵票板指示用LED腳位
void setup()
{
Serial.begin(115200); //
Serial.println();
pinMode(indLED,OUTPUT); //
WiFi.begin(ssid, password); // 啟動WiFi連線
Serial.println("WiFi Connecting...");
Serial.print("WiFi 連線中");
int connectTime=30; // 設定WiFi連線時間為15秒
boolean connectStatus=false;
while (WiFi.status() != WL_CONNECTED) // 等待WiFi連線
{
delay(500);
Serial.print("."); // 每0.5秒列印一個點'.'
connectStatus=!connectStatus;
if(connectStatus) // 每0.5秒讓LED亮滅一次
digitalWrite(indLED,ledOn);
else
digitalWrite(indLED,ledOff);
if((connectTime--)==0) { // 測試是否已經到達設定的連線時間
Serial.println();
Serial.println("Connection failed!");
Serial.println("連線失敗!!");
while(1) { // 進入LED快閃的無窮迴圈,以作為連線失敗的警示
connectStatus=!connectStatus;
if(connectStatus) {
digitalWrite(indLED,ledOn);
delay(100);
}
else {
digitalWrite(indLED,ledOff);
delay(100);
}
}
}
}
// WiFi連線成功 :
Serial.println();
Serial.print("WiFi Connected, IP address: ");
Serial.println(WiFi.localIP());
Serial.print("連線成功, 本地WiFi的IP位址為 : ");
Serial.println(WiFi.localIP());
Serial.println();
for(int i=0;i<5;i++) // 讓指示LED快閃(0.3秒)5次
{
digitalWrite(indLED,ledOn);
delay(300);
digitalWrite(indLED,ledOff);
delay(300);
}
delay(1000);
digitalWrite(indLED,ledOn); // 最後讓指示LED恆亮代表已經連線成功
delay(1000);
}
void loop() {}
程式名稱:ESP_CH7_Connect0.ino
在前面經說過,本範例程式可同時適用於ESP8266系列與ESP32系列各式的擴充模組實驗板,這主要是使用編譯指引的語法來達成,由於Arduino IDE可自動判別現在所使用的晶片模組種類,所以當我們選用的是ESP32系列的模組板時,編譯動作會選擇使用下面2~4行的內容反,之如果使用的是ESP8266系列的模組板,則會採用6~8行的內容,由於ESP32系列模組板上連接D2的LED驅動的極性和ESP8266相反,因此我們用文字的方式去定義LED的亮滅,就可以避免同樣的程式卻在不同的模組板上有不同的結果出現!
#ifdef ESP32
#include <WiFi.h>
int ledOn=1;
int ledOff=0;
#else
#include <ESP8266WiFi.h>
int ledOn=0;
int ledOff=1;
#endif
接著的11~13行程式分別定義使用者想要連上的WiFi分享器名稱與密碼,及指示用LED的腳位,在此使用者可依據自己實際使用的WiFi分享器去更該它們。為了讓用者能夠知道目前的狀態,所以在ESPXX連線的時候指示LED會每隔0.5秒亮滅一次,而且一般來說正常狀態下連上的WiFi分享器時間很少會超過10秒,在此我們設定的時間值為15秒,這也是下面這兩個變數的用途:
25. int connectTime=30; // 設定WiFi連線時間為15秒(15/0.5=30)
26. boolean connectStatus=false;
如果想要延長或縮短連上的WiFi分享器的時間,只要更改”connectTime”就可以了!
啟動WiFi初始化(即「WiFi.begin(ssid,password)」指令)之後,27~52行程式會監控ESPXX是否在設定的時間內連上WiFi分享器,如果超過時間沒有連上,則整個程式便會在40~49行的while(1) {}無窮迴圈中打轉;這個無窮迴圈會讓指示用LED以0.1秒的速度快速地閃爍,好讓使用者知道ESPXX連線失敗!這也就是實現了前面功能與動作中的第二項需求。如果不想讓程式被困在這裡,可以改用for()迴圈的方式執行一段時間後就結束,但結束之後要如何處理﹖就要靠設計者自己想了。
至於setup()部分剩餘的程式(55~70行),則是在完成前面功能與動作中的第三項需求,在ESPXX正常連接上WiFi分享器後,便會離開前述的while(1) {}無窮迴圈,在此我們的範例程式會分別以中英文的方式,將WiFi分享器分配給ESPXX模組的本地IP位址顯在Arduino IDE的序列監控視窗上,然後令指示LED閃爍5次之後,進入恆亮的狀態,好讓使用者知道ESPXX模組已經成功的連上WiFi分享器了。
下面的【圖七•1-3】及後面兩段影片,分別是ESP8266的WeMos D1 R1模組板連線失敗,及NodeMcu ESP32 DevKit模組板連線成功的畫面,使用的是同一個範例程式,但兩種系列的模組板都可以適用。
圖七•1-1_3 Arduino IDE序列監控視窗中ESPXX模組連線狀態與結果
◎ 執行結果:
•ESP8266的WeMos D1 R1模組板連線失敗畫面
•NodeMcu ESP32 DevKit模組板連線成功的畫面
沒有留言:
張貼留言