> For the complete documentation index, see [llms.txt](https://cavedu.gitbook.io/linkit-7697/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cavedu.gitbook.io/linkit-7697/linkit-7697-arduinoide/kai-fa-zhi-nan/rtc-real-time-clock.md).

# RTC (Real-Time Clock)

{% hint style="danger" %}
需要 v0.9.9 以上的 BSP 版本才有支援此功能。其他更早的 BSP 版本並沒有提供 Arduino 層的 API 供開發者操作 RTC 模組 (不過開發者仍能使用 [LinkIt SDK APIs](http://labs.mediatek.com/api/mt7697/group___r_t_c.html) 來操作 RTC)。
{% endhint %}

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

![](https://3972650740-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY4gduUSLWOCI23CXUWej%2Fuploads%2FmgFBz5uhgjttwLc0oTJD%2Fschematic.png?alt=media\&token=188b7403-6d3a-49d7-bd20-7039520c3420)

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

![](https://3972650740-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY4gduUSLWOCI23CXUWej%2Fuploads%2FZGZwlcx93QA92LqcI2fy%2Frework.png?alt=media\&token=ebef1de5-3ef4-49ff-bc9f-b05b1d05d9cd)

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

![](https://3972650740-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FY4gduUSLWOCI23CXUWej%2Fuploads%2Fz7LdujRwXnnYXc6jzzvI%2F7697AA.png?alt=media\&token=8c26b49f-0ce9-4468-af7a-bb03aa18f214)

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

{% embed url="<https://youtu.be/gOT7g91VmKU>" %}

{% hint style="info" %}
Description

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

### APIs <a href="#rtc-real-timeclock-apis" id="rtc-real-timeclock-apis"></a>

使用 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](https://en.wikipedia.org/wiki/Network_Time_Protocol) 取得標準時間並將之紀錄於 RTC 中)：

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

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

### 範例 <a href="#rtcrealtimeclock-fan-li" id="rtcrealtimeclock-fan-li"></a>

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