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

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
实验模块接线示意图

在这里插入图片描述

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

实验串口返回情况

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值