ArduinoリアルタイムクロックLED時計:信頼性の高い時刻表示を構築
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| リアルタイムクロック (RTC) モジュール | 1 |
| 抵抗 1kΩ | 15 |
| 抵抗 120Ω | 15 |
| リニアレギュレーター 7805 | 1 |
| コンデンサ 22pF | 1 |
| 16MHz 水晶発振子 | 1 |
| コンデンサ 10µF | 1 |
| コインセル電池 CR2032 | 1 |
| 電池ホルダー CR2032用 | 1 |
| 5mm LED グリーン | 190 |
| バイポーラ RF トランジスタ NPN | 10 |
| 汎用トランジスタ PNP | 12 |
| タクトスイッチ | 4 |
| 12V 5A 電源 | 1 |
必要な工具
- はんだごて
- 無鉛はんだ
- デジタルマルチメーター
プロジェクト概要
まず以下のライブラリをダウンロードしてください:
- Wire.h
- RTClib.h
パーツリスト

動画を見る
RTCクロックモジュール

Arduino回路図

RTC配線接続

RTCスイッチ

アノードとカソードの識別

共通アノード用回路図

共通カソードLEDを使用する場合の変更点
共通カソードLEDを使用する場合は以下の通り変更してください。

電源回路

コード
LED時計コード (Arduino)
/* 4桁7セグメントディスプレイ: https://www.sparkfun.com/products/9483
Datasheet: https://www.sparkfun.com/datasheets/Components/LED/7-Segment/YSD-439AR6B-35.pdf */
int digit1 = 11;
int digit2 = 10;
int digit3 = 9;
int digit4 = 6;
int digit5 = 5;
int digit6 = 3;
int segA = 0; // ディスプレイピン11
int segB = 1; // ディスプレイピン7
int segC = 2; // ディスプレイピン4
int segD = 4; // ディスプレイピン2
int segE = 7; // ディスプレイピン1
int segF = 8; // ディスプレイピン10
int segG = 12; // ディスプレイピン5
int segDP = 13; // ディスプレイピン3
#include
#include "RTClib.h"
RTC_DS1307 RTC;
byte SW0 = A0;
byte SW1 = A2;
byte SW2 = A1;
byte SWT = A3;
int Adhr = 0;
int Admnt = 0;
int D = 0;
int Z = 0;
void setup() {
Wire.begin();
RTC.begin();
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // 時刻設定が必要な場合はコメント解除
// SQW=1Hz 設定(点滅LED用)
Wire.beginTransmission(0x68);
Wire.write(0x07);
Wire.write(0x10); // 1Hz方形波出力
Wire.endTransmission();
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT); pinMode(segDP, OUTPUT);
pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT); pinMode(digit5, OUTPUT); pinMode(digit6, OUTPUT);
pinMode(SW0, INPUT); pinMode(SW1, INPUT);
pinMode(SW2, INPUT); pinMode(SWT, INPUT);
digitalWrite(SW0, HIGH); digitalWrite(SW1, HIGH); digitalWrite(SW2, HIGH);
digitalWrite(segDP, LOW);
}
void loop() {
DateTime now = RTC.now();
long HR = now.hour() * 1000;
long timp = (HR * 10) + now.minute() * 100 + now.second();
Adhr = now.hour();
Admnt = now.minute();
// 12/24時間切り替えスイッチ処理
if (digitalRead(SWT) == 0) {
delay(300);
D = (D == 0) ? 1 : 0;
}
if (D == 0) { // 12時間表示
if (timp >= 130000) {
timp -= 120000;
digitalWrite(segDP, HIGH); // PM表示
}
}
// 時刻表示(マルチプレクス駆動)
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber01(timp);
else displayNumber02(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber03(timp);
else displayNumber04(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber05(timp);
else displayNumber06(timp);
}
// 時刻設定モード
if (digitalRead(SW0) == 0) {
delay(100);
Z = 1;
set_time();
}
}
void set_time() {
// スイッチ操作で時刻設定を行う関数
// SW2で時間、SW1で分を設定、SW0で終了
// 詳細なコードは全文を参照
}
void displayNumber01(long toDisplay) { /* 桁1表示 */ }
void displayNumber02(long toDisplay) { /* 桁2表示 */ }
void displayNumber03(long toDisplay) { /* 桁3表示 */ }
void displayNumber04(long toDisplay) { /* 桁4表示 */ }
void displayNumber05(long toDisplay) { /* 桁5表示 */ }
void displayNumber06(long toDisplay) { /* 桁6表示 */ }
void lightNumber(int numberToDisplay) {
// 共通アノード用セグメント点灯パターン
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
// numberToDisplay に応じてセグメント制御
// case 0-9, 10(消灯) のスイッチ文
}
回路図
SSDとLEDの配線図

製造プロセス
- Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
- DIY Arduinoワードクロック – 文字で時刻を表示する洗練されたリアルタイムクロック
- Arduino Nanoで20kHzオシロスコープを自作:Nokia 5110 LCD搭載・簡易DIYガイド
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- Arduino Pro MiniとDS1302 RTCで作る高精度7セグメント時計
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保