Construye un Reloj Berlín con Arduino UNO – Reloj de Matriz LED DIY
Componentes y Suministros
| Arduino UNO | 1 | |
| MAX7219 (Integrado) | 1 | Driver de display LED de 8 dígitos, usado en matrices LED |
| Reloj Tiempo Real (RTC) DS1307 | 1 | |
| LED 5 mm Amarillo | 13 | Filas de horas y minutos x5 |
| LED 5 mm Rojo | 11 | Filas de horas simples y minutos simples (usados RGB por disponibilidad) |
| Resistencia 10k Ω | 1 | Para ajuste de corriente MAX7219 (Iset) |
Sobre el Proyecto
Este proyecto es una adaptación de un tutorial publicado en Instructables. Un reloj no tan cotidiano.
Introducción: Reloj Berlín
El Reloj Berlín (BerlinUhr o Mengenlehreuhr) fue probablemente el primer reloj digital. Existe desde 1975. Más info en Wikipedia.
¿Cómo se lee la hora? Cuatro filas de luces:
- Fila superior: Horas × 5 (4 LEDs rojos, cada uno = 5 horas)
- Segunda fila: Horas simples 1–4 (4 LEDs rojos)
- Tercera fila: Minutos × 5 (11 LEDs amarillos, cada uno = 5 min)
- Fila inferior: Minutos simples 1–4 (4 LEDs amarillos)
- LED superior grande: Parpadea cada segundo
Ejemplo: 2×5h + 3h + 6×5min + 2min = 13:32 (formato 24h).
Paso 1: Electrónica
Arduino UNO, RTC DS1307 (I2C pines A4/A5), MAX7219 (SPI pines 10,11,12), LED segundos en pin 13. Resistencia 68kΩ en pin Iset del MAX7219 para limitar corriente (20kΩ causaba apagado tras 10 min).
Paso 2: Montaje
Pines MAX7219 clave:
- Pin 1 (DIN) → Arduino pin 12
- Pin 12 (LOAD/CS) → Arduino pin 10
- Pin 13 (CLK) → Arduino pin 11
- Pins 4,9 → GND | Pin 19 → VCC | Pin 18 (Iset) → VCC via 68kΩ
Salidas DIG 0–4 controlan filas de LEDs. Segmentos A–G + DP reciben palabras binarias (byte) para encender LEDs individuales. Nota: El bit MSB corresponde al segmento DP, no al A – esto obligó a ajustar el código tras soldar.
Paso 3: Los LEDs
Los LEDs se agrupan por filas (cátodos comunes por fila, ánodos a segmentos del MAX7219). El LED de segundos va directo al pin 13.
Paso 4: El Código
Usa librería LedControl (GitHub). Variables en neerlandés (vijfuren = horas×5, vijfminuten = minutos×5). Convierte BCD del RTC a decimal, calcula filas y envía bytes al MAX7219.
#include <LedControl.h>
#include <Wire.h>
const int DS1307 = 0x68; // A5=SCL, A4=SDA
// ... arrays días/meses ...
byte second, minute, hour, weekday, monthday, month, year;
LedControl lc = LedControl(12, 11, 10, 1); // DIN, CLK, LOAD, devices
void setup() {
Wire.begin(); Serial.begin(9600);
pinMode(13, OUTPUT);
lc.shutdown(0, false); lc.setIntensity(0, 8); lc.clearDisplay(0);
}
void loop() {
readTime();
// Parpadeo LED segundos
if (second != lastSecond) { uitgang = !uitgang; digitalWrite(13, uitgang); lastSecond = second; }
// Actualizar display cada minuto
if (minute != lastMinute) { printTime(); lastMinute = minute; }
}
void printTime() {
// Cálculo filas: 5h, 1h, 5min (2 bytes), 1min
// Conversión a patrones binarios (nul, een, twee... acht, negen, tien, elf)
// Envío a lc.setRow(0, fila, valor)
}
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void readTime() {
Wire.beginTransmission(DS1307); Wire.write(0); Wire.endTransmission();
Wire.requestFrom(DS1307, 7);
second = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read()); weekday = bcdToDec(Wire.read());
monthday = bcdToDec(Wire.read()); month = bcdToDec(Wire.read()); year = bcdToDec(Wire.read());
}
// ... función digitaal() para convertir 0-11 a patrones de bits ...
Código directo y educativo. ¡De paso aprendes a contar en neerlandés del 0 al 11! ;-)
Código / Librerías
LedControl: https://github.com/wayoda/LedControl
Proceso de manufactura
- Reloj de cuco: historia, artesanía y evolución moderna
- El reloj de arena: historia, artesanía y atractivo moderno
- La evolución de la medición del tiempo: de los relojes de sol a los relojes de cuarzo de precisión
- Rpibot: Robot Móvil Económico y Expandible para Aprendizaje de Sistemas Embebidos
- Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
- Reloj Espejo Infinito: Elegancia infinita y hora precisa
- Dominando Cálculos de Constante de Tiempo para Circuitos RC y RL
- Técnicas de simulación en Verilog para verificación RTL confiable
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar time.sleep() en Python: Mejores Prácticas, Multihilo y Ejemplos Reales
- Dominando fechas y horas en Python: Guía práctica