プロジェクト25:RTCで時計

プロジェクト25:RTCを使って時計を作ってみよう

このプロジェクトで学ぶこと: リアルタイムクロック(RTC)モジュールを使って正確な時刻を管理する方法を学びます。電源を切っても時刻が保持される仕組みと、LCDに日時を表示するデジタル時計を実装します。


完成イメージ

[LCDに現在の日付と時刻がリアルタイムで表示されているデジタル時計の写真を挿入]


必要な部品

部品名 数量
Arduino Uno R3 1
DS1307 または DS3231 RTC モジュール 1
LCD1602モジュール(I2C) 1
ブレッドボード 1
ジャンパー線 多数

回路図と配線

[回路図画像を挿入]

配線手順

  1. RTCモジュールの VCC5VピンGNDGNDピン に接続する
  2. RTCモジュールの SDAA4ピンSCLA5ピン に接続する
  3. LCDも同じSDA(A4)とSCL(A5)に並列で接続する(I2Cバスは複数デバイスを同じ線で共有できる)

事前準備:ライブラリのインストール

ライブラリマネージャーで「RTClib by Adafruit」をインストールする。


Arduinoスケッチ(プログラム)

// RTCモジュールでデジタル時計をLCDに表示

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

RTC_DS1307 rtc;  // DS3231を使う場合は RTC_DS3231 に変更
LiquidCrystal_I2C lcd(0x27, 16, 2);

// 数値を2桁ゼロパディングで表示するヘルパー関数
void printTwoDigits(int num) {
  if (num < 10) lcd.print("0");
  lcd.print(num);
}

void setup() {
  Wire.begin();
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);

  if (!rtc.begin()) {
    lcd.print("RTC Error");
    while (1);
  }

  // RTCが動いていない場合(初回セットアップ)はコンパイル時刻で初期化
  if (!rtc.isrunning()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
}

void loop() {
  DateTime now = rtc.now();

  // 1行目:日付
  lcd.setCursor(0, 0);
  lcd.print(now.year());
  lcd.print("/");
  printTwoDigits(now.month());
  lcd.print("/");
  printTwoDigits(now.day());

  // 2行目:時刻
  lcd.setCursor(0, 1);
  printTwoDigits(now.hour());
  lcd.print(":");
  printTwoDigits(now.minute());
  lcd.print(":");
  printTwoDigits(now.second());

  delay(1000);
}

コードのポイント解説

RTCの初期化 rtc.adjust() DateTime(F(__DATE__), F(__TIME__))はコンパイル時刻(コンパイルした瞬間の日時)でRTCを設定します。初回のみ書き込み後、次のアップロード前にこの行をコメントアウトしないと起動のたびに時刻がリセットされます。

DateTimeオブジェクト now.year()now.month()now.day()now.hour()now.minute()now.second()で各要素を取得します。

I2Cバスの共有 RTCとLCDはどちらもI2C接続ですが、それぞれ異なるアドレス(DS1307は0x68、LCDは0x27)を持つため、同じSDA/SCLに並列接続して共存できます。これがI2Cの強みです。


動作確認

  1. スケッチをアップロードする(コンパイル時刻でRTCが設定される)
  2. LCDに正しい日時が表示され1秒ごとに更新されれば成功
  3. Arduinoをリセットして時刻がキープされていることを確認する

このプロジェクトで学んだこと

  • RTC(リアルタイムクロック): 電源オフでも時刻を保持するモジュールの使い方を習得しました
  • I2Cバスの複数デバイス接続: 同一バスにRTCとLCDを共存させる方法を学びました
  • 時刻データの操作: DateTimeオブジェクトから年・月・日・時・分・秒を取得する方法を理解しました

次のプロジェクト「自動水やりシステム」は最終プロジェクトです。ここまでの全学習を統合した自律システムを作ります。


深掘り:技術の背景と社会への広がり

時刻管理の歴史:航海から金融取引まで

正確な時刻管理は人類の技術課題であり続けました。15〜17世紀の大航海時代に経度を計算するために正確な時計(マリンクロノメーター)が求められ、1764年にジョン・ハリソンが経度測定用のクロノメーターを完成させました。20世紀にはセシウム原子時計が登場し、現在のUTC(協定世界時)の基準となっています。RTCモジュールに使われるDS3231は温度補償水晶発振器(TCXO)を内蔵し、年間誤差±2分以内の精度を実現します。

タイムスタンプとデジタル社会のインフラ

現代のデジタル社会では正確な時刻管理が経済インフラの基盤です。株式・FX取引システムはマイクロ秒単位のタイムスタンプで取引を記録し、わずかなずれが巨大な損失につながります。インターネットの通信プロトコル(NTP:ネットワーク時刻プロトコル)はRTCと同じ原理で世界中のコンピュータの時刻を同期しています。IoTデバイスが収集するセンサーデータも「いつ」計測したかを示すタイムスタンプが必須であり、RTCはIoTシステムの「時間軸の番人」として機能しています。


プロジェクト24:温湿度センサー全プロジェクト一覧 | 次のプロジェクト:自動水やりシステム →