# 关于本项目 本项目使用了以下开源库:
- **WiFi库**:Arduino的WiFi库,用于连接到无线网络。该库是Arduino IDE的一部分,无需额外安装。
- **TimeLib**:用于处理时间和日期的库。可以从[Arduino Playground](https://playground.arduino.cc/Code/Time/)获取更多信息。
- **U8g2库**:用于驱动各种单色OLED和LCD显示屏的库。详细信息和文档可以在[U8g2的GitHub仓库](https://github.com/olikraus/U8g2_Arduino)找到。
硬件清单:
ESP32、0.96寸OLED(7管脚)、面包板、杜邦线若干。
接线:
OLED ESP32
GND:GND(右),
VCC : 3V3,
D0 : D18,
D1 : D13,
RES : D15,
DC : D2,
CS : D4
代码部分:
#include <WiFi.h> // 引入WiFi库,用于WiFi连接
#include <TimeLib.h> // 引入Time库,用于处理时间
#include <U8g2lib.h> // 引入U8g2库,用于OLED显示屏的控制
#define SCREEN_WIDTH 128 // 显示屏宽度
#define SCREEN_HEIGHT 64 // 显示屏高度
const char* ssid = ""; // WiFi名称
const char* password = ""; // WiFi密码
const char* ntpServer = "ntp.neu.edu.cn"; // 主NTP服务器
const char* ntpServerBackup = "pool.ntp.org"; // 备用NTP服务器
const long gmtOffset_sec = 28800; // GMT+8 // GMT+8时区偏移量,单位秒
// 初始化OLED显示屏对象
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, 18, 13, 4, 2, 15);
// 上次从NTP服务器更新时间的时间戳
unsigned long lastNTPTime = 0;
// 声明更新时间显示的函数
void updateTimeDisplay();
void setup() {
Serial.begin(115200); // 初始化串口通信,设置波特率为115200
// 连接到WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // 打印点号表示正在连接
}
Serial.println("");
Serial.println("WiFi连接成功");
// 初始化NTP并获取初始时间
configTime(gmtOffset_sec, 0, ntpServer, ntpServerBackup);
while (time(nullptr) < 1609459200 || (millis() - lastNTPTime) < 30000) {
delay(500); // 等待直到获取到有效时间
}
lastNTPTime = millis(); // 更新上次NTP更新时间
// 初始化OLED显示屏
u8g2.begin();
u8g2.setFont(u8g2_font_6x12_tr); // 设置字体
// 更新并显示时间
updateTimeDisplay();
}
void loop() {
// 每秒更新显示
updateTimeDisplay();
// 每小时检查一次是否需要从NTP更新时间
if ((millis() - lastNTPTime) > 3600000) { //millis()函数返回自程序启动以来的毫秒数
configTime(gmtOffset_sec, 0, ntpServer, ntpServerBackup);
while (time(nullptr) <= lastNTPTime) {
delay(100); // 等待直到NTP时间更新
}
lastNTPTime = millis(); // 更新上次NTP更新时间
}
delay(1000); // 等待一秒再次更新
}
void updateTimeDisplay() { // 获取当前时间
time_t now = time(nullptr);
struct tm *timeinfo = localtime(&now);
// 格式化时间和日期字符串
char timeStr[9];
char dateStr[11]; // 为日期字符串分配足够的空间,包括结尾的'\0'
snprintf(timeStr, sizeof(timeStr), "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
snprintf(dateStr, sizeof(dateStr), "%04d-%02d-%02d", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);
// 清除显示屏缓冲区并绘制时间和日期
u8g2.firstPage();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x12_tr);
u8g2.drawStr(0, 12, "Current Time:");
u8g2.drawStr(0, 24, timeStr);
u8g2.drawStr(0, 36, "Date:"); // 添加日期标题
u8g2.drawStr(50, 36, dateStr); // 从屏幕中央开始显示日期
u8g2.sendBuffer();
}






