サイトロゴ

【Arduino】リアルタイムクロック(DS3231)で現在時刻の表示

著者画像
Toshihiko Arai

はじめに

こんなこと、やります。 - ArduinoでリアルタイムクロックDS3231を使う - リアルタイムクロックに現在時刻をセットする - シリアルモニタで現在時刻の表示 - 液晶ディスプレイで現在時刻の表示

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ピンを使ってもらっても大丈夫です。


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の電源を落として、しばらくしてから起動して時刻が合っているか確認してみましょう。

関連記事