Este proyecto se propone implementar un reloj digital utilizando un ESP32, el RTC incluido en el mismo, sincronización por red (NTP) y un modo de bajo consumo (Deep Sleep).
Puedes encontrar más información en mi blog: The Nerdy Apprentice.
- Sincronización NTP: Obtiene la hora exacta de internet en cada despertar para asegurar precisión total.
- Reloj de Tiempo Real (RTC): Mantiene la hora internamente durante el Deep Sleep (usado como respaldo si falla el WiFi).
- Deep Sleep: El dispositivo permanece apagado la mayor parte del tiempo, consumiendo microamperios.
- Activación por Botón (EXT0): Despierta al presionar un botón físico para mostrar la hora.
- Pantalla OLED SSD1306: Visualización clara de la hora y mensajes de estado.
- Gestión de Drift: Corrige automáticamente la desviación natural del oscilador interno del ESP32.
Durante el desarrollo de este proyecto, se identificó que el RTC interno del ESP32 (específicamente el oscilador RC de 150kHz) tiene una desviación significativa cuando funciona de forma autónoma durante el Deep Sleep. En pruebas de varias horas, el reloj puede adelantarse o retrasarse varios minutos debido a:
- Inestabilidad térmica del oscilador RC interno.
- Falta de un cristal de cuarzo externo de 32.768 kHz en la mayoría de las placas de desarrollo.
Solución implementada: Para garantizar que el usuario siempre vea la hora correcta al presionar el botón, el código ahora realiza una sincronización NTP rápida en cada despertar. Aunque esto aumenta ligeramente el consumo de batería por cada consulta, asegura que el dispositivo funcione como un reloj confiable.
- ESP32 (ej: DOIT DevKit V1, NodeMCU-32S, etc.)
- Display OLED SSD1306 (128x64, I2C)
- Pulsador (Push Button)
- Resistencia de 10kΩ (Pull-down)
- Batería o Fuente de Alimentación: Se recomienda alimentar vía pin 5V/VIN.
sketch/sketch.ino: Lógica principal (gestión de estados y sueño).sketch/time_manager.cpp/h: Sincronización NTP y gestión del RTC interno.sketch/wifi_connect.cpp/h: Conectividad WiFi y mDNS.sketch/display_utils.cpp/h: Controladores de la pantalla OLED.sketch/config_example.h: Plantilla para credenciales (debe renombrarse aconfig.h).
-
Librerías Necesarias: Instala las siguientes librerías desde el Gestor de Librerías de Arduino:
ESP32Time(por fbiego)Adafruit SSD1306Adafruit GFX Library
-
Configuración de Red:
- Renombra
sketch/config_example.hasketch/config.h. - Edita
sketch/config.hcon tu SSID y Password de WiFi.
- Renombra
-
Conexiones:
- OLED: SDA -> GPIO 21, SCL -> GPIO 22.
- Botón: Pin 27 -> (Pulsador) -> 3.3V.
- Resistencia: Conectar una resistencia de 10kΩ entre el Pin 27 y GND (Pull-down) para asegurar lecturas estables.
Para una máxima seguridad, se recomienda alimentar el proyecto a través del pin 5V (VIN). Esto permite que el regulador de voltaje de la placa estabilice la entrada (especialmente útil con baterías de Litio que cargadas superan los 4V), evitando daños al ESP32 y eliminando la necesidad de convertidores elevadores (Boost) externos que reducirían la eficiencia.
Este proyecto está bajo la licencia GNU General Public License v3.0 (GPL-3.0). Consulta el archivo LICENSE para más detalles.
