Цифровые часы на TM1637 с настройкой времени и будильником — прототип на Arduino Nano
Компоненты и материалы
- Arduino Nano R3 — 1 шт.
- Дисплей TM1637 (4 разряда) — 1 шт.
- RTC-модуль DS1302 — 1 шт.
- Светодиод (синий, 5 шт.) — 1 комплект
- Зуммер — 1 шт.
О проекте
Прототип механизма настройки времени и будильника для будущих проектов цифровых часов. Надеюсь, будет полезно. Предложения по улучшению приветствуются!
Полный видео-туториал доступен на канале автора. Поддержать проект можно через Patreon или PayPal.
Функционал
- Отображение текущего времени с RTC DS1302
- Настройка времени тремя кнопками (вход в режим, инкремент, подтверждение)
- Настройка будильника (вкл/выкл отдельной кнопкой)
- Звуковой сигнал будильника (зуммер) и индикация светодиодом
- Мигающий курсор при настройке разрядов
Код (Arduino)
// Mario's Ideas
// TM1637 Digital Clock with Setup and Alarm Functionality
#include
#include
#include
// RTC module declaration: CLK, DAT, RST
virtuabotixRTC myRTC(A1, A2, A3);
int minutes, hours;
int Alarm_minutes = 5;
int Alarm_hours = 18;
uint8_t Blank[] = {0x0};
int POSITION = 0;
int digits[4];
int interval = 0;
#define AlarmBtn 9
#define Buzzer 13
#define Led 8
boolean Alarm_set = false;
boolean Alarm_in_progress = false;
boolean Setup_on = false;
#define CLK 4
#define DIO 5
TM1637Display clock(CLK, DIO);
void setup() {
attachInterrupt(digitalPinToInterrupt(2), Press_A_Button, RISING);
attachInterrupt(digitalPinToInterrupt(3), Press_B_Button, RISING);
pinMode(AlarmBtn, INPUT);
pinMode(Buzzer, OUTPUT);
pinMode(Led, OUTPUT);
digitalWrite(Buzzer, LOW);
clock.setBrightness(0x0f);
Serial.begin(9600);
}
void Press_A_Button() {
if (interval > 3) {
if (!Setup_on) {
Setup_on = true;
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) {
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);
}
POSITION = 0;
Setup_on = false;
}
}
interval = 0;
}
}
void Press_B_Button() {
if (interval > 3 && Setup_on) {
digits[POSITION]++;
if (POSITION == 0 && digits[POSITION] == 3) digits[POSITION] = 0;
if (POSITION != 0 && digits[POSITION] == 10) digits[POSITION] = 0;
interval = 0;
}
}
void loop() {
// Обработка кнопки будильника (долгое нажатие)
if (digitalRead(AlarmBtn) == HIGH && !Alarm_set) {
if (interval > 30) { digitalWrite(Led, HIGH); Alarm_set = true; delay(300); }
} else if (digitalRead(AlarmBtn) == HIGH && Alarm_set) {
if (interval > 30) { Alarm_set = false; Alarm_in_progress = false; digitalWrite(Led, 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);
} else {
// Проверка будильника
if (myRTC.minutes == Alarm_minutes && myRTC.hours == Alarm_hours && Alarm_set && !Setup_on) {
Alarm_in_progress = true;
}
if (Alarm_in_progress) {
digitalWrite(Buzzer, HIGH); delay(1000);
digitalWrite(Buzzer, 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++;
}
Схема подключения

Производственный процесс
- Аналоговые и цифровые датчики: типы, применение и практические примеры
- Создание headless сигнализации утечки воды на Raspberry Pi 2 с Adafruit T‑Cobbler Plus
- Создание робота на Raspberry Pi и Python: полное руководство
- Fiix и IDC: как цифровая трансформация повышает надежность производства
- Как акустическая эмиссия спасла пищевого производителя от крупного простоя
- 8 проверенных способов сократить затраты на обслуживание и увеличить выручку с цифровым ПО
- Интеграция термопары с Arduino Portenta H7 через MAX6675
- Ускорение цифровой трансформации: Edge-to-Cloud IoT платформа Cisco & IBM
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код
- Понимание функциональности и инноваций подшипников в современном машиностроении