Arduino 实时时钟 (RTC)


RTC 模块在接收到初始时间输入后会持续跟踪时间。此输入可以来自多个来源(NTP、GPS 等)。RTC 模块通常带有自己的晶体振荡器,甚至还有自己的电池,因此即使 Arduino 出现电源故障,时间跟踪也能继续进行。

电路图 -

我们将使用 DS3231 模块。它使用 I2C 进行通信(SDA 和 SCL 线路)。电路图如下所示:

如您所见,DS3231 的 Vcc 引脚连接到 5V,GND 连接到 GND,SDA 连接到 A4(SDA),SCL 连接到 A5(SCL)。

所需库

您将需要 ds3231 库。您可以从 这里 获取它。

有关从 GitHub 安装库的指南,请参见 这里

代码演练

代码将保持简单。我们将使用 create.arduino 项目中提供的代码。您可以在 这里 找到它。

我们首先包含 Wire 和 ds3231 库:

#include <Wire.h>
#include <ds3231.h>

如果您查看 DS3231 库的源代码,他们定义了一个 **struct ts**,其中包含各种时间字段(年份、月份等)。我们将创建此结构类型的一个变量。

struct ts t;

在 setup 中,我们初始化 Wire、DS3231 并设置初始时间。请注意,此初始时间可能来自 GPS、NTP 或其他来源。这里我们只是为了说明而手动设置它。

void setup() {
   Serial.begin(9600);
   Wire.begin();
   DS3231_init(DS3231_CONTROL_INTCN);
   t.hour=12;
   t.min=30;
   t.sec=0;
   t.mday=25;
   t.mon=12;
   t.year=2019;

   DS3231_set(t);
}

DS3231_init 中使用的配置 (DS3231_CONTROL_INTCN) 表示中断控制。ds3231.h 文件中定义的其他选项为:

// control register bits
#define DS3231_CONTROL_A1IE          0x1       /* Alarm 2 Interrupt Enable */
#define DS3231_CONTROL_A2IE          0x2       /* Alarm 2 Interrupt Enable */
#define DS3231_CONTROL_INTCN         0x4       /* Interrupt Control */
#define DS3231_CONTROL_RS1           0x8       /* square-wave rate select 2 */
#define DS3231_CONTROL_RS2           0x10       /* square-wave rate select 2 */
#define DS3231_CONTROL_CONV          0x20       /* Convert Temperature */
#define DS3231_CONTROL_BBSQW         0x40       /* Battery-Backed Square-Wave Enable */
#define DS3231_CONTROL_EOSC          0x80       /* not Enable Oscillator, 0 equal on */

它们的含义可以在 DS3231 数据手册 的控制寄存器部分找到。通过将模式设置为 DS3231_CONTROL_INTCN,我们处于中断输出模式,警报已禁用。这意味着 DS3231 的 INT/SQW 引脚上没有方波输出或中断(因为中断需要启用警报)。对于本教程的目的,您不必太担心该引脚。它不用于通常的时间跟踪。您可以在数据手册中阅读更多相关内容。

在循环内,我们每秒打印一次时间。您可以在串行监视器上观察到,时间按预期以 1 秒为步长递增。

void loop() {
   DS3231_get(&t);
   Serial.print("Date : ");
   Serial.print(t.mday);
   Serial.print("/");
   Serial.print(t.mon);
   Serial.print("/");
   Serial.print(t.year);
   Serial.print("\t Hour : ");
   Serial.print(t.hour);
   Serial.print(":");
   Serial.print(t.min);
   Serial.print(".");
   Serial.println(t.sec);

   delay(1000);
}

更新于:2021-07-31

2K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告