220浏览
楼主: 驴友花雕

[项目] 【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 前天 18:30

【花雕学编程】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 显示当前时间,并不断更新。




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 18:35

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 18:38

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验模块接线示意图

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 19:03

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

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

模块参考电原理图

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 19:06

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之十一:OLED 显示日期、时间、星期和温度
  5. */
  6. #include <Wire.h>               // **引入 I2C 通信库**
  7. #include <RTClib.h>             // **引入 DS3231 RTC 库**
  8. #include <Adafruit_SSD1306.h>   // **引入 Adafruit SSD1306 OLED 显示库**
  9. RTC_DS3231 rtc;  // **创建 DS3231 RTC 对象**
  10. #define SCREEN_WIDTH 128  // **OLED 屏幕宽度(单位:像素)**
  11. #define SCREEN_HEIGHT 64  // **OLED 屏幕高度(单位:像素)**
  12. // **创建 OLED 显示对象,使用 I2C 进行通信**
  13. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);  
  14. // **定义星期数组**
  15. char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
  16. void setup() {
  17.     Serial.begin(9600);  // **初始化串口通信**
  18.    
  19.     // **初始化 OLED 显示屏**
  20.     if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {  // **设置 I2C 地址为 0x3C**
  21.         Serial.println("SSD1306 显示屏初始化失败");
  22.         while (true);  // **进入死循环,防止继续执行错误代码**
  23.     }
  24.     // **清除 OLED 屏幕并显示空白**
  25.     display.clearDisplay();
  26.     display.display();
  27.     // **初始化 DS3231 RTC 模块**
  28.     if (!rtc.begin()) {  
  29.         Serial.println("找不到 RTC 模块");
  30.         while (true);  // **进入死循环,避免继续执行错误代码**
  31.     }
  32.     // **如果 RTC 断电,自动设置时间**
  33.     if (rtc.lostPower()) {
  34.         Serial.println("RTC 断电!正在设置时间...");
  35.         rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));  // **设置 RTC 时间为编译时系统时间**
  36.     }
  37.     // **如果需要手动设置时间,请取消注释以下代码**
  38.     // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  39. }
  40. void loop() {
  41.     // **从 RTC 获取当前时间**
  42.     DateTime now = rtc.now();  
  43.     // **清除 OLED 显示缓冲区**
  44.     display.clearDisplay();
  45.     // **显示日期**
  46.     display.setTextSize(1);
  47.     display.setTextColor(WHITE);
  48.     display.setCursor(0, 0);
  49.     display.print("Date: ");
  50.     display.print(now.year());  // **打印年份**
  51.     display.print("-");
  52.     if (now.month() < 10) display.print("0");  // **补零**
  53.     display.print(now.month());  // **打印月份**
  54.     display.print("-");
  55.     if (now.day() < 10) display.print("0");  // **补零**
  56.     display.print(now.day());  // **打印日期**
  57.     // **显示时间**
  58.     display.setCursor(0, 15);
  59.     display.print("Time: ");
  60.     if (now.hour() < 10) display.print("0");  // **补零**
  61.     display.print(now.hour());  // **打印小时**
  62.     display.print(":");
  63.     if (now.minute() < 10) display.print("0");  // **补零**
  64.     display.print(now.minute());  // **打印分钟**
  65.     display.print(":");
  66.     if (now.second() < 10) display.print("0");  // **补零**
  67.     display.print(now.second());  // **打印秒数**
  68.     // **显示星期**
  69.     display.setCursor(0, 30);
  70.     display.print("Day: ");
  71.     display.print(daysOfTheWeek[now.dayOfTheWeek()]);  // **获取星期名称**
  72.     // **显示 DS3231 传感器温度**
  73.     display.setCursor(0, 45);
  74.     display.print("Temp: ");
  75.     display.print(rtc.getTemperature());  // **读取温度**
  76.     display.cp437(true);
  77.     display.write(167);  // **显示摄氏度符号**
  78.     display.print("C");
  79.     // **刷新 OLED 显示**
  80.     display.display();
  81.     delay(1000);  // **每秒更新数据**
  82. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 19:08

【花雕学编程】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[now.dayOfTheWeek()]);
✅ 温度 → display.print(rtc.getTemperature());

5. 采集间隔
✅ delay(1000); → 每秒更新一次时间

这段代码让 OLED 显示当前时间,并持续更新。





回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 前天 19:12

【花雕学编程】Arduino动手做(245)--DS3231高精度时钟模块

实验场景图

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 05:26

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 半小时前

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验

【花雕学编程】Arduino动手做(245)--DS3231模块11个小实验图1
回复

使用道具 举报

123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail