Reloj de matrices LED rojas en una carcasa impresa en 3D blanca, apoyado sobre un escritorio, mostrando la hora en dígitos de puntos.

Este post es uno de esos proyectos que arrancan con “quiero un reloj lindo” y terminan en: firmware, sincronización NTP, endpoints REST, y una marquesina que te tira notificaciones como si fuera una mini Times Square en tu escritorio 😄

La idea: usar un ESP8266 y 4 módulos LED matrix 8x8 (basados en MAX7219) para mostrar:

  • La hora, obtenida de Internet (NTP)
  • Posibilidad de sumar un RTC para resiliencia
  • Mensajes estilo marquesina que le envío por API REST

Repositorio del proyecto (código + detalles):
https://github.com/imaerials/esp-mx7219-clock


Objetivos del proyecto

Mis requisitos eran bien concretos:

  1. Que la hora sea correcta (y que no dependa de reinicios)
  2. Poder empujar mensajes desde cualquier lado (PC, celular, otra app)
  3. Que sea fácil de extender: clima, recordatorios, estado de servicios, etc.

Hardware (BOM rápido)

Lo básico para armarlo:

  • 1× ESP8266 (NodeMCU / Wemos D1 mini / similar)
  • 4× módulos LED matrix 8x8 (MAX7219) encadenables
  • Fuente 5V estable (esto es importante, las matrices consumen)
  • Cables Dupont / protoboard (o PCB si te ponés fino)
  • (Opcional) Módulo RTC (por ejemplo DS3231) si querés hora sin Internet

Tip real: si ves parpadeos o brillo raro, casi siempre es alimentación o masa compartida mal resuelta.


Cómo funciona (a nivel arquitectura)

Me gusta pensar el firmware en 3 partes:

  1. Time layer: sincroniza hora por NTP y mantiene el clock
  2. Display layer: renderiza hora / mensajes en las matrices
  3. API layer: recibe comandos (mensaje, modo, intensidad, etc.)

Eso te deja el proyecto prolijo y fácil de crecer sin que sea “un loop infinito con ifs” 😅


Sincronización de hora (NTP)

La hora viene de Internet usando NTP. La estrategia típica:

  • Al boot, conecto Wi-Fi
  • Sincronizo NTP
  • Mantengo la hora en memoria y re-sincronizo cada X tiempo

Ventajas:

  • hora correcta sin calibración manual
  • si reinicia, vuelve a estar bien en segundos

Si agregás RTC, podés hacer:

  • usar RTC como “fuente local” si no hay Internet
  • y cuando vuelve la red, corregir RTC contra NTP

Mensajes tipo marquesina (API REST)

El componente divertido: poder mandarle un texto y que lo scrollee.

No voy a “prometer” endpoints exactos acá porque pueden cambiar con el tiempo, pero la idea es algo así:

  • POST /api/message (o similar) para enviar un texto
  • GET /api/status para ver estado (modo actual, hora, intensidad, etc.)
  • POST /api/config para setear brillo, velocidad de scroll, etc.

En el repo están los detalles actualizados y el código completo:
https://github.com/imaerials/esp-mx7219-clock

Ejemplo de request (conceptual):

curl -X POST http://<ip-del-esp>/api/message   -H "Content-Type: application/json"   -d '{"text":"🚀 Deploy terminado. Mate time."}'

Cosas que aprendí (y que me ahorraron dolor)

  • Fuente de 5V: las matrices son sensibles a caídas de tensión
  • Longitud de cables: cuanto más corto, mejor (sobre todo señal)
  • Brillo: al máximo queda fachero… pero el consumo sube fuerte
  • Reintentos Wi-Fi: si no hacés manejo de reconexión, te quedás sin reloj
  • Separar capas: tiempo / display / API (vale oro cuando escalás features)

Ideas para la v2

La lista de “ya que estoy…” nunca termina, pero algunas cosas que me copan:

  • Mostrar clima o temperatura (si tenés sensor)
  • Notificaciones de Home Assistant
  • Modo “no molestar” (por ejemplo de noche)
  • Panel web simple para configurar Wi-Fi y opciones
  • Logs básicos y métricas (para debug cuando está lejos)

Cierre

Este proyecto es un buen ejemplo de mi tipo de homelab: cosas chicas, útiles y que abren puertas a mejorar el stack entero (red, observabilidad, automatización).

Si querés replicarlo o forkearlo, acá está el repo:
https://github.com/imaerials/esp-mx7219-clock