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); }