2020年7月19日 星期日

七.1-3 使用者可自行選擇連接WiFi分享器實習之二-外加OLED顯示器

在上一小節中示範了「WiFiConnect.h」函式庫的使用方法而且也介紹了這個函式庫的安裝方式(【圖七•1-2_1)其實這個安裝過程等於一口氣裝了兩個相關的函示庫其中的第二個就是本小節要介紹的加上了OLED顯示器功能的「WiFiConnectOLED.h」函式庫

這個函式庫主要是補強上一個在連線與使用的過程中,在ESPXX晶片端缺乏適當的人機提示介面的缺點所使用的是目前很流行的OLED顯示器作為提示訊息的顯示元件;最重要的是簡單易用使用者只要呼叫幾個內建的指令程式就可以上手!


功能與動作說明

1、本範例和上一小節的範例功能類似都在建構一具有0.96”OLED顯示器且可由使用者自行選定所要使用的WiFi分享器之ESPXX系列晶片IOT物聯網系統此系統可使用ESP8266系列或是ESP32系列的晶片模組主要的差別在於晶片端多了一個可以顯示連線狀態的OLED顯示器

2、此系統在開機時會自行連上最後一次連線的WiFi分享器,此時OLED顯示器的畫面訊息如下圖:

圖七•1-3_1  ESPXX晶片模組板開機連線WiFi分享器畫面

圖七•1-3_2  ESPXX晶片模組板進入本地AP模式設定畫面


如果連線失敗,如圖七•1-3_1所示也就是連線次數到達3次之後,系統自動進入重新設定連線的狀態(圖七•1-3_2】)也就是進入本地AP模式(IP預設為:192.168.4.1),使用者可使用如手機等具無線WiFi介面的行動通訊裝置,連線進入本機內建的網頁伺服器頁面進行重新設定的動作。

3、如果使用者沒有或是太久(內定為3分鐘)才連線進入本機內建的網頁伺服器頁面進行重新設定的動作,則系統會結束連線設定的功能,並出現下列的畫面,這時使用者必須按下晶片的重置(Reset)按鈕重新開始。

圖七•1-3_3  ESPXX晶片模組板設定逾時進入手動重置畫面


4、不管是開機後就順利連線上WiFi分享器或是由使用者設定後連線成功,OLED顯示器都會顯示下面的【圖七•1-3_4畫面,告訴使用者連線成功而上方的訊息代表我們這個ESPXX晶片模組板由連線上WiFi分享器所分配到的本地IP位址。

圖七•1-3_4  ESPXX晶片模組板連線成功畫面


電路圖

圖七•1-3_5  使用NodeMCU開發板I2C介面電路圖


由於我們使用的OLED顯示器是使用I2C的匯流排介面而在ESP8266晶片系列中目前大部分的沿伸模組板都是使用ESP12X系列的郵票板標準的ESP8266預設I2C匯流排介面接腳為SDA 🡪 GPIO4及SCL🡪 GPIO5可是在NodeMCU這類的發模組板上並不是沿用原來的GPIO腳位而是改用DX的方式來編號其中的D1 🡪 GPIO5 而D2🡪 GPIO4所以使用NodeMCU開發板的時候就必須使用【圖七•1-3_5】的接線方式。


圖七•1-3_6  使用WeMos D1 R2開發板I2C介面電路圖


假如使用的是WeMos D1 R2開發板,由於板子上已經內建I2C的獨立接腳所以可以使用【圖七•1-3_6】的接線方式。

圖七•1-3_7  使用ESP32 NodeMCU開發板連接I2C介面電路圖


至於ESP32 NodeMCU開發板,前面已經介紹過ESP32的預設I2C匯流排介面接腳為SDA 🡪 GPIO21及SCL🡪 GPIO22,也就是【圖七•1-3_7】的接線方式。


程式列表與說明







 

#include "WiFiConnectOLED.h" //include before SSD1306.h if using custom fonts

#include <Wire.h>  // 使用I2C匯流排必須因用的函式庫

#include "SSD1306.h" // OLED顯示器所使用的函式庫

 

#ifdef ESP32

#define OLED_RESET 16

#else

#define OLED_RESET 10

#endif

 

#ifdef ESP32

SSD1306  display(0x3c, 21, 22); // 定義ESP32所使用的I2C匯流排腳位

#define oledPWR 16 //Pin to supply power to OLED

#else

SSD1306  display(0x3c, 4, 5); // 定義ESP8266所使用的I2C匯流排腳位

#define oledPWR -1 //Pin to supply power to OLED

#endif

 

WiFiConnectOLED wc(&display, oledPWR);  //宣告一WiFiConnectOLED類別物件變數

const byte  indLED=2;             // ESPXX系列模組郵票板指示用LED腳位

 

// 連線設定回應副程式:

void configModeCallback(WiFiConnect *mWiFiConnect) {

  Serial.println("Entering Access Point!");

  Serial.println("進入 AP 存取點模式!");

}

 

// WiFi連線副程式 :

