回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕学编程】Arduino动手做(245)---DS3231高精度时钟模块之读取当前时间、温度和闹钟状态 简单

头像 驴友花雕 2025.05.11 14 0

00.jpg
02.jpg
04-.jpg
04--.jpg
06.jpg

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

实验开源代码

 

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

#include <DS3231.h>  // 引入DS3231时钟库
#include <Wire.h>     // 引入I2C通信库

DS3231 myRTC;        // 创建DS3231对象
bool century = false; // 世纪标志位(20xx年为false,21xx年为true)
bool h12Flag;         // 12小时制标志
bool pmFlag;          // 下午标志(仅在12小时制下有效)
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits; // 闹钟参数
bool alarmDy, alarmH12Flag, alarmPmFlag; // 闹钟日期/星期标志和12小时制标志

void setup() {
  // 初始化I2C通信(SDA:A4, SCL:A5)
  Wire.begin();
  
  // 初始化串口通信,波特率57600
  Serial.begin(57600);
}

void loop() {
  // 向串口监视器发送当前时钟信息
  
  // 显示年份(20xx格式)
  Serial.print("2");
  if (century) {      // 21世纪(此标志在未来89年内不会用到)
    Serial.print("1");
  } else {
    Serial.print("0");
  }
  Serial.print(myRTC.getYear(), DEC);  // 显示年份后两位
  Serial.print(' ');
  
  // 显示月份
  Serial.print(myRTC.getMonth(century), DEC);
  Serial.print(" ");
  
  // 显示日期
  Serial.print(myRTC.getDate(), DEC);
  Serial.print(" ");
  
  // 显示星期(1-7对应周日到周六)
  Serial.print(myRTC.getDoW(), DEC);
  Serial.print(" ");
  
  // 显示时分秒
  Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
  Serial.print(" ");
  Serial.print(myRTC.getMinute(), DEC);
  Serial.print(" ");
  Serial.print(myRTC.getSecond(), DEC);
  
  // 添加AM/PM指示(仅在12小时制下有效)
  if (h12Flag) {
    if (pmFlag) {
      Serial.print(" PM ");
    } else {
      Serial.print(" AM ");
    }
  } else {
    Serial.print(" 24h ");  // 24小时制显示
  }
  
  // 显示温度(DS3231内置高精度温度传感器)
  Serial.print("T=");
  Serial.print(myRTC.getTemperature(), 2);  // 显示温度,保留两位小数
  
  // 显示振荡器状态(O+表示正常,O-表示振荡器可能停止)
  if (myRTC.oscillatorCheck()) {
    Serial.print(" O+");  // 振荡器正常工作
  } else {
    Serial.print(" O-");  // 振荡器可能停止,时间可能不准确
  }
  
  // 显示闹钟触发状态
  if (myRTC.checkIfAlarm(1)) {
    Serial.print(" A1!");  // 闹钟1触发
  }
  
  if (myRTC.checkIfAlarm(2)) {
    Serial.print(" A2!");  // 闹钟2触发
  }
  
  // 换行
  Serial.println();
  
  // 显示闹钟1设置信息
  Serial.print("Alarm 1: ");
  myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
  Serial.print(alarmDay, DEC);
  if (alarmDy) {
    Serial.print(" DoW");  // 按星期触发
  } else {
    Serial.print(" Date"); // 按日期触发
  }
  Serial.print(' ');
  Serial.print(alarmHour, DEC);
  Serial.print(' ');
  Serial.print(alarmMinute, DEC);
  Serial.print(' ');
  Serial.print(alarmSecond, DEC);
  Serial.print(' ');
  if (alarmH12Flag) {
    if (alarmPmFlag) {
      Serial.print("pm ");
    } else {
      Serial.print("am ");
    }
  }
  if (myRTC.checkAlarmEnabled(1)) {
    Serial.print("enabled");  // 闹钟1已启用
  }
  Serial.println();
  
  // 显示闹钟2设置信息
  Serial.print("Alarm 2: ");
  myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
  Serial.print(alarmDay, DEC);
  if (alarmDy) {
    Serial.print(" DoW");  // 按星期触发
  } else {
    Serial.print(" Date"); // 按日期触发
  }
  Serial.print(" ");
  Serial.print(alarmHour, DEC);
  Serial.print(" ");
  Serial.print(alarmMinute, DEC);
  Serial.print(" ");
  if (alarmH12Flag) {
    if (alarmPmFlag) {
      Serial.print("pm");
    } else {
      Serial.print("am");
    }
  }
  if (myRTC.checkAlarmEnabled(2)) {
    Serial.print("enabled");  // 闹钟2已启用
  }
  
  // 显示闹钟触发条件位(二进制格式)
  Serial.println();
  Serial.print("Alarm bits: ");
  Serial.println(alarmBits, BIN);
  
  // 空行分隔,每秒更新一次
  Serial.println();
  delay(1000);
}    

代码简单解读

这段代码使用 DS3231 实时时钟(RTC)模块 通过 I2C 通信 读取当前时间、温度和闹钟状态,并在 串口监视器 输出,核心逻辑如下:

1. 初始化 RTC
✅ DS3231 myRTC; → 创建 DS3231 实例 
✅ Wire.begin(); → 启动 I2C 通信 
✅ Serial.begin(57600); → 初始化串口通信,波特率 57600

2. 读取时间数据
✅ myRTC.getYear(); → 获取年份 
✅ myRTC.getMonth(); → 获取月份 
✅ myRTC.getDate(); → 获取日期 
✅ myRTC.getDoW(); → 获取星期 
✅ myRTC.getHour(h12Flag, pmFlag); → 获取小时(支持 AM/PM 显示) 
✅ myRTC.getMinute(); → 获取分钟 
✅ myRTC.getSecond(); → 获取秒数

3. 读取温度数据
✅ myRTC.getTemperature(); → 获取 DS3231 内部温度传感器数据

4. 监测 RTC 运行状态
✅ myRTC.oscillatorCheck(); → 检查 RTC 振荡器是否正常工作 
✅ myRTC.checkIfAlarm(1); → 检查 Alarm 1 是否触发 
✅ myRTC.checkIfAlarm(2); → 检查 Alarm 2 是否触发

5. 读取闹钟设定
✅ myRTC.getA1Time(); → 获取 Alarm 1 的设定时间 
✅ myRTC.getA2Time(); → 获取 Alarm 2 的设定时间 
✅ myRTC.checkAlarmEnabled(1); → 检查 Alarm 1 是否启用 
✅ myRTC.checkAlarmEnabled(2); → 检查 Alarm 2 是否启用

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

这段代码让 DS3231 RTC 模块不断读取时间、日期、温度和闹钟状态,并在串口监视器显示。

 

 

实验串口返回情况

 

12.jpg

 

08-1.jpg

评论

user-avatar
icon 他的勋章
    展开更多