#include <U8g2lib.h>
#include <Wire.h>
#include <WiFi.h>
#include <time.h>
// 创建OLED显示对象(I2C通信)
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// WiFi配置
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NTP服务器
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 28800; // 东八区 (8*60*60)
const int daylightOffset_sec = 0;
// 星期数组
const char* weekDays[] = {"日", "一", "二", "三", "四", "五", "六"};
// 农历月份
const char* lunarMonths[] = {"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊"};
const char* lunarDays[] = {"初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"};
void setup() {
Serial.begin(115200);
// 初始化OLED
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 设置中文字体
// 连接WiFi
u8g2.clearBuffer();
u8g2.setCursor(0, 15);
u8g2.print("正在连接WiFi...");
u8g2.sendBuffer();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// 配置时间
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}
// 农历转换函数(简化版本,实际使用需要更复杂的算法)
void getLunarDate(struct tm *t, char* lunarStr) {
// 这里应该添加公历转农历的算法
// 以下只是示例
int lunarMonth = (t->tm_mon + 2) % 12; // 简单偏移
int lunarDay = (t->tm_mday - 1) % 30; // 简单计算
sprintf(lunarStr, "农历 %s月%s",
lunarMonths[lunarMonth],
lunarDays[lunarDay]);
}
void loop() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("获取时间失败");
return;
}
u8g2.clearBuffer();
// 第一行:日期和星期
char dateStr[30];
sprintf(dateStr, "%04d-%02d-%02d 星期%s",
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
weekDays[timeinfo.tm_wday]);
u8g2.setCursor(10, 15);
u8g2.print(dateStr);
// 第二行:时间
char timeStr[20];
sprintf(timeStr, "%02d:%02d:%02d",
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec);
// 使用更大的字体显示时间
u8g2.setFont(u8g2_font_logisoso24_tr); // 使用大字体
u8g2.setCursor(10, 45);
u8g2.print(timeStr);
// 用于存储农历日期的字符串
char lunarStr[32];
// 调用农历转换函数
getLunarDate(&timeinfo, lunarStr);
// 第三行:农历日期
u8g2.setFont(u8g2_font_wqy12_t_gb2312); // 切回中文字体
// 这里使用简单的农历显示(实际应该使用农历转换算法)
u8g2.setCursor(10, 62);
u8g2.print(lunarStr); // 这里需要添加农历转换
u8g2.sendBuffer();
delay(1000); // 每秒更新一次
}