本篇介紹如何在樹莓派上面安裝 DS3231 RTC 實時時鐘,以及其設定與使用的方式。
DS3231 是一個 I2C 介面的實時時鐘(real-time clock,RTC),上面附帶有一顆電池,在沒有電源供應的情況下也可以紀錄精準的時間。
DS3231 在常溫下(攝氏 0 至 40 度)的準確度可以達到 ±2ppm,也就是一天的時間誤差可在 86400 * 2 / 1e6 = 0.1728
秒之內。
DS3231 RTC 的安裝方式很簡單,直接插在樹莓派的第 1、3、5、7、9 這幾個針腳即可。
就像這樣插上去,注意要插在內側這一排針腳上,若插錯排是不能用的。
基本上這一個 DS3231 RTC 裝在這個位置不太會擋住其他的硬體組件。
這種壓克力外殼也剛剛好可以裝的下這個 DS3231 RTC,蓋子也不會卡到。
硬體安裝好之後,接著要設定軟體,將樹莓派開機後,使用 raspi-config
設定工具,啟用 I2C 核心模組:
sudo raspi-config
載入了 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: -- -- -- -- -- -- -- --
在 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.
接著要設定正確的日期與時間,如果有連上網路的話,可以用 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