2020年7月3日 星期五

七.1-1 連接固定的WiFi分享器實習

七.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-2WeMos 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的亮滅就可以避免同樣的程式卻在不同的模組板上有不同的結果出現


  1. #ifdef ESP32

  2. #include <WiFi.h>

  3.   int  ledOn=1;

  4.   int ledOff=0;

  5. #else

  6. #include <ESP8266WiFi.h>

  7.   int ledOn=0;

  8.   int ledOff=1;

  9. #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模組板連線失敗畫面

https://youtu.be/nkUldi8P088

NodeMcu ESP32 DevKit模組板連線成功的畫面

https://youtu.be/1HVPLSdu__Y


沒有留言:

張貼留言