#include <Wire.h> // 引入Wire庫,用於I2C通信
#include <WiFi.h> // 引入WiFi庫,用於WiFi連接
#include <time.h> // 引入time庫,用於時間處理
#include <Adafruit_GFX.h> // 引入Adafruit_GFX庫,用於圖形顯示
#include <Adafruit_SSD1306.h> // 引入Adafruit_SSD1306庫,用於控制SSD1306 OLED顯示器
#define SCREEN_WIDTH 128 // 定義顯示器的寬度為128像素
#define SCREEN_HEIGHT 64 // 定義顯示器的高度為64像素
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // 建立Adafruit_SSD1306顯示器物件
const char *ssid = "654321"; // WiFi SSID
const char *password = "12345678"; // WiFi 密碼
const char *ntpServer = "pool.ntp.org"; // NTP 伺服器地址
const long gmtOffset_sec = 28800; // GMT 時差,這裡設為 +8 小時 (28800 秒)
const int daylightOffset_sec = 0; // 夏令時偏移量,這裡設為 0
bool OLEDStatus = true; // OLED 顯示器狀態標誌
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率設定為 9600
// 初始化SSD1306 OLED顯示器
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD130 allocation failed")); // 如果初始化失敗,打印錯誤信息
OLEDStatus = false; // 設定 OLED 顯示器狀態為 false
}
// 嘗試連接到WiFi基地台
Serial.printf("嘗試連到基地台 %s", ssid); // 輸出連接信息
WiFi.begin(ssid, password); // 開始連接到WiFi
// 等待WiFi連接成功
while (WiFi.status() != WL_CONNECTED) {
delay(5000); // 每5秒檢查一次連接狀態
Serial.print("."); // 輸出一個點表示正在連接
}
Serial.println("已連線到基地台"); // 輸出連接成功信息
// 設置NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // 配置時間
}
void loop() {
struct tm timeinfo; // 宣告一個tm結構體變數,用於儲存時間信息
// 獲取當前時間
if (!getLocalTime(&timeinfo)) {
Serial.println("時間取回失敗"); // 如果獲取時間失敗,打印錯誤信息
return; // 返回,結束本次循環
}
// 打印時間到串口
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
// 如果OLED顯示器可用,顯示時間
if (OLEDStatus == true) {
display.clearDisplay(); // 清空顯示器的顯示內容
display.setTextSize(2); // 設定文本大小為2倍
display.setTextColor(WHITE); // 設定文本顏色為白色
display.setCursor(4, 0); // 設定文本輸出位置
display.setTextColor(WHITE, BLACK); // 設定文本顏色為白色,背景為黑色
display.println(&timeinfo, "%F"); // 顯示日期
display.setCursor(24, 16); // 設定文本輸出位置
display.println(&timeinfo, "%A"); // 顯示星期
display.setCursor(16, 48); // 設定文本輸出位置
display.println(&timeinfo, "%T"); // 顯示時間
display.display(); // 更新OLED顯示器的顯示內容
}
delay(1000); // 延遲1秒
}