【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
代码简单解读这段代码使用 DS3231 实时时钟(RTC)模块 和 OLED 显示屏,通过 I2C 通信 实现 时间显示,核心逻辑如下:
1. 初始化硬件
✅ Wire.begin(); → 启动 I2C 通信
✅ oled.begin(...); → 初始化 OLED 显示屏(I2C 地址 0x3C)
✅ rtc.begin(); → 初始化 DS3231 RTC
2. 设置 RTC 时间
✅ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); → 自动设置 RTC 时间为编译时的系统时间
✅ 确保 RTC 运行正确,否则进入死循环
3. 获取当前时间
✅ rtc.now(); → 从 RTC 读取当前时间
✅ 格式化为 "小时:分钟:秒" 形式 并存入 String time
4. 显示时间在 OLED 屏幕上
✅ oledDisplayCenter(time); → 将时间居中显示
✅ 计算文本大小,确保居中
✅ 清除屏幕并更新显示
5. 采集间隔
✅ 每秒刷新一次时间,保证实时性
这段代码让 OLED 显示当前时间,并不断更新。
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验场景图【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验模块接线示意图【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之十一:OLED 显示日期、时间、星期和温度
模块参考电原理图
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验开源代码/*
【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 = {"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);// **获取星期名称**
// **显示 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);// **每秒更新数据**
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
代码简单解读这段代码使用 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);
✅ 温度 → display.print(rtc.getTemperature());
5. 采集间隔
✅ delay(1000); → 每秒更新一次时间
这段代码让 OLED 显示当前时间,并持续更新。
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
实验场景图【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验
【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之十二:在 LCD 上显示 RTC 模块的时间和日期
实验模块接线示意图
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之十二:在 LCD 上显示 RTC 模块的时间和日期
实验开源代码
/*
【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百四十五:DS3231 高精度时钟模块IIC/I2C接口 实时计时传感器
项目之十二:在 LCD 上显示 RTC 模块的时间和日期
*/
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x27 // LCD I2C 地址
#define LCD_COLUMNS 16 // LCD 显示屏的列数
#define LCD_ROWS 2 // LCD 显示屏的行数
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);// 创建 LCD 显示对象
RTC_DS3231 rtc;// 使用 Adafruit RTClib 创建 DS3231 RTC 实例
void setup() {
Serial.begin(9600); // 初始化串口通信
Wire.begin(); // 启动 I2C 通信
lcd.init(); // 初始化 LCD 显示屏
lcd.backlight(); // 开启 LCD 背光
lcd.clear(); // 清屏
// 初始化 RTC
if (!rtc.begin()) {
Serial.println("RTC 初始化失败!");
while (1);// 停止执行
}
// 如果 RTC 断电,则恢复默认时间
if (rtc.lostPower()) {
Serial.println("RTC 断电!正在设置时间...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime dt = rtc.now();// 获取当前时间
// 显示时间
lcd.setCursor(4, 0);
lcd.print(dt.hour());
lcd.print(":");
lcd.print(dt.minute());
lcd.print(":");
lcd.print(dt.second());
// 显示日期
lcd.setCursor(3, 1);
lcd.print(dt.year());
lcd.print("-");
lcd.print(dt.month());
lcd.print("-");
lcd.print(dt.day());
// 串口输出时间
Serial.print("当前时间: ");
Serial.print(dt.year()); Serial.print("-");
Serial.print(dt.month()); Serial.print("-");
Serial.print(dt.day()); Serial.print(" ");
Serial.print(dt.hour()); Serial.print(":");
Serial.print(dt.minute()); Serial.print(":");
Serial.println(dt.second());
delay(500);// 每 500 毫秒更新一次
}
【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块
代码简单解读这段代码使用 DS3231 实时时钟(RTC) 和 LCD 显示屏 通过 I2C 通信 显示当前时间和日期,核心逻辑如下:
1. 初始化硬件
✅ Wire.begin(); → 启动 I2C 通信
✅ rtc.begin(); → 初始化 DS3231 RTC
✅ lcd.init(); → 初始化 LCD 显示屏
✅ lcd.backlight(); → 开启 LCD 背光
2. 设置 RTC 时间
✅ rtc.lostPower(); → 如果 RTC 断电,则恢复默认时间
✅ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); → 自动设置 RTC 时间为编译时的系统时间
3. 获取当前时间
✅ rtc.now(); → 从 RTC 获取当前时间
✅ 格式化时间为 "HH:MM:SS" 形式
✅ 格式化日期为 "YYYY-MM-DD" 形式
4. 显示内容在 LCD 屏幕上
✅ 时间 → lcd.print(dt.hour()); 等格式化
✅ 日期 → lcd.print(dt.year()); 等格式化
5. 采集间隔
✅ delay(500); → 每 500 毫秒更新一次时间
这段代码让 LCD 显示当前时间,并持续更新。