もよいめも

不定期更新ものづくりブログ

【Arduino】ArduinoでRTC(DS3231)を簡単に使ってみた

今回は代表的なRTCのDS3231をArduinoで使ってみたので、簡単にまとめておこうと思います。
2022年12月時点でライブラリのアップデートされ、当記事のプログラムでは使用できなくなりました。
ライブラリのバージョン2.0.0以上を使用する場合は↓の記事をごらんください!

moyoi-memo.hatenablog.com

今回使うRTC

今回はAmazonで買ったRTC(DS3231)を使っていきます。

このRTCには充電式のボタン電池LIR2032(付属しません)をつけることができ、外部からの電源がなくても時間のデータを保持することができます。
なお、ボタン電池は絶対にLIR2032を使うようにしてください。普通のボタン電池でも勝手に充電しようとしてしまいますので、爆発するとかしないとか...
一応基板上のダイオードを外すことで充電機能を無効にすることもできるようですが、今回は紹介しません。

Arduinoとの接続方法

今回はArduino nanoでの配線方法を説明します。

RTC側     Arduino

VCC  →  5V
GND  →  GND
SDA  →  A4(SDA)
SCL  →  A5(SCL)

以下の画像も参考にしてください。Arduino UNOのバージョンも載せておきます。

配線の仕方


プログラムの方法

まず、ライブラリーをインストールしましょう。
こちらからライブラリーをZIP形式でダウンロードします。
github.com
そして、Arduino ideのメニューのスケッチ→ライブラリーをインクルード→zip形式のファイルをインストールからダウンロードしたファイルを選択します。ソフトを再起動させれば導入は完了です。

では現在の時間とRTCの時間を合わせます。
おそらくpc内時計の時間を取得してそのまま反映させることも可能だと思いますが、プログラムが少しわかりにくくなってしまうので、今回は手動で値を入力して設定していきます。(どうでもいいですがこのプログラムが完成した時刻で設定しています。)

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  setTime(12, 40, 0, 15, 10, 2018);//時、分、秒、日、月、年の順で入力
  RTC.set(now());//書き込み
}

void loop() {
}

では、しっかりと書き込めたか確認してみましょう。

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  Serial.begin(115200);
}

void loop() {
  tmElements_t tm;
  RTC.read(tm);
  Serial.print(tm.Year + 1970, DEC); //年は1970年からの年数で記録されるので1970を足して表示
  Serial.print("年");
  Serial.print(tm.Month, DEC);//月を表示
  Serial.print("月");
  Serial.print(tm.Day, DEC);//日を表示
  Serial.print("日");
  Serial.print(tm.Hour, DEC);//時を表示
  Serial.print("時");
  Serial.print(tm.Minute, DEC);//分を表示
  Serial.print("分");
  Serial.println(tm.Second, DEC);//秒を表示して改行
  delay(1000);//1間隔で表示させるため1秒待機
}

このプログラムを書き込んだ後にシリアルモニター(115200bps)を見て

2018年10月15日12時45分3
2018年10月15日12時45分4
2018年10月15日12時45分5
2018年10月15日12時45分6

などと表示されていれば成功です。

さて、次はRTCのアラーム機能を使ってみましょう!…と思ったのですが、
結構プログラムが面倒くさいんですよね。
という事で私はいいことを思いました。
先ほど時刻を表示するプログラムを作りましたよね?
つまり、Arduinoで時刻を数字として読み込めていることになります。
では
その読み込んだ数字を直接if文で比較してしまえばいいのです。

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT);//13番ピンを出力ピンに設定
}

void loop() {
  tmElements_t tm;
  RTC.read(tm);
  Serial.print(tm.Year + 1970, DEC); //年は1970年からの年数で記録されるので1970を足して表示
  Serial.print("年");
  Serial.print(tm.Month, DEC);//月を表示
  Serial.print("月");
  Serial.print(tm.Day, DEC);//日を表示
  Serial.print("日");
  Serial.print(tm.Hour, DEC);//時を表示
  Serial.print("時");
  Serial.print(tm.Minute, DEC);//分を表示
  Serial.print("分");
  Serial.println(tm.Second, DEC);//秒を表示して改行

  if (tm.Second == 0) {//ここで秒の数字が入ったtm.Secondの値が0秒かどうか判断
    digitalWrite(13, HIGH);//0なら13番ピンをオン
  }
  else {
    digitalWrite(13, LOW);//0でない場合は13番ピンをオフ
  }
  delay(1000);//1間隔で表示させるため1秒待機
}

このプログラムを実行すると秒が0になるたびにArduinoのLEDが1秒点灯するようになると思います。
このようにすることで非常に簡単にアラームを設定することができます。
(時間や分ごとにアラームを設定したい場合は、tm.Secondをそれぞれtm.Hourやtm.Minuteに変更してください)

それでは、よいArduinoライフを!