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+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.