デジタルクロック(RTC:DS3231版)

リアルタイムクロックDS3231を使用したデジタル壁時計を作成します。

DS3231

 

 

Arduino Nano
OLYMPUS DIGITAL CAMERA

 

使う主な部品
Arduino Nano互換機DS3231シリアルRGB LEDで作成した時計表示板照度センサー押しボタンスイッチ2個、22kΩ抵抗1本(照度センサー用)

購入したRTC基板はコイン型リチウムイオン電池(LIR2032)の充電回路が組まれているのですが、購入時に入っているのは充電できないCR2032なので私は充電のパターンをカッターでカットしました。

機能の説明
GPSやNTPサーバーの正確な時計に定期的にアクセスすれば、手動で時刻合わせをする必要がありません。市販の時計のようにボタンで時刻を合わせるのはプログラムを考えるのが大変なので避けてきたのです。以前使ったリアルタイムクロック(RTC)DS1302はひどく精度が悪くて一晩で数分ずれていましたので、RTCは諦めてGPSに頼り切った方が楽だなと考えていました。GPSでも我が家のような木造で窓際ならば問題ありませんが、ビルの中でも使えるかというとさすがに無理な場面も出てくるでしょう。

そんなことを考えながらDS1302よりも高精度と言われているDS3231を試しに購入したところ、カタログ性能は文句のつけようもなく良くて、数日使ってもDS1302とは比べ物にならないほど正確に時を刻んでいます。

しょうがないのでボタン2個で時刻を合わせるプログラムを書くことにしました。ついでに機能も追加して時計としての魅力をUPさせました。部屋の明るさを照度センサーで検知して、暗い時には明かりを抑えたナイトモード、明るい時には華やかなフルカラーモードにしました。表示した数字の色が徐々に変化するようにプログラムしたのですが、AdafruitのシリアルLEDのデモプログラムのRainbowに数字表示のマスクをかけて比較的シンプルに実現させました。アナログの壁時計なら数分ずれていても許せるのですが、デジタルの場合は、朝のテレビ画面の隅で表示している時刻とつい比べてしまうので、秒の表示は無くても同じタイミングで切り替わって欲しいものだと感じます。数字の色の変化はゆっくりなので、時刻表示が切り替わる時にはR→G→Bでフラッシュしてちょっと注意を引くような小細工も入れました。

ボタン2個の同時押しで、時刻合わせモードに入ります。モードが変わったことが直感的に分かるように時刻合わせモードの時は緑です。時→分→秒の順でセットするのですが、ボタンを押さずにいると自動的に時刻合わせモードから抜けます。

時刻合わせモードに入ると”時”だけを緑色で表示します。右ボタンで1アップ、左ボタンで1ダウンします。”時”が合わせ終わったら、ボタン2個の同時押しで、”分”だけを表示します。アップダウンは同様ですが、PCなどの秒まで分かる正確な画面を見て1分先に合わせます。設定したら2個の同時押しで、時分を表示します。PCの秒表示が”00″になる時にどれかボタンを押すとPCの時刻と運動神経レベルで一致させることができます。

回路図
Eagleを勉強中なのでそのうち練習を兼ねて書こうと思います。
照度センサーの短い足を22kΩの抵抗でGNDに落としています。長い足は5Vです。短い足の電圧をA0ピンで測定します。LEDの信号はD7、スイッチはD2とD3、RTCのSDAがA4でSCLがA5です。

プログラム
RTCのライブラリはRTClibを使いました。半分以上は時刻合わせのために書かれています。rainbowCycle()とnightClock()が通常の時計機能でリストの下の端に書かれています。大部分の時間それらの関数の中で動作しているので、時刻合わせモードに入る関数wantAdjust()はそれらの関数の中に置かれていて、”2個の同時押し”を検知するとadjustClock()に入って時刻合わせが始まります。
表示に関してはint ledClock[28]とint ledMask[28]でLEDのON/OFFを行っているので比較的シンプルにできているのではないかと思います。

 

(2017.03.30)