【Arduino】リアルタイムクロック(DS3231)で現在時刻の表示
こんなこと、やります。
- ArduinoでリアルタイムクロックDS3231を使う
- リアルタイムクロックに現在時刻をセットする
- シリアルモニタで現在時刻の表示
- 液晶ディスプレイで現在時刻の表示
つかうもの
この記事でつかうものをご紹介します。
リアルタイムクロックモジュール(DS3231 AT24C32)
水晶発振器内蔵のDS3231チップを搭載したリアルタイムクロック(RTC)を使用します。ArduinoとはI2Cで通信できます。
CR2032電池
モジュールに電池が付属していない場合は、CR2032の電池が必要です。CR2032は100円ショップでも購入できます。
また、リアルタイムクロックモジュールに搭載するバッテリーの向きは、写真のようにプラスが見える向きに挿入してください。
Arduino
Arduino Uno Rev3を使用しました。
この記事の内容は、ほかのArduinoでも動作します。
Arduinoをお持ちでないようでしたら おすすめArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へ をご覧ください。
その他の電子部品
また、ブレッドボードやジャンプワイヤもあると便利です。
DS3231ライブラリのインストール
Arduino IDEで簡単にDS3231を扱えるように、ライブラリをインストールしましょう。
Ardino IDEを立ち上げて、メニューから「Sketch」→「Include Library」→「Managed Libraries...」を選択し、「DS3232RTC」で検索して次のライブラリをインストールしてください。 「依存関係のライブラリをインストールしますか?」と問われますので、「Install all」を押します。
Arduinoとリアルタイムクロックの配線
Arduinoとリアルタイムクロックの配線を次の通り行います。
ArduinoとDS3231のプログラミング
ArduinoとDS3231のプログラミングを行っていきます。RTCから現在時刻を取得するには、一度だけ現在時刻をセットしてあげる必要があります。
現在時間を書き込む
内容を現在時刻に合わせて書き換えてください。
#include <DS3232RTC.h>
void setup() {
setTime(15, 21, 0, 22, 1, 2022);
RTC.set(now());
}
void loop() {
}
時刻はsetTime(時、分、秒、日、月、年の順で入力) で指定します。プログラムを一度だけArduinoで実行し、リアルタイムクロックに現在時刻を記録させます。
シリアルモニタで現在時刻を表示する
シリアルモニタで現在時刻を表示させてみましょう。
#include <DS3232RTC.h>
void setup() {
Serial.begin(115200);
}
void loop() {
tmElements_t tm;
RTC.read(tm);
Serial.print(tm.Year + 1970, DEC);
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);
}
こんな感じで、シリアルモニタに現在時刻が表示されれば成功です。
【発展】LCDで現在時刻を表示する
実用的な発展として、液晶ディスプレイ(LCD)を使って時刻を表示させてみましょう。LCD1602にシリアル変換モジュールをつなげて、I2C通信できるようにしてます。
ArduinoとRTC、LCDの配線
図のように、ArduinoとRTC、LCDを配線します。I2Cモジュールは各々アドレスがありますので、並列につないでも大丈夫です。
LCDに現在時刻を表示するプログラム
#include <DS3232RTC.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Ready...");
delay(3000);
}
void loop() {
tmElements_t tm;
RTC.read(tm);
displayLCD(
tm.Year + 1970,
tm.Month,
tm.Day,
tm.Hour,
tm.Minute,
tm.Second
);
delay(1000);
}
void displayLCD(int Y, int M, int D, int h, int m, int s) {
char line1[15];
char line2[15];
snprintf(line1, 15, "%d-%02d-%02d", Y, M, D);
snprintf(line2, 15, "%02d:%02d:%02d", h, m, s);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
}
▼ こちらの動画のように、現在時刻をLCDに表示することができました。
RTCのボタン電池を外さなければ、Arduinoの電源を切っても設定した時刻が継続されます。いちどArduinoの電源を落として、しばらくしてから起動して時刻が合っているか確認してみましょう。