ArduinoにRTC(実時間)モジュールを接続して時間を表示しました

この記事で学習できること

  • 温度、湿度、距離などを計測してデータを記録する時に測定した時間を同時に記録したい場合が多くあります。Arduino UNO R3は時計機能を内蔵していません。時計機能を持つRTC(実時間)モジュールの接続方法とARDUINO IDE R3のモニタ画面で時間を表示させる方法を学習します。

必要な部品は?

RTC(実時間)モジュール (DS1307)1個
Arduino UNO R31個

部品の購入先

Elegoo社製の「 Arduino用のUNO R3 最終版スタータキット」を購入しました。この記事で必要なDS1307を内蔵したRTC(実時間)モジュールやArduino UNO R3 ブレッドボードなどは全てこのキットに含まれています。

(広告) Arduino スターターキット
購入先製品備考
AmazonArduino用のUNO R3 最終版スタータキットArduino UNO R3を含み、ブレッドボード、IC、センサなどが含まれています

RTC(実時間)モジュール(DS1307)のピン配置は?

端子番号端子名備考
GNDグランド
VCC電源
SDAI2C データ
SCLI2C データクロック
SQW設定した波形の出力

回路図 (配線図)は?

  • Fritzingで描いた回路図(配線図)と実際の配線です。
— Arduino UNO R3とRTC(実時間)モジュールの接続図と実配線 —
  • RTC(実時間)モジュールのFritzingの部品モジュールを作成しました。(Webで探しましたが見つかりませんでしたので…)
— RTCモジュールのfritzing用部品データ —
Fritzingの部品を作成する記事は?

RTC(実時間)モジュール (DS1307)の動作は?

  • RTC(実時間)モジュールはDS1307を内蔵したシンプルな時間管理モジュールです。 内蔵バッテリを備えているため、電源を切っても時計は時刻を刻み続けます。使い方の例としては、ある測定をする時に、同時にRTC(実時間)モジュールから時間を呼んで同時に記録すれば、測定データの時間変化が解ります。

スケッチに使用するライブラリは?

  • RTC(実時間)モジュールはArduinoとI2Cインターフェースで繋がります。Arduino IDEにはI2Cライブラリ[wire.h]が用意されており、I2Cのインターフェースを意識することなくRTC(実時間)モジュールと通信できます。
  • DS1307はアナログ・デバイセズ社製造のRTC用ICです。アナログ・デバイセズ社は同機能のICを製造しておりDS3231もそのシリーズのICです。
  • DS1307のライブラリを探すと、DS3231用のライブラリで動作すると解りましたので、このライブラリを使います。

DS3231用のライブラリの入手先とインストール方法

  • スケッチで使用する、DS3231用のライブラリ(DS3231.h、DS3231.cpp)は[GitHub – jarzebski/Arduino-DS3231: DS3231 Real-Time-Clock]から取得し、Arduino-IDEでライブライリにインストールします。
  • Arduno用のDS3231用のライブラリは何種類かが公開されていますが、この記事で使用しているライブラリは上記のライブラりであり、異なるライブラリを使用するとコンパイル時にエラーが発生します。
  • GitHubでライブラリをダウンロードする
    • 対象ライブラリのGitHubページを開く
    • 緑色の Code ボタンをクリック (リストの右上にある[<>Code▼]のボタンです。)
    • Download ZIP を選択
    • ZIPファイルがPCに保存される
    • ※「Source code (zip)」でもOKですが、基本は上の手順で問題ありません。
  • Arduino IDEにZIPライブラリをインストールする (Arduino IDE 1.x / 2.x 共通)
    • Arduino IDE を起動
    • メニューから
    • スケッチ → ライブラリをインクルード → .ZIP形式のライブラリをインストール
  • 先ほどダウンロードした ZIP ファイルを選択
    • IDE が自動的に展開してインストール完了
  • インストール確認
    • メニューのスケッチ → ライブラリをインクルード
    • 一覧の「インストール済み」セクションにライブラリ名が表示されていれば成功
  • 注意点(特にGitHub系でよくある)
    • ZIPの中にさらにフォルダ階層があるとIDEが認識しないことがある
      → libraryname/libraryname/*.h のように二重構造になっていないか確認
    • src フォルダがあるタイプはそのままでOK
    • リリースページに「Arduino用に整えたZIP」がある場合はそちらを使うと確実

RTC(実時間)モジュールに時刻を書き込みます

  • RTC(実時間)モジュールは購入時は時間が書き込まれていません。使用する前に時間を書き込みます。スケッチをコンパイルした時のPCの時間を書き込みます。
  • RTC(実時間)モジュールにはデータ保持用のバッテリーが内蔵されているので、一度書き込めばこのデータは保持されます。
//www.arduinomakesiteasy.com 2022.4.25

#include <Wire.h>
#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

void setup()
{
  Serial.begin(9600);

  Serial.println("Initialize RTC module");

  clock.begin();

  // コンパイル終了時間をRTCモジュールに設定する。
  clock.setDateTime(__DATE__, __TIME__);    

  dt = clock.getDateTime();

  // 時間が書き込まれたことを確認する。
  Serial.print("Raw data: ");
  Serial.print(dt.year);   Serial.print("-");
  Serial.print(dt.month);  Serial.print("-");
  Serial.print(dt.day);    Serial.print(" ");
  Serial.print(dt.hour);   Serial.print(":");
  Serial.print(dt.minute); Serial.print(":");
  Serial.print(dt.second); Serial.println("");
 }

void loop()
{
  // Loopでは何もしません
}
  • ライブラリは<Wire.h>と<DS3231.h>を使っています。
#include <Wire.h>
#include <DS3231.h>
  • 下記のコードでRTC(実時間)モジュールに時間を書き込んでいます。
clock.setDateTime(__DATE__, __TIME__); 

RTC(実時間)モジュールから時間を読み出します

  • このスケッチではRTC(実時間)モジュールに時間は設定しませんが、時間データを1秒ごとに読み出すと、シリアルモニタの表示から実時間が書き込まれていて、読み出せていることが解ります。
//www.arduinomakesiteasy.com 2022.4.25

#include <Wire.h>
#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

void setup()
{
  Serial.begin(9600);

  Serial.println("Initialize RTC module");

  clock.begin();

}

void loop()
{
  dt = clock.getDateTime();

  Serial.print("Raw data: ");
  Serial.print(dt.year);   Serial.print("-");
  Serial.print(dt.month);  Serial.print("-");
  Serial.print(dt.day);    Serial.print(" ");
  Serial.print(dt.hour);   Serial.print(":");
  Serial.print(dt.minute); Serial.print(":");
  Serial.print(dt.second); Serial.println("");

  delay(1000);
}
  • Arduino IDEのシリアルモニタに日付・時間が表示されています。
— シリアルモニタで実時間の読出しを確認 —

RTCモジュールを含んだシールドがあります

  • Arduino UNO R3には、ハードウェアの機能を簡単に拡張するためのシールドと呼ばれる拡張ハードウェアを簡単に接続できます。
  • RTCモジュールとSDモジュールが一体となったデータロガーモジュールがあり、時間データを扱う機能とデータを保存する機能を容易に使用できます。
データロガーモジュールの記事は?

まとめ

  • ArduinoにRTC(実時間)モジュールを組み込む方法を学習できました。時刻保持用のバッテリーが組み込まれていますので、時刻を一回設定すれば時間を刻んでくれます。データ測定時に時間データを同時に残したり、またアラーム的な動作など色々と使えるなと感じました。

ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。