本實作使用 WeMos LoLin32 開發板配合U8g2程式庫於OLED中顯示訊息。直接將 WeMos LoLin32 以 USB 線連接到開發電腦進行程式編譯上傳即可。使用Arduino IDE 編譯 ESP32 程式前請先確認已經正確選定開發板規格。
ESP32 與 OLED 接腳設定
1. 電源接線:
【ESP32】3.3V →【OLED】VCC
【ESP32】GND →【OLED】GND
2. 信號接線:
【ESP32】22→【ESP-01】SCL
【ESP32】21→【ESP-01】SDA
時間是軟硬體系統與設備中的重要資訊,特別是需要和外部進行資訊交換時更有個校準的標準時間。目前的IOT設備因為都能連上網路,因此都可以藉由網路從網路時間伺服器(NTP)上獲取標準時間,本實作的主角ESP32亦是如此。
1. 使用WiFi 模組以STA或ETH模式連上網。
2. 使用下列函數從網路時間伺服器上獲取並設置時間:
void configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2 = nullptr, const char* server3 = nullptr)
- gmtOffset 參數用來修正時區,比如台灣地區(UTC/GMT+08:00)參數就需填寫28800( 8 * 3600)。
- daylightOffset 參數是夏令時間設置,使用夏令時 daylightOffset_sec 就填寫3600,否則就填寫0,台灣地區就是填0。
- Server參數為網路時間伺服器,最常用的主機為 pool.ntp.org。
bool getLocalTime(struct tm * info, uint32_t ms = 5000)
- ms 為該操作逾時時間,逾時操作回傳false。
- info 是一個 struct tm 結構物件,用於接收當前時間。
#include <WiFi.h> #include <time.h> #include <U8g2lib.h> //引入OLED程式庫 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); const char ssid[]="HUAWEI_B316_5803"; //Wifi基地台ID const char psw[]="justin12200713"; //Wifi連線密碼 const char ntpServer[] = "pool.ntp.org"; const uint16_t utcOffest = 28800; // UTC+8偏移量 const uint8_t daylightOffset = 0; // 夏令時間 void setup() { Serial.begin(115200); u8g2.begin(); //初始顯示器物件 u8g2.setFont(u8g2_font_t0_22b_te); //指定字型 WiFi.begin(ssid, psw); //指定連線資訊 //嘗試間隔0.5秒連線一次,直到連線成功 while (WiFi.status() != WL_CONNECTED) { Serial.print("WIFI連線中 \n"); delay(500); } Serial.print("IP位址:"); Serial.println(WiFi.localIP()); //取回網路標準時間 configTime(utcOffest, daylightOffset, ntpServer); //UCT偏移量,夏日時間,時間伺服器 delay(1000); } void loop() { struct tm now; // 建立時間結構變數 if(!getLocalTime(&now)){ // 測試是否取得本地時間 u8g2.clearBuffer(); //清除暫存區 u8g2.drawStr(5, 55, "ERROR!!"); u8g2.sendBuffer(); //送出繪製內容 return; } //在OLED中顯示日期時間 u8g2.firstPage(); do { u8g2.setCursor(5, 20); u8g2.print(&now, "%Y/%m/%d"); //列印日期 u8g2.setCursor(15, 62); u8g2.print(&now, "%H:%M:%S"); //列印時間 } while ( u8g2.nextPage() ); delay(1000); }順利連上WiFi後,在序列埠顯示目前的本地端IP:
在OLED中顯示即時日期時間:
沒有留言:
張貼留言