Reloj de Matriz LED de Alta Precisión con DS3231 RTC, BME280, BH1750 y Conectividad NTP ESP01
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Nano R3 | 1 | |
| DS3231 (Módulo RTC I2C) | 1 | Versión barata de eBay, quitar resistencia para evitar carga de batería |
| BME280 (Sensor atmosférico: Temp, Humedad, Presión) | 1 | Versión barata de eBay |
| BH1750 (Sensor de luz) | 1 | De eBay |
| Matriz LED MAX7219 32x8 | 1 | 4 módulos 8x8 en cascada |
| Condensador 10 µF | 2 | Desacoplo alimentación |
| ESP8266 ESP-01 | 1 | Opcional: para sincronía NTP |
| LM3940IT-3.3 (Regulador LDO 3.3V) | 1 | Para alimentar ESP-01 |
| Conversor de nivel lógico (Level Shifter) | 1 | Necesario para ESP-01 (3.3V ↔ 5V) |
Sobre este proyecto
Este proyecto me inició en el mundo de Arduino. Encontré el Word Clock LED de Nick y quise hacer algo similar.
Desde que descargué su código, lo he modificado para incluir sensores adicionales y botones, así como añadir un ESP-01 para sincronización NTP.
- BH1750: Auto-ajuste de brillo del display según luz ambiente; puede apagar el display por la noche.
- BME280: Muestra temperatura, humedad y presión atmosférica.
- ESP-01: Obtiene la hora desde
pool.ntp.org.
Los botones adicionales facilitan el ajuste de configuraciones: sensor de luz, cambio de fuentes, ajustes NTP/DST/UTC.
Se han añadido 6 nuevas fuentes, creadas con dotmatrixtool.com.
He movido bastante código a PROGMEM para ahorrar RAM.
Repositorio GitHub: https://github.com/Ratti3/miniclock
Archivos de código en GitHub
Arduino LEDClock32x8.ino
ProgmemData.h
Arduino ESP-01_NTP.ino
LEDClock32x8_ESP01-NTP.ino
ProgmemData.h
Funcionamiento ESP-01 NTP
El ESP-01 duerme (WiFi apagado) cuando no se necesita, y se despierta vía serial para obtener la hora en formato UNIX. El SSID y contraseña se pasan desde el código Arduino por comodidad.
Incluye cálculos DST/UTC/BST ajustables o desactivables vía menú.
La configuración se guarda en EEPROM: los cambios persisten tras apagado/encendido.
Ejemplo de comunicación Serie Arduino ↔ ESP-01:
Arduino: Enviada petición NTP a ESP01
ESP01: Petición NTP recibida de Arduino [intento 1 de 3]
Conectando a SSID: MiRed....conectado
SSID: MiRed, IP: 192.168.0.135
RSSI: -42 dBm
Enviando paquete NTP a: 195.195.221.100 [intento 1]
Enviando paquete NTP a: 195.195.221.100 [intento 2]
UNIX 1562848457
Desactivando WiFi....ok
Nota: Debes ajustar el código del sensor de luz a tus condiciones lumínicas. Yo lo programé con luz solar intensa junto a una ventana.
Cableado (Wiring)
DS3231, BH1750, BME280 (I2C):
SCL = A5
SDA = A4
VCC = 3.3V
Matriz LED MAX7219 32x8:
CLK = D11
CS = D10
DIN = D12
VCC = 5V
Pulsadores:
D2 - Menú
D3 - Fecha / +
D4 - Temperatura / -
D5 - Opciones display
ESP-01 (Opcional):
D7 - TX pin ESP01 (via level shifter)
D6 - RX pin ESP01 (via level shifter)
Variables globales configurables (con ubicación EEPROM)
// Configuración reloj
// [200] Brillo por defecto (0-15), ajustable vía menú
byte intensity = 2;
// [201] Modo reloj por defecto. 0 = modo_basico
byte clock_mode = 0;
// [206] Modo aleatorio - cambia tipo display cada pocas horas. 0 = off
bool random_mode = 0;
// [207] Modo fuente aleatoria - cambia fuente cada pocas horas. 1 = on
bool random_font_mode = 0;
// [208] Formato 12/24 horas. 0 = 24h, 1 = 12h (AM/PM)
bool ampm = 0;
// Configuración luz
// [202] Modo display on/off por sensor luz. 0=normal, 1=siempre on, 2=siempre off, 3-5=definido por hour_off
byte display_mode = 5;
// [209] Ajuste automático de intensidad por sensor luz
bool auto_intensity = 1;
// Horas para apagar display si hay oscuridad (formato 24h)
byte hour_off_1 = 21;
byte hour_off_2 = 22;
byte hour_off_3 = 23;
// Configuración fuentes (ajustables vía menú)
// [203] Estilo fuente grande reloj
byte font_style = 2;
// [204] Ajuste offset fuente grande
byte font_offset = 1;
// [205] Ajuste columnas fuente grande
byte font_cols = 6;
// DST, NTP y UTC
// [210] Habilitar función DST (horario verano)
bool dst_mode = 1;
// [211] Habilitar función NTP
bool ntp_mode = 1;
// Segundos para ajustar valor NTP antes de aplicar a DS3231
byte ntp_adjust = 1;
// [213] Offset UTC (horas)
int8_t utc_offset = 0;
// Hora sincronización diaria NTP/DST (dejar 2am si se usa DST)
byte ntp_dst_hour = 2;
// Reintentos NTP (1 = ~35 seg total, valores 1-9)
byte ntp_max_retry = 3;
// Timeout NTP (segundos), se multiplica por ntp_max_retry
byte ntp_timeout = 45;
// Credenciales WiFi (pasadas a ESP01 via SoftwareSerial)
// Longitud combinada SSID + password ≤ 72 caracteres
const byte ssid_len = 8;
const char ssid[] = "TuSSID";
const byte pass_len = 12;
const char pass[] = "TuPassword";
Código
Código completo en GitHub: https://github.com/Ratti3/miniclock
Esquemáticos
[Diagrama de conexiones - El BH1750 se conecta igual que BME280 por I2C]
Proceso de manufactura
- Construye un reloj en tiempo real con Arduino para horarios de oración islámica
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Reloj analógico por persistencia de visión (POV) con Arduino Nano – Proyecto DIY
- Lámpara Matriz LED con Pistola de Pegamento Caliente – Construye tu Propia Pantalla Colorida
- Controlar un LED de Arduino con Cortana vía Bluetooth en Windows 10
- Reloj flip Arduino con matriz LED 8×8: proyecto DIY de reloj en tiempo real
- Control de Matriz LED 8×8 con Arduino Uno: Guía Paso a Paso
- Reloj Preciso Basado en GPS: Precisión Asequible y Fiabilidad
- Matriz LED 8x8 Bluetooth con Texto Desplazable - Proyecto Arduino
- Crea el Clásico Juego Asteroids con Arduino Mega y Matriz LED MAX72XX
- Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO