【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 模块不断读取时间、日期、温度和闹钟状态,并在串口监视器显示。
实验串口返回情况

评论