void startWiFi(boolean showParams = false) {

 

  wc.begin(true); // 初始化使用OLED顯示器連線函式庫

  // 啟動函式庫內建偵錯副程式

  wc.setDebug(true);

  // 設定連線回應副程式 

  wc.setAPCallback(configModeCallback);

  //wc.screenTest(); //test screen by cycling through the presete screens

  // 啟動WiFi連線參數清除

  //  wc.resetSettings(); //helper to remove the stored wifi connection, comment out after first upload and re upload

 

    /*

       AP_NONE = Continue executing code

       AP_LOOP = Trap in a continuous loop

       AP_RESET = Restart the chip

    */

    if ( !wc.autoConnect()) { // try to connect to wifi

      // 測試ESPXX系列晶片有沒有再自動連上WiFi分享器

      LED_Blink(5,300);

      wc.startConfigurationPortal(AP_LOOP);//如果晶片沒連線則進入設定模式

    }

 

}

 

void setup() {

  Serial.begin(115200);

  pinMode(indLED,OUTPUT);

  pinMode(setConnectPin,INPUT_PULLUP);

  digitalWrite(indLED,1);

  Serial.println();

  Serial.println("Program Start!");

  Serial.println("程式開始!");

  delay(100);

 

  // 啟動WiFi連線副程式

  startWiFi();

  // WiFi連線成功 :

  Serial.println();

  Serial.print("WiFi Connected, IP address: ");

  Serial.println(WiFi.localIP());

  Serial.print("連線成功, 本地WiFi的IP位址為 : ");

  Serial.println(WiFi.localIP());

  Serial.println();

 

  LED_Blink(5,400);

  delay(1000);

  digitalWrite(indLED,0);     // 最後讓指示LED恆亮代表已經連線成功

  delay(1000);

}

 

void loop() {

  delay(100);

 

  wc.displayLoop();

  if (WiFi.status() != WL_CONNECTED) {

    if (!wc.autoConnect()) wc.startConfigurationPortal(AP_RESET);

  }

}

 

 

// 讓指示LED快閃count次,亮滅時間為dTime秒

void LED_Blink(int count,int dTime)

{

  for(int i=0;i<count;i++)        

  {

    digitalWrite(indLED,0);

    delay(dTime);

    digitalWrite(indLED,1);

    delay(200);

  }  

}



程式名稱ESP_CH7_AutoConnectOLED0.ino


在程式的第一行先宣告本範例主要的函式庫"WiFiConnectOLED.h"這個函式庫和上一個範例用到的只差了”OLED”這幾個字很明顯就可以看出來會使用到OLED顯示器;不過原作者並未採用之前介紹過的Adafruit公司的函式庫而是另外一個名為”SSD1306.h”的函式庫這個函式庫還引用了另外一個專門在處理I2C介面匯流排的"Wire.h"函式庫使用者可以不用管他們之間的關係只要直接帶入就好。


  1. #include "WiFiConnectOLED.h" // include before SSD1306.h 

  2. #include <Wire.h>  // 使用I2C匯流排必須因用的函式庫

  3. #include "SSD1306.h" // OLED顯示器所使用的函式庫


由於原作者在開始設計這個函式庫時,就考慮到可以同時給ESP8266及ESP32兩種系列的晶片使用,所以在程式前面的編譯引入部分(11~17行),就把這兩種晶片的條件考慮進去了;因此如果在編譯程式時選的是ESP32系列的晶片,就會以第12行的宣告去定義OLED顯示器所使用的接腳,反之如果選的是ESP8266系列的晶片,就會以第15行的宣告去定義。


  1. #ifdef ESP32

  2. SSD1306  display(0x3c, 21, 22); // 定義ESP32所使用的I2C匯流排腳位

  3. #define oledPWR 16 //Pin to supply power to OLED

  4. #else

  5. SSD1306  display(0x3c, 4, 5); // 定義ESP8266所使用的I2C匯流排腳位

  6. #define oledPWR -1 //Pin to supply power to OLED

  7. #endif


SSD1306  display(0x3c, 4, 5);


在上面所宣告的「display()」這個OLED物件變數後面括弧中的三個參數,第一個是系統使用的OLED顯示器它在I2C匯流排上所占用的位址,而接著的第二、三兩個參數則分別是I2C匯流排的SDA和SCL這兩根接腳的號碼,這些腳位值跟前面電路圖部分必須相同!

如果仔細比較本範例程式與上一個的不同之處其實只有兩個地方而已分別是下面宣告的WiFi連線物件變數的類別(第19行多了”OLED”這幾個字)和初始化部分(setup())的第32行多了一個初始化OLED顯示器的指令其他的部分可說幾乎一模一樣也就是說使用者要不要加上OLED顯示器作為連線時的人機溝通介面基本上不需要多做改變可說是非常容易轉換。


  1.  WiFiConnectOLED wc(&display, oledPWR);  //宣告一WiFiConnectOLED類別物件變數


32.   wc.begin(true); // 初始化使用OLED顯示器連線函式庫


由於本範例程式其他的部分和上一個相同在此就不多贅訴請自行參閱上一小節的說明。


執行結果:

前面的【圖七•1-3_1】至圖七•1-3_4】其實就是此範例程式執行結果影片畫面的截圖至於下面的第一段影片是ESPXX晶片使用OLED顯示器開機後啟動連線未連上WiFi分享器進入AP模式及設定畫面若3分鐘未進入連線狀態就必須按下重置(Reset)鍵重新開始由於等待時畫面會停在AP模式要看到最後重置畫面可快轉到最後面


https://youtu.be/OxT4eJBiZwE


而第二段影片則是ESPXX晶片使用OLED顯示器開機後啟動連線成功連上WiFi分享器畫面這時OLED顯示器上會顯示分配到的本地IP位址也就是圖七•1-3_4的內容


https://youtu.be/OxT4eJBiZwE

沒有留言:

張貼留言