Reloj Digital TM1637 con Configuración de Hora y Alarma - Prototipo Arduino Nano
Componentes y materiales
- Arduino Nano R3
- Display TM1637 de 4 dígitos
- Módulo RTC DS1302
- LED azul SparkFun LilyPad (5 uds)
- Zumbador (buzzer)
Sobre el proyecto
Este es un prototipo del mecanismo de configuración de hora y alarma que planeo usar en mis próximos proyectos de relojes digitales. Espero que te sea útil. Si se te ocurren mejoras, ¡avísame! Estaré encantado de revisarlas e incorporarlas potencialmente en mi código.
Puedes ver el tutorial completo en [enlace al video].
Si te gusta este contenido y quieres apoyarme para crear videos similares, visita mi Patreon: patreon.com/MariosIdeas o PayPal.
Código
Visualización de hora desde RTC con configuración de hora y funcionalidad de alarma (Arduino)
Este código lee la hora actual del módulo RTC. También permite actualizar la hora actual y configurar la hora de alarma. Las acciones de configuración se realizan con 3 botones.
// Mario's Ideas
// TM1637 Digital Clock con Setup y Funcionalidad de Alarma
#include <Arduino.h>
#include <TM1637Display.h>
#include <virtuabotixRTC.h>
// Módulo RTC - PINES CLK, DAT, RST
virtuabotixRTC myRTC(A1, A2, A3);
// Variables para valores previos leídos del RTC
int minutes;
int hours;
// Variables para hora de alarma
int Alarm_minutes = 05;
int Alarm_hours = 18;
uint8_t Blank[] = {0x0};
int POSITION = 0;
int digits[4]; // Tabla para 4 dígitos (setup hora/alarma)
int interval = 0;
#define Alarm 9 // Botón para activar/desactivar alarma
#define Buzer 13 // Zumbador
#define Led 8 // LED estado
// Estados
boolean Alarm_set = false;
boolean Alarm_in_progress = false;
boolean Setup_on = false;
// Display 4 dígitos - Pines digitales
#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(Alarm, INPUT);
pinMode(Buzer, OUTPUT);
pinMode(Led, OUTPUT);
digitalWrite(Buzer, LOW);
clock.setBrightness(0x0f);
Serial.begin(9600);
}
void Press_A_Button() {
if (interval > 3) {
if (Setup_on == false) {
Setup_on = true;
if (Alarm_set == true) {
digits[0] = (int)Alarm_hours / 10;
digits[1] = Alarm_hours - ((int)Alarm_hours / 10) * 10;
digits[2] = (int)Alarm_minutes / 10;
digits[3] = Alarm_minutes - ((int)Alarm_minutes / 10) * 10;
} else {
digits[0] = (int)myRTC.hours / 10;
digits[1] = myRTC.hours - ((int)myRTC.hours / 10) * 10;
digits[2] = (int)myRTC.minutes / 10;
digits[3] = myRTC.minutes - ((int)myRTC.minutes / 10) * 10;
}
} else {
POSITION++;
if (POSITION == 4) {
if (Alarm_set == true) {
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;
}
}
void Press_B_Button() {
if (interval > 3) {
if (Setup_on) {
digits[POSITION] = digits[POSITION] + 1;
if (POSITION == 0 && digits[POSITION] == 3) digits[POSITION] = 0;
if (POSITION != 0 && digits[POSITION] == 10) digits[POSITION] = 0;
interval = 0;
}
}
interval = 0;
}
void loop() {
// Botón alarma: toggle on/off
if (digitalRead(Alarm) == HIGH && Alarm_set == false) {
if (interval > 30) {
digitalWrite(Led, HIGH);
Alarm_set = true;
delay(300);
}
} else {
if (digitalRead(Alarm) == HIGH && Alarm_set == true) {
if (interval > 30) {
Alarm_set = false;
Alarm_in_progress = false;
digitalWrite(Led, LOW);
delay(300);
}
}
}
myRTC.updateTime();
if (Setup_on == true) {
// Mostrar dígitos con parpadeo en posición actual
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 {
// Comprobar alarma
if (myRTC.minutes == Alarm_minutes && myRTC.hours == Alarm_hours && Alarm_set == true && Setup_on == false) {
Alarm_in_progress = true;
}
if (Alarm_in_progress) {
digitalWrite(Buzer, HIGH);
delay(1000);
digitalWrite(Buzer, LOW);
delay(1000);
}
// Actualizar display solo si cambian los minutos
if (myRTC.minutes != minutes) {
clock.showNumberDecEx((int)myRTC.hours / 10 * 1000 + (myRTC.hours - ((int)myRTC.hours / 10) * 10) * 100 +
(int)myRTC.minutes / 10 * 10 + myRTC.minutes - ((int)myRTC.minutes / 10) * 10,
(0x80 >> 1), true);
minutes = myRTC.minutes;
hours = myRTC.hours;
}
}
if (interval < 200) interval++;
}
Esquemáticos

Proceso de manufactura
- Fiix e IDC Muestran Cómo la Transformación Digital Impulsa la Confiabilidad en Manufactura
- Cómo el Monitoreo de Emisiones Acústicas Evitó un Paro Costoso en una Planta Alimentaria
- 8 formas probadas de reducir costes de mantenimiento e impulsar ingresos con software de mantenimiento digital
- Construya una Alarma de Agua Headless para Raspberry Pi 2 con Adafruit T‑Cobbler Plus
- Construya un robot con Raspberry Pi y Python: Guía completa
- Integración de sensor termopar con Arduino Portenta H7 usando MAX6675
- Reloj de Palabras de Precisión: Visualización del Tiempo en Palabras Minuto a Minuto
- Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO
- Comprendiendo la Funcionalidad e Innovación de los Rodamientos en Maquinaria Moderna
- Sensores Analógicos vs Digitales: Tipos, Aplicaciones y Ejemplos Prácticos
- Acelerando la Transformación Digital: La Plataforma IoT Edge-to-Cloud de Cisco e IBM