本篇介紹如何在樹莓派上面安裝 DS3231 RTC 實時時鐘,以及其設定與使用的方式。

DS3231 是一個 I2C 介面的實時時鐘(real-time clock,RTC),上面附帶有一顆電池,在沒有電源供應的情況下也可以紀錄精準的時間。


這個就是 DS3231 RTC 實時時鐘,可以直接插在樹莓派的 GPIO 針腳上。

raspberry-pi-ds3231-real-time-clock-01

DS3231 實時時鐘(RTC)

DS3231 在常溫下(攝氏 0 至 40 度)的準確度可以達到 ±2ppm,也就是一天的時間誤差可在 86400 * 2 / 1e6 = 0.1728 秒之內。

樹莓派安裝 DS3231 RTC

DS3231 RTC 的安裝方式很簡單,直接插在樹莓派的第 1、3、5、7、9 這幾個針腳即可。

raspberry-pi-gpio-layout-model-b-plus

樹莓派針腳

就像這樣插上去,注意要插在內側這一排針腳上,若插錯排是不能用的。

raspberry-pi-ds3231-real-time-clock-03

樹莓派與 DS3231 實時時鐘(RTC)

基本上這一個 DS3231 RTC 裝在這個位置不太會擋住其他的硬體組件。

raspberry-pi-ds3231-real-time-clock-04

樹莓派與 DS3231 實時時鐘(RTC)

這種壓克力外殼也剛剛好可以裝的下這個 DS3231 RTC,蓋子也不會卡到。

raspberry-pi-ds3231-real-time-clock-05

樹莓派與 DS3231 實時時鐘(RTC)

設定 DS3231 RTC

硬體安裝好之後,接著要設定軟體,將樹莓派開機後,使用 raspi-config 設定工具,啟用 I2C 核心模組:

sudo raspi-config
raspberry-pi-ds3231-real-time-clock-02

raspi-config 啟用 I2C 核心模組

載入了 I2C 模組之後,使用 i2cdetect 偵測 I2C 裝置。對於 Rev 2 的板子,可使用:

sudo i2cdetect -y 1

如果是 Rev 1 的板子,則使用:

sudo i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
若要得知樹莓派的 Revision 資訊,可以參考查詢樹莓派 Raspberry Pi 開發版的 Revision 版本資訊

0x68 這個位置上有發現一個裝置,這個被偵測到的 I2C 裝置就是剛插上去的 DS3231 RTC,在使用之前要先新增這個 RTC,Rev 2 的板子則執行:

sudo echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

若是 Rec 1 的板子則執行:

sudo echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-0/new_device

這時候若再執行一次 i2cdetect,則輸出會變成這樣:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

原本的 0x68 的位置變成了 UU,這就代表這個裝置已經被某個驅動程式使用了。接著就可以使用這個 DS3231 RTC 實時時鐘了。

首先測試一下是否可以讀取到 RTC 的時間資訊:

sudo hwclock -r

正常來說會看到類似這樣的時間訊息:

Sat 01 Jan 2000 12:33:54 AM UTC  -0.859545 seconds

現階段只要可以讀的到時間資訊就表示 RTC 的安裝沒有問題,時間是不是正確的倒是無所謂,我們隨後會再校正時間。如果沒抓到 RTC 的話,通常就會出現這樣的錯誤訊息:

hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --debug option to see the details of our search for an access method.

使用 DS3231 RTC

接著要設定正確的日期與時間,如果有連上網路的話,可以用 ntp 校時:

sudo service ntp start

或手動使用 ntpdate

sudo ntpdate 0.tw.pool.ntp.org

如果沒有網路,也可以用 date 手動調整時間:

date -s "2016-11-23 08:30:25"

確認 Linux 系統的時間是正確的之後,再將正確的時間寫入硬體的 RTC 中:

sudo hwclock -w

接著在讀取硬體 RTC 的時間,看看是否正確:

sudo hwclock -r

若要將 Linux 的系統時間設定為硬體 RTC 的時間,可以執行:

sudo hwclock -s
Wed 23 Nov 2016 10:37:15 AM CST  -0.717978 seconds

我們可以使用 timedatectl 查看所有的時間資訊:

timedatectl
      Local time: Wed 2016-11-23 10:35:52 CST
  Universal time: Wed 2016-11-23 02:35:52 UTC
        RTC time: Wed 2016-11-23 02:35:52
       Time zone: Asia/Taipei (CST, +0800)
     NTP enabled: no
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

確認所有的時間都正確之後,接下來就是要設定讓樹莓派在開機時,可以自動啟用 DS3231 RTC,編輯 /etc/rc.local 設定檔,在 exit 0 之前加入兩行指令,Rev 2 的板子則加入:

echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s

Rev 1 的版本為:

echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
sudo hwclock -s

參考資料:Raspberry Pi Spy葉難adafruitMAKEHUB.tw