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

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

こんなこと、やります。

  • ArduinoでリアルタイムクロックDS3231を使う
  • リアルタイムクロックに現在時刻をセットする
  • シリアルモニタで現在時刻の表示
  • 液晶ディスプレイで現在時刻の表示

つかうもの

この記事でつかうものをご紹介します。

リアルタイムクロックモジュール(DS3231 AT24C32)

リアルタイムクロックモジュール(DS3231 AT24C32)
リアルタイムクロックモジュール(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」で検索して次のライブラリをインストールしてください。

DS3232RTCライブラリ1.3.0のインストール
DS3232RTCライブラリ1.3.0のインストール
「依存関係のライブラリをインストールしますか?」と問われますので、「Install all」を押します。

GitHub - JChristensen/DS3232RTC: Arduino Library for Maxim Integrated DS3232 and DS3231 Real-Time Clocks

Arduinoとリアルタイムクロックの配線

Arduinoとリアルタイムクロックの配線を次の通り行います。

Arduinoとリアルタイムクロックの配線
Arduinoとリアルタイムクロックの配線

Arduino UNOでは、SDAとA4、SCLとA5は導通してますので、A4、A5ピンを使ってもらっても大丈夫です。

ArduinoとDS3231のプログラミング

ArduinoとDS3231のプログラミングを行っていきます。RTCから現在時刻を取得するには、一度だけ現在時刻をセットしてあげる必要があります。

現在時間を書き込む

内容を現在時刻に合わせて書き換えてください。

cpp
#include <DS3232RTC.h>
 
void setup() {
  setTime(15, 21, 0, 22, 1, 2022);
  RTC.set(now());
}

void loop() {
}

時刻はsetTime(時、分、秒、日、月、年の順で入力) で指定します。プログラムを一度だけArduinoで実行し、リアルタイムクロックに現在時刻を記録させます。

シリアルモニタで現在時刻を表示する

シリアルモニタで現在時刻を表示させてみましょう。

cpp
#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に表示
現在時刻をLCDに表示

実用的な発展として、液晶ディスプレイ(LCD)を使って時刻を表示させてみましょう。LCD1602にシリアル変換モジュールをつなげて、I2C通信できるようにしてます。

LCDの使い方の詳細はこちらをご覧ください。

ArduinoとRTC、LCDの配線

図のように、ArduinoとRTC、LCDを配線します。I2Cモジュールは各々アドレスがありますので、並列につないでも大丈夫です。

ArduinoとRTC、LCDの配線
ArduinoとRTC、LCDの配線

LCDに現在時刻を表示するプログラム

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

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

人気のArduino互換機
Arduinoで人気の周辺パーツ
あると便利な道具
Arduinoのオススメ参考書

▼ Arduino初心者向きの内容です。ほかのArduino書籍と比べて図や説明がとてもていねいで読みやすいです。Arduinoで一通りのセンサーが扱えるようになります。

▼ 外国人が書いた本を翻訳したものです。この手の書籍は、目からうろこな発見をすることが多いです。

▼ Arduinoの入門書を既に読んでいる方で、次のステップを目指したい人向きの本です。C言語のプログラミングの内容が中心です。ESP32だけでなく、ふつうのArduinoにも役立つ内容でした。

関連記事