こんなこと、やります。
- ArduinoでリアルタイムクロックDS3231を使う
- リアルタイムクロックに現在時刻をセットする
- シリアルモニタで現在時刻の表示
- 液晶ディスプレイで現在時刻の表示
DS3231は温度補償付きの高精度リアルタイムクロック(RTC)で、Arduinoから現在時刻を読み出して時計や記録のタイムスタンプに使えます。ポイントは、最初に一度だけ現在時刻を書き込んでおけば、あとはモジュール上のボタン電池でその時刻が保持され続けることです。この記事では、ライブラリのインストールとI2C配線から、シリアルモニタでの表示、さらにI2C接続のLCDに時刻を表示するところまでを順に扱います。
DS3231ライブラリのインストール
Arduino IDEで簡単にDS3231を扱えるように、ライブラリをインストールしましょう。
Ardino IDEを立ち上げて、メニューから「Sketch」→「Include Library」→「Managed Libraries…」を選択し、「DS3232RTC」で検索して次のライブラリをインストールしてください。 「依存関係のライブラリをインストールしますか?」と問われますので、「Install all」を押します。
https://github.com/JChristensen/DS3232RTC
Arduinoとリアルタイムクロックの配線
Arduinoとリアルタイムクロックの配線を次の通り行います。

Arduino UNOでは、SDAとA4、SCLとA5は導通してますので、A4、A5ピンを使ってもらっても大丈夫です。I2C通信の配線やアドレスの考え方は、ESP32でADS1115を使う方法|配線図・I2Cアドレス・サンプルコード も参考になります。
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に表示することができました。
DS3231モジュールのボタン電池を外さなければ、Arduinoの電源を切っても設定した時刻が保持され続けます。いちどArduinoの電源を落として、しばらくしてから起動し、時刻が合っているか確認してみましょう。 長期間使わないときに時刻がリセットされる場合は、ボタン電池の消耗を疑ってみてください。
関連記事
- 【Arduino】シリアルLED(WS2812B)を制御する
- ESP32でADS1115を使う方法|配線図・I2Cアドレス・サンプルコード
- Arduino Unoで内蔵メモリEEPROMを使って状態を保存する方法
