ELEGOO:Lesson 19

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℃)と、高くないです。


サンプル見ると、アラーム設定とか、パルス出力も簡単にできますね。(ライブラリ使えば…ですが!)
そのあたりはまたいずれ!