Lesson 19 Real Time Clock Module
Arduinoは、電源OFFにしてしまうと、時計がリセットされてしまいます。
それを防ぐためには、電池で動作し続ける RTC(リアルタイムクロック)モジュールを使います。
裏面には、クロックを維持するためのボタン型電池。
接続はI2C。5V/GNDと、SCL/SDAを接続。VCCは3.3V/5VどちらでもOK。反対側の端子はI2Cを数珠繋ぎするカスケード用とのこと。
部品型番はZS-042。こちらのページに解説がありました。
RTC (リアルタイムクロック) (DS3231)
https://ht-deko.com/arduino/rtc_ds3231.html
電池にはCR2032ではなく、同型の充電池LIR2032を使え、とありますね…。CR2032を使いたい場合は、パターンカットが必要、と。
ええ~?CR3032入ってるんだけど!?と思って確認してみると
ELEGOO付属品は、最初からそこには部品が付いてませんでした!CR2032用になっていたということか。不足しているパーツ追加したら充電対応になるかもしれないですが、ZS-042自体が数百円なので必要なら新しいの買った方が良いですね。
買ってから半年経過してたので電池大丈夫かな?と思ったのですが全然平気でした。(電力食わないので、20年ぐらいは持つらしい)
使っているチップはDS3231。RTC機能だけでなくて、2系統のアラーム機能、32Kパルス出力機能、数種類の矩形波出力機能(アラームと連動可能)が付いてるとのこと。安価なのにいろいろ機能付いてます。レジスタはこういう感じ。
(https://datasheets.maximintegrated.com/en/ds/DS3231.pdf)
実際の呼び出しにはライブラリ使うので、この辺のセッティングを直接することは無いと思いますけれど。
DS3231用ライブラリは、ELEGOO Lessonに付属していたもの以外に何種類かあるみたいですね。
サンプルスケッチはこういう感じ。
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; void setup() { Serial.begin(9600); Serial.println("Initialize DS3231"); // Initialize DS3231 clock.begin(); // Manual (YYYY, MM, DD, HH, II, SS // clock.setDateTime(2016, 12, 9, 11, 46, 00); // Send sketch compiling time to Arduino clock.setDateTime(__DATE__, __TIME__); /* Tips:This command will be executed every time when Arduino restarts. Comment this line out to store the memory of DS3231 module */ } void loop() { dt = clock.getDateTime(); // For leading zero look to DS3231_dateformat example Serial.print("Raw data: "); Serial.print(dt.year); Serial.print("-"); Serial.print(dt.month); Serial.print("-"); Serial.print(dt.day); Serial.print(" "); Serial.print(dt.hour); Serial.print(":"); Serial.print(dt.minute); Serial.print(":"); Serial.print(dt.second); Serial.println(""); delay(1000); }
ライブラリ Wire.h と DS3231.h をインクルード。
clock.begin();
begin() の中で Wire.begin(); されてます。
clock.setDateTime(__DATE__, __TIME__);
日付時刻を設定します。__DATE__ と __TIME__ は、コンパイル時にPCの日付時刻が設定されます。コンパイル&転送の数十秒分、誤差が生じますね。キッチリ合わせたいなら、なにかしら工夫が必要です。起動後に、ターミナル経由で通信して合わせるとか。
一度合わせれば、後は電池が切れるまでは時刻を刻み続けますので、clock.setDateTime はコメントアウトしておきます。(忘れると、リセットするたびにコンパイル時刻に再設定されてしまうことに…。)
dt = clock.getDateTime();
これで RTCDateTime 構造体に現在時刻を取得できます。
struct RTCDateTime { uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; uint8_t dayOfWeek; uint32_t unixtime; };
実行結果です。
ああ、刻が見える…!
温度計も付いてます。clock.readTemperature() で取得可能。
前回のジャイロセンサーGY-521にも温度計付いてましたね。
動作環境の温度が高すぎ/低すぎになってないかチェックするために使うのかな?温度計測自体が目的ではないからか、精度は(±3℃)と、高くないです。
サンプル見ると、アラーム設定とか、パルス出力も簡単にできますね。(ライブラリ使えば…ですが!)
そのあたりはまたいずれ!