1075浏览
楼主: 驴友花雕

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

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 18:30:42

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




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 18:35:38

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

实验场景图

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 18:38:55

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

实验模块接线示意图

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 19:03:53

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

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

模块参考电原理图

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 19:06:28

【花雕学编程】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. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 19:08:41

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





回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-11 19:12:52

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

实验场景图

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-12 05:26:41

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 11:01:56

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 11:58:10

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

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

实验模块接线示意图

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

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 12:00:47

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之十二:在 LCD 上显示 RTC 模块的时间和日期
  5. */
  6. #include <Wire.h>
  7. #include <RTClib.h>
  8. #include <LiquidCrystal_I2C.h>
  9. #define LCD_ADDRESS 0x27    // LCD I2C 地址
  10. #define LCD_COLUMNS 16      // LCD 显示屏的列数
  11. #define LCD_ROWS 2          // LCD 显示屏的行数
  12. LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);  // 创建 LCD 显示对象
  13. RTC_DS3231 rtc;  // 使用 Adafruit RTClib 创建 DS3231 RTC 实例
  14. void setup() {
  15.     Serial.begin(9600);    // 初始化串口通信
  16.     Wire.begin();          // 启动 I2C 通信
  17.     lcd.init();            // 初始化 LCD 显示屏
  18.     lcd.backlight();       // 开启 LCD 背光
  19.     lcd.clear();           // 清屏
  20.     // 初始化 RTC
  21.     if (!rtc.begin()) {
  22.         Serial.println("RTC 初始化失败!");
  23.         while (1);  // 停止执行
  24.     }
  25.     // 如果 RTC 断电,则恢复默认时间
  26.     if (rtc.lostPower()) {
  27.         Serial.println("RTC 断电!正在设置时间...");
  28.         rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  29.     }
  30. }
  31. void loop() {
  32.     DateTime dt = rtc.now();  // 获取当前时间
  33.     // 显示时间
  34.     lcd.setCursor(4, 0);
  35.     lcd.print(dt.hour());
  36.     lcd.print(":");
  37.     lcd.print(dt.minute());
  38.     lcd.print(":");
  39.     lcd.print(dt.second());
  40.     // 显示日期
  41.     lcd.setCursor(3, 1);
  42.     lcd.print(dt.year());
  43.     lcd.print("-");
  44.     lcd.print(dt.month());
  45.     lcd.print("-");
  46.     lcd.print(dt.day());
  47.     // 串口输出时间
  48.     Serial.print("当前时间: ");
  49.     Serial.print(dt.year()); Serial.print("-");
  50.     Serial.print(dt.month()); Serial.print("-");
  51.     Serial.print(dt.day()); Serial.print(" ");
  52.     Serial.print(dt.hour()); Serial.print(":");
  53.     Serial.print(dt.minute()); Serial.print(":");
  54.     Serial.println(dt.second());
  55.     delay(500);  // 每 500 毫秒更新一次
  56. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 12:06:14

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 12:09:51

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

实验串口返回情况

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 12:12:25

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

实验场景图

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2025-5-13 19:07:19

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

电原理图

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

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail