高専ガチ勢のメモ書き

学んだことをを気まぐれに書いています



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

昔、RTCを使って一日一回だけリレーをオンにするものを作ったのですが、その際かなり苦戦したので、
今回はもう苦戦しないようにプログラムの方法をまとめておこうと思います。

今回使うRTC

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

このRTCには充電式のボタン電池LIR2032(付属しません)をつけることができ、外部からの電源がなくても時間のデータを保持することができます。
なお、ボタン電池は絶対にLIR2032を使うようにしてください。普通のボタン電池でも勝手に充電しようとしてしまいますので危険です。

Arduinoとの接続方法

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

RTC側     Arduino

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

プログラムの方法

まず、ライブラリーをインストールしましょう。
こちらからライブラリーを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ライフを!

広告