RTC (Real-Time Clock)

需要 v0.9.9 以上的 BSP 版本才有支援此功能。其他更早的 BSP 版本並沒有提供 Arduino 層的 API 供開發者操作 RTC 模組 (不過開發者仍能使用 LinkIt SDK APIs 來操作 RTC)。

LinkIt 7697 內建 Real-Time Clock (RTC) 模組,透過獨立供電給 RTC 模組,它能在 MT7697 主 IC 斷電的狀態下繼續紀錄時間資訊,以達到低功耗的省電目的。原本 LinkIt 7697 設計為主 IC 與 RTC 共用相同的 3V3 輸入電源,所以若將開發板的電源關閉,則 MT7697 與 RTC 皆會因失去電源而停止作用。但透過移除電阻的 rework (下列電路圖中標示為 R2 的 0R 電阻),則能將 MT7697 與 RTC 的供電予以分開,進而達成關閉主 IC 電源時,RTC 仍能繼續運作的模式。

R2 電阻、以及 RTC 的供電輸入接口在 LinkIt 7697 開發板的位置如下:

RTC 的工作電壓範圍為 1.6V 到 3.63V,所以也可以透過 2xAA 電池來對它供電:

下列影片示範了當主 IC 斷電時 RTC 仍繼續運作的典型應用情境:

Description

此範例使用 LCD 顯示儲存於 LinkIt 7697 RTC 裡的時間,並在後方放置時鐘當作標準時間的參考。影片一開始會將開發板斷電,所以開發板的電源指示燈及 LCD 皆會熄滅,但此時 RTC 模組仍持續供電,因此時間資訊可被保存。過了幾秒後,再將開發板上電,此時開發板會從 RTC 模組將時間資訊讀回來並顯示於 LCD 上,對比後方的標準時鐘,可看見時間資訊被正確的保留下來。

APIs

使用 RTC 類別,需於 sketch 開始處加入 LRTC.h 的 header file。

#include <LRTC.h>

在呼叫 RTC API 存取時間資訊前,需先初始化 RTC 模組。建議在 Arduino 的 setup() 裡呼叫 begin() API 來進行初始化:

void setup()
{
  ...
 
  // initialize the RTC module
  LRTC.begin();
 
  ...
}

接著呼叫 get() API,便能取得存在 RTC 裡的時間資訊。當 get() 返回後,可藉由下列函式解析出 "年/月/日/時/分/秒" 等資訊:

APIs有效值域
LRTC.year()[2000, 2099]
LRTC.month()[1, 12]
LRTC.day()[1, 31]
LRTC.hour()[0, 23]
LRTC.minute()[0, 59]
LRTC.second()[0, 59]

例如以下的範例:

char buffer[64];
 
// get time from the RTC module
LRTC.get();

// display the time
sprintf(buffer, "%ld/%ld/%ld %.2ld:%.2ld:%.2ld",
  LRTC.year(), LRTC.month(), LRTC.day(), LRTC.hour(), LRTC.minute(), LRTC.second());

Serial.println(buffer);

除了讀取時間,也可以使用 set() API 設定 RTC 的時間 (例如從 NTP 取得標準時間並將之紀錄於 RTC 中):

void set(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t minute, int32_t second);

此 API 各參數的有效值域與上表 get() 回傳值的有效值域相同。

範例

在 File / Examples / LRTC 選單裡提供了兩個範例。為了方便理解及專注於 RTC 本身的功能,範例中的時間皆為事先定義於程式中的固定資訊,並透過按壓 USR 按鈕進行設定。若 RTC 的時間沒有經過初始化設定,則 RTC 會從 2000/1/1 00:00:00 開始計時。CheckTime 範例會將時間輸出至 Serial Monitor,而 CheckTimeLCD 範例會將時間輸出至 1602 LCD (如同上面影片裡的設置)。在執行使用 LCD 的範例之前,需先安裝 1602 LCD 的驅動程式。若要獲得更多使用該 LCD 的資訊,請參考 1602 LCD 教學範例