TM1637デジタル時計:時刻設定・アラーム機能付き Arduino Nano試作版
部品と材料
| Arduino Nano R3 ×1 |
| TM1637 4桁7セグメントディスプレイ ×1 |
| DS1302 RTCモジュール ×1 |
| 青色LED(5個) ×1セット |
| ブザー ×1 |
プロジェクトについて
このプロジェクトは、次回作のデジタル時計で使用予定の「時刻設定・アラーム設定機構」のプロトタイプです。お役に立てれば幸いです。改善案があればぜひコメントで教えてください。コードに取り入れさせていただきます。
詳細なチュートリアル動画はこちら。
応援してくださる方はPatreonまたはPayPalでサポートいただけます。
コード
RTCから時刻取得+時刻設定+アラーム設定機能 (Arduino)
3つのボタンで操作:割り込みピン(ピン2、3)で設定モード突入・桁移動・数値変更、ピン9でアラームON/OFF。
// Mario's Ideas
// TM1637 Digital Clock with Setup and Alarm Functionality
#include <Arduino.h>
#include <TM1637Display.h>
#include <virtuabotixRTC.h>
// RTCモジュール宣言:CLK=A1, DAT=A2, RST=A3
virtuabotixRTC myRTC(A1, A2, A3);
int minutes, hours; // RTCから読み取った前回値
int Alarm_minutes = 5; // アラーム時刻(分)
int Alarm_hours = 18; // アラーム時刻(時)
uint8_t Blank[] = {0x0};
int POSITION = 0; // 設定中の桁位置
int digits[4]; // 4桁分の数値(設定用)
int interval = 0; // チャタリング防止用カウンタ
#define AlarmBtn 9 // アラームON/OFFボタン
#define BuzzerPin 13 // ブザー
#define LedPin 8 // ステータスLED
boolean Alarm_set = false; // アラーム設定済みフラグ
boolean Alarm_in_progress = false; // アラーム鳴動中フラグ
boolean Setup_on = false; // 設定モードフラグ
#define CLK 4 // TM1637 CLK
#define DIO 5 // TM1637 DIO
TM1637Display clock(CLK, DIO);
void setup() {
attachInterrupt(digitalPinToInterrupt(2), Press_A_Button, RISING);
attachInterrupt(digitalPinToInterrupt(3), Press_B_Button, RISING);
pinMode(AlarmBtn, INPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(LedPin, OUTPUT);
digitalWrite(BuzzerPin, LOW);
clock.setBrightness(0x0f);
Serial.begin(9600);
}
// ボタンA:設定モード突入 / 桁移動 / 確定
void Press_A_Button() {
if (interval > 3) {
if (!Setup_on) {
Setup_on = true;
// 現在値(時刻またはアラーム)をdigits配列にコピー
if (Alarm_set) {
digits[0] = Alarm_hours / 10;
digits[1] = Alarm_hours % 10;
digits[2] = Alarm_minutes / 10;
digits[3] = Alarm_minutes % 10;
} else {
digits[0] = myRTC.hours / 10;
digits[1] = myRTC.hours % 10;
digits[2] = myRTC.minutes / 10;
digits[3] = myRTC.minutes % 10;
}
} else {
POSITION++;
if (POSITION == 4) { // 4桁完了で確定
if (Alarm_set) {
Alarm_minutes = digits[3] + digits[2] * 10;
Alarm_hours = digits[1] + digits[0] * 10;
} else {
myRTC.setDS1302Time(0, digits[3] + digits[2] * 10, digits[1] + digits[0] * 10,
myRTC.dayofweek, myRTC.dayofmonth, myRTC.month, myRTC.year);
// 表示更新
clock.showNumberDec(digits[0], false, 1, 0);
clock.showNumberDec(digits[1], false, 1, 1);
clock.showNumberDec(digits[2], false, 1, 2);
clock.showNumberDec(digits[3], false, 1, 3);
}
POSITION = 0;
Setup_on = false;
}
}
interval = 0;
}
}
// ボタンB:数値インクリメント
void Press_B_Button() {
if (interval > 3) {
if (Setup_on) {
digits[POSITION]++;
if (POSITION == 0 && digits[POSITION] == 3) digits[POSITION] = 0; // 十の位(時)は0-2
if (POSITION != 0 && digits[POSITION] == 10) digits[POSITION] = 0; // その他は0-9
interval = 0;
}
}
interval = 0;
}
void loop() {
// アラームON/OFFボタン(長押し30カウントで切替)
if (digitalRead(AlarmBtn) == HIGH && !Alarm_set) {
if (interval > 30) { digitalWrite(LedPin, HIGH); Alarm_set = true; delay(300); }
} else if (digitalRead(AlarmBtn) == HIGH && Alarm_set) {
if (interval > 30) { Alarm_set = false; Alarm_in_progress = false; digitalWrite(LedPin, LOW); delay(300); }
}
myRTC.updateTime();
if (Setup_on) {
// 設定中:対象桁を点滅表示
clock.showNumberDec(digits[0], false, 1, 0);
clock.showNumberDec(digits[1], false, 1, 1);
clock.showNumberDec(digits[2], false, 1, 2);
clock.showNumberDec(digits[3], false, 1, 3);
delay(200);
clock.setSegments(Blank, 1, POSITION);
delay(200);
clock.showNumberDec(digits[0], false, 1, 0);
clock.showNumberDec(digits[1], false, 1, 1);
clock.showNumberDec(digits[2], false, 1, 2);
clock.showNumberDec(digits[3], false, 1, 3);
} else {
// 通常時刻表示
if (myRTC.minutes == Alarm_minutes && myRTC.hours == Alarm_hours && Alarm_set && !Setup_on) {
Alarm_in_progress = true;
}
if (Alarm_in_progress) {
digitalWrite(BuzzerPin, HIGH); delay(1000);
digitalWrite(BuzzerPin, LOW); delay(1000);
}
// 分が変わった時のみ再描画(チラツキ防止)
if (myRTC.minutes != minutes) {
clock.showNumberDecEx((myRTC.hours / 10 * 1000) + (myRTC.hours % 10) * 100 +
(myRTC.minutes / 10 * 10) + (myRTC.minutes % 10),
(0x80 >> 1), true); // コロン点滅
minutes = myRTC.minutes;
hours = myRTC.hours;
}
}
if (interval < 200) interval++;
}
回路図

製造プロセス
- FiixとIDCが示す:デジタルトランスフォーメーションが製造業の信頼性をどう高めるか
- 音響エミッション監視で大規模ダウンタイムを防止:食品メーカーが時間とコストを節約
- デジタルメンテナンスソフトウェアでコスト削減と収益アップを実現する8つの実証済み方法
- Adafruit T-Cobbler PlusでヘッドレスRaspberry Pi 2水漏れアラームを構築
- Raspberry Pi と Python でロボットを構築:完全ガイド
- Arduino Portenta H7にMAX6675でサーモカップル温度センサーを接続する
- 高精度ワードクロック:分単位で時刻を文字表示
- DS1302 RTCとArduino UNOで作る信頼性の高い目覚まし時計
- 現代機械におけるベアリングの機能と革新を理解する
- アナログセンサーとデジタルセンサー:種類、応用、実例
- デジタルトランスフォーメーションの加速:Cisco & IBMのエッジツークラウドIoTプラットフォーム