【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器
项目之十一:OLED 显示日期、时间、星期和温度
模块参考电原理图

实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块 IIC/I2C接口 实时计时传感器
项目之十一:OLED 显示日期、时间、星期和温度
*/
#include <Wire.h> // **引入 I2C 通信库**
#include <RTClib.h> // **引入 DS3231 RTC 库**
#include <Adafruit_SSD1306.h> // **引入 Adafruit SSD1306 OLED 显示库**
RTC_DS3231 rtc; // **创建 DS3231 RTC 对象**
#define SCREEN_WIDTH 128 // **OLED 屏幕宽度(单位:像素)**
#define SCREEN_HEIGHT 64 // **OLED 屏幕高度(单位:像素)**
// **创建 OLED 显示对象,使用 I2C 进行通信**
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// **定义星期数组**
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup() {
Serial.begin(9600); // **初始化串口通信**
// **初始化 OLED 显示屏**
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // **设置 I2C 地址为 0x3C**
Serial.println("SSD1306 显示屏初始化失败");
while (true); // **进入死循环,防止继续执行错误代码**
}
// **清除 OLED 屏幕并显示空白**
display.clearDisplay();
display.display();
// **初始化 DS3231 RTC 模块**
if (!rtc.begin()) {
Serial.println("找不到 RTC 模块");
while (true); // **进入死循环,避免继续执行错误代码**
}
// **如果 RTC 断电,自动设置时间**
if (rtc.lostPower()) {
Serial.println("RTC 断电!正在设置时间...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // **设置 RTC 时间为编译时系统时间**
}
// **如果需要手动设置时间,请取消注释以下代码**
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
// **从 RTC 获取当前时间**
DateTime now = rtc.now();
// **清除 OLED 显示缓冲区**
display.clearDisplay();
// **显示日期**
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Date: ");
display.print(now.year()); // **打印年份**
display.print("-");
if (now.month() < 10) display.print("0"); // **补零**
display.print(now.month()); // **打印月份**
display.print("-");
if (now.day() < 10) display.print("0"); // **补零**
display.print(now.day()); // **打印日期**
// **显示时间**
display.setCursor(0, 15);
display.print("Time: ");
if (now.hour() < 10) display.print("0"); // **补零**
display.print(now.hour()); // **打印小时**
display.print(":");
if (now.minute() < 10) display.print("0"); // **补零**
display.print(now.minute()); // **打印分钟**
display.print(":");
if (now.second() < 10) display.print("0"); // **补零**
display.print(now.second()); // **打印秒数**
// **显示星期**
display.setCursor(0, 30);
display.print("Day: ");
display.print(daysOfTheWeek[now.dayOfTheWeek()]); // **获取星期名称**
// **显示 DS3231 传感器温度**
display.setCursor(0, 45);
display.print("Temp: ");
display.print(rtc.getTemperature()); // **读取温度**
display.cp437(true);
display.write(167); // **显示摄氏度符号**
display.print("C");
// **刷新 OLED 显示**
display.display();
delay(1000); // **每秒更新数据**
}
代码简单解读
这段代码使用 DS3231 实时时钟(RTC)模块 和 OLED 显示屏 通过 I2C 通信 显示 当前日期、时间、星期和温度,核心逻辑如下:
1. 初始化硬件
✅ Wire.begin(); → 启动 I2C 通信
✅ display.begin(...); → 初始化 OLED 显示屏(I2C 地址 0x3C)
✅ rtc.begin(); → 初始化 DS3231 RTC
2. 设置 RTC 时间
✅ rtc.lostPower(); → 如果 RTC 断电,则恢复默认时间
✅ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); → 自动设置 RTC 时间为编译时的系统时间
3. 读取当前时间
✅ rtc.now(); → 从 RTC 获取当前时间
✅ 格式化时间为 "YYYY-MM-DD" 和 "HH:MM:SS" 形式
4. 显示内容在 OLED 屏幕上
✅ 日期 → display.print(now.year()); 等显示格式
✅ 时间 → display.print(now.hour()); 等格式化
✅ 星期 → display.print(daysOfTheWeek[now.dayOfTheWeek()]);
✅ 温度 → display.print(rtc.getTemperature());
5. 采集间隔
✅ delay(1000); → 每秒更新一次时间
这段代码让 OLED 显示当前时间,并持续更新。
实验场景图


评论