312浏览
查看: 312|回复: 56

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

[复制链接]
本帖最后由 驴友花雕 于 2025-5-13 19:03 编辑

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器


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


驴友花雕  中级技神
 楼主|

发表于 4 天前

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之八:通过 I2C 通信 接收用户输入的时间数据并更新时钟
  5. */
  6. #include <DS3231.h>  // 引入 DS3231 RTC 库
  7. #include <Wire.h>    // 引入 I2C 通信库
  8. // **创建 DS3231 RTC 对象**
  9. DS3231 myRTC;
  10. // **定义时间变量**
  11. byte year, month, date, dow;  // 年、月、日、星期
  12. byte hour, minute, second;    // 时、分、秒
  13. bool century = false;  // 用于跨世纪判断
  14. bool h12Flag;          // 12 小时制标志
  15. bool pmFlag;           // PM 标志(仅用于 12 小时制)
  16. /*****************************************************************************************************
  17. * **初始化**
  18. *  - 开启串口和 I2C 通信
  19. *  - 解释程序的使用方法
  20. *****************************************************************************************************/
  21. void setup() {
  22.     Serial.begin(57600);  // **初始化串口,波特率 57600**
  23.     Wire.begin();  // **启动 I2C 通信**
  24.    
  25.     // **等待 4 秒,确保 RTC 启动稳定**
  26.     delay(4000);
  27.     // **向用户解释时间格式**
  28.     Serial.println("时间格式:YYMMDDwhhmmssx");
  29.     Serial.println("其中:");
  30.     Serial.println("  YY = 年(如 20 表示 2020 年)");
  31.     Serial.println("  MM = 月(如 04 表示 4 月)");
  32.     Serial.println("  DD = 日期(如 09 表示 9 号)");
  33.     Serial.println("  w  = 星期(1-7,1=星期天,5=星期四)");
  34.     Serial.println("  hh = 24 小时制小时数(如 09 表示上午 9 点,21 表示晚上 9 点)");
  35.     Serial.println("  mm = 分钟(如 02)");
  36.     Serial.println("  ss = 秒(如 42)");
  37.     Serial.println("例如输入:2004095090242x");
  38.     Serial.println("-----------------------------------------------------------------------------");
  39.     Serial.println("请在串口输入时间,并以 'x' 结尾以设置 DS3231 的时间:");
  40. }
  41. /*****************************************************************************************************
  42. * **主循环**
  43. *  - 监听串口输入的时间校正数据
  44. *  - 根据输入设置 DS3231 的时钟
  45. *  - 在 5 秒内回显 DS3231 时间
  46. *****************************************************************************************************/
  47. void loop() {
  48.     // **如果串口收到输入数据,则进行时间校正**
  49.     if (Serial.available()) {
  50.         inputDateFromSerial();  // 读取串口数据并解析时间
  51.         myRTC.setClockMode(false);  // **设置 24 小时模式**
  52.         
  53.         // **将输入的时间写入 DS3231**
  54.         myRTC.setYear(year);
  55.         myRTC.setMonth(month);
  56.         myRTC.setDate(date);
  57.         myRTC.setDoW(dow);
  58.         myRTC.setHour(hour);
  59.         myRTC.setMinute(minute);
  60.         myRTC.setSecond(second);
  61.         // **连续 5 秒,每秒打印 DS3231 当前时间**
  62.         for (uint8_t i = 0; i < 5; i++) {
  63.             delay(1000);
  64.             Serial.print(myRTC.getYear(), DEC);
  65.             Serial.print("-");
  66.             Serial.print(myRTC.getMonth(century), DEC);
  67.             Serial.print("-");
  68.             Serial.print(myRTC.getDate(), DEC);
  69.             Serial.print(" ");
  70.             Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);  // 24 小时制
  71.             Serial.print(":");
  72.             Serial.print(myRTC.getMinute(), DEC);
  73.             Serial.print(":");
  74.             Serial.println(myRTC.getSecond(), DEC);
  75.         }
  76.         // **提示用户输入新时间**
  77.         Serial.println("请在串口输入新的时间,并以 'x' 结尾以设置 DS3231:");
  78.     }
  79.     delay(1000);  // 每秒刷新一次
  80. }
  81. /*****************************************************************************************************
  82. * **inputDateFromSerial**
  83. *  - 读取用户串口输入的时间数据
  84. *  - 解析并存储到全局变量
  85. *****************************************************************************************************/
  86. void inputDateFromSerial() {
  87.     // **检查串口数据是否完整(结束字符为 'x')**
  88.     boolean isStrComplete = false;
  89.     char inputChar;
  90.     byte temp1, temp2;
  91.     char inputStr[20];  // 存储输入的时间字符串
  92.     uint8_t currentPos = 0;
  93.     while (!isStrComplete) {
  94.         if (Serial.available()) {
  95.             inputChar = Serial.read();
  96.             inputStr[currentPos] = inputChar;
  97.             currentPos += 1;
  98.             // **检查输入是否以 'x' 结尾**
  99.             if (inputChar == 'x') {
  100.                 isStrComplete = true;
  101.             }
  102.         }
  103.     }
  104.     Serial.println(inputStr);  // **打印用户输入的数据**
  105.     // **查找字符串中的 'x' 位置**
  106.     int posX = -1;
  107.     for (uint8_t i = 0; i < 20; i++) {
  108.         if (inputStr[i] == 'x') {
  109.             posX = i;
  110.             break;
  111.         }
  112.     }
  113.     // **ASCII 码 '0' 的值(用于转换字符为数字)**
  114.     uint8_t zeroAscii = '0';
  115.     // **解析年**
  116.     temp1 = (byte)inputStr[posX - 13] - zeroAscii;
  117.     temp2 = (byte)inputStr[posX - 12] - zeroAscii;
  118.     year = temp1 * 10 + temp2;
  119.     // **解析月**
  120.     temp1 = (byte)inputStr[posX - 11] - zeroAscii;
  121.     temp2 = (byte)inputStr[posX - 10] - zeroAscii;
  122.     month = temp1 * 10 + temp2;
  123.     // **解析日期**
  124.     temp1 = (byte)inputStr[posX - 9] - zeroAscii;
  125.     temp2 = (byte)inputStr[posX - 8] - zeroAscii;
  126.     date = temp1 * 10 + temp2;
  127.     // **解析星期**
  128.     dow = (byte)inputStr[posX - 7] - zeroAscii;
  129.     // **解析小时**
  130.     temp1 = (byte)inputStr[posX - 6] - zeroAscii;
  131.     temp2 = (byte)inputStr[posX - 5] - zeroAscii;
  132.     hour = temp1 * 10 + temp2;
  133.     // **解析分钟**
  134.     temp1 = (byte)inputStr[posX - 4] - zeroAscii;
  135.     temp2 = (byte)inputStr[posX - 3] - zeroAscii;
  136.     minute = temp1 * 10 + temp2;
  137.     // **解析秒**
  138.     temp1 = (byte)inputStr[posX - 2] - zeroAscii;
  139.     temp2 = (byte)inputStr[posX - 1] - zeroAscii;
  140.     second = temp1 * 10 + temp2;
  141. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之九:读取当前时间、温度和闹钟状态

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之九:读取当前时间、温度和闹钟状态
  5. */
  6. #include <DS3231.h>  // 引入DS3231时钟库
  7. #include <Wire.h>     // 引入I2C通信库
  8. DS3231 myRTC;        // 创建DS3231对象
  9. bool century = false; // 世纪标志位(20xx年为false,21xx年为true)
  10. bool h12Flag;         // 12小时制标志
  11. bool pmFlag;          // 下午标志(仅在12小时制下有效)
  12. byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits; // 闹钟参数
  13. bool alarmDy, alarmH12Flag, alarmPmFlag; // 闹钟日期/星期标志和12小时制标志
  14. void setup() {
  15.   // 初始化I2C通信(SDA:A4, SCL:A5)
  16.   Wire.begin();
  17.   
  18.   // 初始化串口通信,波特率57600
  19.   Serial.begin(57600);
  20. }
  21. void loop() {
  22.   // 向串口监视器发送当前时钟信息
  23.   
  24.   // 显示年份(20xx格式)
  25.   Serial.print("2");
  26.   if (century) {      // 21世纪(此标志在未来89年内不会用到)
  27.     Serial.print("1");
  28.   } else {
  29.     Serial.print("0");
  30.   }
  31.   Serial.print(myRTC.getYear(), DEC);  // 显示年份后两位
  32.   Serial.print(' ');
  33.   
  34.   // 显示月份
  35.   Serial.print(myRTC.getMonth(century), DEC);
  36.   Serial.print(" ");
  37.   
  38.   // 显示日期
  39.   Serial.print(myRTC.getDate(), DEC);
  40.   Serial.print(" ");
  41.   
  42.   // 显示星期(1-7对应周日到周六)
  43.   Serial.print(myRTC.getDoW(), DEC);
  44.   Serial.print(" ");
  45.   
  46.   // 显示时分秒
  47.   Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
  48.   Serial.print(" ");
  49.   Serial.print(myRTC.getMinute(), DEC);
  50.   Serial.print(" ");
  51.   Serial.print(myRTC.getSecond(), DEC);
  52.   
  53.   // 添加AM/PM指示(仅在12小时制下有效)
  54.   if (h12Flag) {
  55.     if (pmFlag) {
  56.       Serial.print(" PM ");
  57.     } else {
  58.       Serial.print(" AM ");
  59.     }
  60.   } else {
  61.     Serial.print(" 24h ");  // 24小时制显示
  62.   }
  63.   
  64.   // 显示温度(DS3231内置高精度温度传感器)
  65.   Serial.print("T=");
  66.   Serial.print(myRTC.getTemperature(), 2);  // 显示温度,保留两位小数
  67.   
  68.   // 显示振荡器状态(O+表示正常,O-表示振荡器可能停止)
  69.   if (myRTC.oscillatorCheck()) {
  70.     Serial.print(" O+");  // 振荡器正常工作
  71.   } else {
  72.     Serial.print(" O-");  // 振荡器可能停止,时间可能不准确
  73.   }
  74.   
  75.   // 显示闹钟触发状态
  76.   if (myRTC.checkIfAlarm(1)) {
  77.     Serial.print(" A1!");  // 闹钟1触发
  78.   }
  79.   
  80.   if (myRTC.checkIfAlarm(2)) {
  81.     Serial.print(" A2!");  // 闹钟2触发
  82.   }
  83.   
  84.   // 换行
  85.   Serial.println();
  86.   
  87.   // 显示闹钟1设置信息
  88.   Serial.print("Alarm 1: ");
  89.   myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
  90.   Serial.print(alarmDay, DEC);
  91.   if (alarmDy) {
  92.     Serial.print(" DoW");  // 按星期触发
  93.   } else {
  94.     Serial.print(" Date"); // 按日期触发
  95.   }
  96.   Serial.print(' ');
  97.   Serial.print(alarmHour, DEC);
  98.   Serial.print(' ');
  99.   Serial.print(alarmMinute, DEC);
  100.   Serial.print(' ');
  101.   Serial.print(alarmSecond, DEC);
  102.   Serial.print(' ');
  103.   if (alarmH12Flag) {
  104.     if (alarmPmFlag) {
  105.       Serial.print("pm ");
  106.     } else {
  107.       Serial.print("am ");
  108.     }
  109.   }
  110.   if (myRTC.checkAlarmEnabled(1)) {
  111.     Serial.print("enabled");  // 闹钟1已启用
  112.   }
  113.   Serial.println();
  114.   
  115.   // 显示闹钟2设置信息
  116.   Serial.print("Alarm 2: ");
  117.   myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
  118.   Serial.print(alarmDay, DEC);
  119.   if (alarmDy) {
  120.     Serial.print(" DoW");  // 按星期触发
  121.   } else {
  122.     Serial.print(" Date"); // 按日期触发
  123.   }
  124.   Serial.print(" ");
  125.   Serial.print(alarmHour, DEC);
  126.   Serial.print(" ");
  127.   Serial.print(alarmMinute, DEC);
  128.   Serial.print(" ");
  129.   if (alarmH12Flag) {
  130.     if (alarmPmFlag) {
  131.       Serial.print("pm");
  132.     } else {
  133.       Serial.print("am");
  134.     }
  135.   }
  136.   if (myRTC.checkAlarmEnabled(2)) {
  137.     Serial.print("enabled");  // 闹钟2已启用
  138.   }
  139.   
  140.   // 显示闹钟触发条件位(二进制格式)
  141.   Serial.println();
  142.   Serial.print("Alarm bits: ");
  143.   Serial.println(alarmBits, BIN);
  144.   
  145.   // 空行分隔,每秒更新一次
  146.   Serial.println();
  147.   delay(1000);
  148. }   
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 天前

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

实验模块接线示意图

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

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

库安装
为了在我们的项目中使用 DS3231 模块,我们将使用一个名为 uRTCLib 的特殊库。该库使从 RTC 读取时间数据变得超级简单。
尽管 uRTCLib 易于使用,但它也非常强大。与许多其他 RTC 库不同,它支持昼夜闹钟,并允许您控制 SQW(方波)输出。

要安装库
1. 首先打开您的 Arduino IDE 程序。然后点击 库管理器 左侧边栏上的图标。
2. 在搜索框中键入 “urtclib” 以筛选结果。
3. 查找 Naguissa 的 uRTCLib 库。
4. 单击 Install 按钮将其添加到您的 Arduino IDE。

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

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

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之一:读取日期、时间和温度
  5. */
  6. #include "Arduino.h"
  7. #include "uRTCLib.h"
  8. // 初始化 RTC 模块(I2C 地址 0x68)
  9. uRTCLib rtc(0x68);
  10. // 定义星期名称数组
  11. char daysOfTheWeek[7][12] = {
  12.     "Sunday", "Monday", "Tuesday", "Wednesday",
  13.     "Thursday", "Friday", "Saturday"
  14. };
  15. void setup() {
  16.     Serial.begin(9600);  // 初始化串口通讯
  17.     URTCLIB_WIRE.begin();  // 初始化 I2C
  18.     // 设置 RTC 时间(仅需要设置一次,设置后可注释掉)
  19.     // 例如:2025年5月11日 12:56
  20.     rtc.set(0, 00, 6, 7, 11, 5, 25);  
  21.     // rtc.set(秒, 分钟, 小时, 星期, 日期, 月份, 年份)
  22.     // 星期: 1=星期天, 7=星期六
  23. }
  24. void loop() {
  25.     rtc.refresh();  // 更新 RTC 数据
  26.     // 打印当前日期和时间
  27.     Serial.print("Current Date & Time: ");
  28.     Serial.print(rtc.year());
  29.     Serial.print('/');
  30.     Serial.print(rtc.month());
  31.     Serial.print('/');
  32.     Serial.print(rtc.day());
  33.     Serial.print(" (");
  34.     Serial.print(daysOfTheWeek[rtc.dayOfWeek() - 1]);  // 显示星期
  35.     Serial.print(") ");
  36.     Serial.print(rtc.hour());
  37.     Serial.print(':');
  38.     Serial.print(rtc.minute());
  39.     Serial.print(':');
  40.     Serial.println(rtc.second());
  41.     // 打印温度数据
  42.     Serial.print("Temperature: ");
  43.     Serial.print(rtc.temp() / 100);  // 温度除以 100 获取实际值
  44.     Serial.println("°C");
  45.     Serial.println();
  46.     delay(1000);  // 每秒更新一次
  47. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

代码简单解读

这段代码使用 RTC(实时时钟)模块 获取 当前日期、时间和温度数据,并通过 串口输出,核心逻辑如下:

1. 初始化 RTC
✅ uRTCLib rtc(0x68); → 创建 RTC 对象,使用 I2C 地址 0x68
✅ URTCLIB_WIRE.begin(); → 初始化 I2C 通信
✅ rtc.set(0, 56, 12, 2, 14, 4, 25); → 设置 RTC 初始时间(只需运行一次)

2. 读取数据
✅ rtc.refresh(); → 从 RTC 读取最新数据
✅ rtc.year(), rtc.month(), rtc.day() → 获取年、月、日
✅ rtc.hour(), rtc.minute(), rtc.second() → 获取小时、分钟、秒
✅ daysOfTheWeek[rtc.dayOfWeek() - 1] → 从数组获取星期名称

3. 打印时间与温度
✅ Serial.print() → 格式化打印日期、时间和星期
✅ Serial.print(rtc.temp() / 100); Serial.println("°C"); → 转换并输出温度

4. 采集间隔
✅ delay(1000); → 每秒更新一次数据

这段代码让 RTC 模块不断采集时间和温度,并在串口监视器显示。


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验串口返回情况

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验场景图

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

读取和写入板载 24C32 EEPROM 芯片,还需要安装另一个名为 uEEPROMLib 的库。

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之二:读取和写入 24C32 EEPROM

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之二:读取和写入 24C32 EEPROM
  5. */
  6. #include "Arduino.h"
  7. #include "Wire.h"
  8. #include "uEEPROMLib.h"
  9. // 创建 EEPROM 实例,I2C 地址为 0x57
  10. uEEPROMLib eeprom(0x57);
  11. void setup() {
  12.     Serial.begin(9600);  // 初始化串口通信
  13.     Wire.begin();  // 初始化 I2C 通信
  14.     // 定义存储的数据
  15.     int inttmp = 32123;  // 整型数据
  16.     float floattmp = 3.1416;  // 浮点型数据
  17.     char chartmp = 'A';  // 单个字符
  18.     char c_string[] = "https://mc.dfrobot.com.cn";  // 长字符串
  19.     int string_length = strlen(c_string);  // 计算字符串长度
  20.     Serial.println("写进存储记忆......");
  21.     // **存储整型数据**
  22.     if (!eeprom.eeprom_write(0, inttmp)) {
  23.         Serial.println("Failed to store int.");
  24.     } else {
  25.         Serial.println("int was stored correctly.");
  26.     }
  27.     // **存储浮点型数据**
  28.     if (!eeprom.eeprom_write(4, floattmp)) {
  29.         Serial.println("Failed to store float.");
  30.     } else {
  31.         Serial.println("float was stored correctly.");
  32.     }
  33.     // **存储单字符**
  34.     if (!eeprom.eeprom_write(8, chartmp)) {
  35.         Serial.println("Failed to store char.");
  36.     } else {
  37.         Serial.println("char was stored correctly.");
  38.     }
  39.     // **存储长字符串**(从地址 33 开始,未对齐 EEPROM 32 字节页)
  40.     if (!eeprom.eeprom_write(33, (byte *)c_string, string_length)) {
  41.         Serial.println("Failed to store string.");
  42.     } else {
  43.         Serial.println("string was stored correctly.");
  44.     }
  45.     Serial.println("\nReading memory...");
  46.     // **读取并打印存储数据**
  47.     Serial.print("int: ");
  48.     eeprom.eeprom_read(0, &inttmp);
  49.     Serial.println(inttmp);
  50.     Serial.print("float: ");
  51.     eeprom.eeprom_read(4, &floattmp);
  52.     Serial.println((float)floattmp);
  53.     Serial.print("char: ");
  54.     eeprom.eeprom_read(8, &chartmp);
  55.     Serial.println(chartmp);
  56.     Serial.print("string: ");
  57.     eeprom.eeprom_read(33, (byte *)c_string, string_length);
  58.     Serial.println(c_string);
  59.     Serial.println();
  60. }
  61. void loop() {
  62.     // EEPROM 只需在 setup() 进行读写,loop() 为空
  63. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑

代码简单解读

这段代码使用 EEPROM(电子可擦除存储器) 通过 I2C 读取和存储数据,核心逻辑如下:

1. 初始化 EEPROM
✅ uEEPROMLib eeprom(0x57); → 创建 EEPROM 实例,I2C 地址为 0x57
✅ Wire.begin(); → 初始化 I2C 通信
✅ Serial.begin(9600); → 启动串口通信

2. 写入数据
✅ eeprom.eeprom_write(address, data); → 将数据存入 EEPROM
✅ 存储不同类型的数据(整型、浮点数、字符、字符串)
✅ 字符串存储 → (byte *)c_string, strlen(c_string) 确保正确写入

3. 读取数据
✅ eeprom.eeprom_read(address, &data); → 从 EEPROM 读取数据
✅ 按照原地址读出 int、float、char、string
✅ 格式化输出,确保数据存储正确

4. 循环结构
✅ loop() 为空 → 仅在 setup() 进行读写操作

这段代码让 EEPROM 通过 I2C 存储和读取数据,并在串口输出结果。




回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

本帖最后由 驴友花雕 于 2025-5-11 08:09 编辑

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



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之三:使用 DS3231.h 库的应用案例


安装DS3231.h 库(https://github.com/NorthernWidget/DS3231/tree/master

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

  【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  项目之三:使用 DS3231.h 库的应用案例

实验开源代码

  1. /*
  2.   【Arduino】189种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百四十五:DS3231 高精度时钟模块  IIC/I2C接口 实时计时传感器
  4.   项目之三:使用 DS3231.h 库的应用案例
  5. */
  6. #include <Wire.h>
  7. #include <DS3231.h>  // 使用 DS3231 库
  8. // 创建 DS3231 RTC 对象
  9. DS3231 rtc;
  10. void setup() {
  11.     Serial.begin(115200);  // 初始化串口通信
  12.     Wire.begin();  // 启动 I2C
  13. }
  14. void loop() {
  15.     rtc.getTemperature();  // 确保数据更新
  16.     // 读取时间(确保传入参数)
  17.     bool h12, PM_time;
  18.     Serial.print("时间: ");
  19.     Serial.print(rtc.getHour(h12, PM_time));
  20.     Serial.print(":");
  21.     Serial.print(rtc.getMinute());
  22.     Serial.print(":");
  23.     Serial.println(rtc.getSecond());
  24.     // 读取日期
  25.     bool centuryFlag;
  26.     Serial.print("日期: ");
  27.     Serial.print(rtc.getYear());
  28.     Serial.print("/");
  29.     Serial.print(rtc.getMonth(centuryFlag));
  30.     Serial.print("/");
  31.     Serial.println(rtc.getDate());
  32.     // 获取 DS3231 内部温度
  33.     Serial.print("温度: ");
  34.     Serial.print(rtc.getTemperature());
  35.     Serial.println("°C");
  36.     Serial.println();  // 美化输出
  37.     delay(1000);  // 每秒刷新
  38. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 通过 I2C 通信 获取 当前时间、日期和温度,核心逻辑如下:

1. 初始化 RTC
✅ DS3231 rtc; → 创建 DS3231 实例(I2C 默认地址)
✅ Wire.begin(); → 启动 I2C 通信

2. 读取时间
✅ rtc.getHour(h12, PM_time); → 获取小时(24小时制)
✅ rtc.getMinute(); → 获取分钟
✅ rtc.getSecond(); → 获取秒

3. 读取日期
✅ rtc.getYear(); → 获取年份
✅ rtc.getMonth(centuryFlag); → 获取月份(需要参数)
✅ rtc.getDate(); → 获取当天日期

4. 读取温度
✅ rtc.getTemperature(); → 获取 DS3231 内置温度传感器的值

5. 串口输出
✅ 格式化打印时间、日期、星期和温度,确保显示清晰

6. 采集间隔
✅ delay(1000); → 每秒更新一次数据

这段代码让 DS3231 RTC 模块不断读取当前时间、日期和温度,并在串口显示。





回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 4 天前

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

实验串口返回情况

【花雕学编程】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