時計機能を追加したい場合、Arduino は RTC 内蔵で無いため
- RTC (Real Time Clock) を追加
- 電源が切れても時刻を更新し続けるバッテリー(電池)を追加
する必要があります。ちゃんとしたのを買うと高いんですが、ebay で安い、かつ一般的な i2c の RTC モジュール DS1307 を積んでいる Tiny RTC というのが一個 0.99$ で売ってたので試しに5個ほど買ってみました。なお1個でも国際送料無料です。
こいつに一般的なリチウムボタン電池の CR2032 (100円ショップで2個で100円) をつければ 180 円で RTC 追加して使えます。ヤッタネ!
配線
配線は P2 (DS1307側) のピンヘッダを実装し繋ぐだけでOKです。右側の P1 のほうは、EEPROM の 24C32 と繋ぐ用みたいです(試してない)。
また電池の向きですが、+ が表になるように入れると動作しました。以下は参考写真です。
なお回路図は下のエントリーにあります。自分で書き起こしたっぽいですね。
ライブラリ
ライブラリは
を使いました。このライブラリは Arduino の Time ライブラリと RTC をよしなにマッピングしてくれるので使い勝手が良いです。Arduino の Time ライブラリの方の使い勝手が良いかは微妙ですが…。
さらに上のレポジトリツリーに
というサンプルが置かれてるんですが、これを書き込むと PC の時刻と Arduino の RTC 時刻を大体同期してくれます。これはコンパイル時にその時の日時文字列として展開される C のマクロの __TIME__
と __DATE__
をパースし、Time ライブラリの tmElements_t
構造体によしなに突っ込んでくれるという物です。なるほど。
ちなみに私の環境では PC でコンパイルしてから Arduino 上で実行されるまで約15秒のタイムラグがあったため、上記コードの
tm.Second = Sec;
を
tm.Second = Sec + 15;
とすることで、さらに近い時間になるようにしています。なおソースコードを読む限りは Second の値が60以上で代入されても意図した動作をします。
その後
のスケッチを書き込み、Arduino の電源をオンオフしても正常に時刻が維持されていればちゃんとバッテリーで動作しているはずです。
まだ使い始めて間もないので正確さ(乗っているクロックに影響される)は解らないのですが、安価に時計機能を追加できる & 無料な国際便は届くまでだいぶ時間がかかるので、買っておいても損は無いんじゃないかなーと思います。