🕒 ESP32-S3: Reloj Inteligente Dual (WiFi + BLE) Proyecto de reloj sincronizado por WiFi (NTP) con control remoto Bluetooth LE y visualización en LCD I2C.
Este proyecto demuestra la implementación de un sistema embebido robusto capaz de gestionar conectividad inalámbrica dual, sincronización de tiempo real y una interfaz de usuario física mediante MicroPython. ¿Qué hemos mejorado en esta versión?
Estado actual: El proyecto ha alcanzado la v1.1, resolviendo los desafíos críticos de coexistencia de radio. Gracias a una gestión optimizada de la memoria RAM y pausas de CPU fragmentadas, el dispositivo mantiene una conexión Bluetooth estable mientras el WiFi opera en segundo plano.
PM_NONE) que permite al WiFi y al Bluetooth trabajar simultáneamente sin interferencias.Garbage Collection en tiempo real para asegurar estabilidad operativa 24/7.| LCD (I2C) | ESP32-S3 |
|---|---|
| GND | GND |
| VCC | 3V |
| SDA | GPIO 4 |
| SCL | GPIO 5 |
config.example.py a config.py.
ampy o Thonny para subir estos archivos a la raíz de la placa:
LcdApi.pyi2c_lcd.pyconfig.pymain.py🕒 Actualización: Estabilizando el Reloj Bluetooth (v1.1)
En esta etapa del proyecto, me enfrenté a un reto clásico del ESP32-S3: la inestabilidad de la conexión Bluetooth cuando el WiFi está activo. Aquí explico cómo lo solucioné. 🛠 El Problema
Al conectar el móvil mediante Serial Bluetooth Terminal, la conexión se caía a los pocos segundos. Esto ocurría por dos razones:
Conflicto de Antena: El WiFi y el Bluetooth comparten la radiofrecuencia y se "pisaban" entre sí.
Bloqueo del Procesador: El uso de time.sleep(1) dejaba al ESP32 "sordo" ante las peticiones del Bluetooth.
💡 Las 4 Claves de la Solución
Prioridad de Radio: Desactivé el modo de ahorro de energía del WiFi para que la antena estuviera siempre disponible para el Bluetooth.
Python
wlan.config(pm=network.WLAN.PM_NONE)
Flags de Comunicación: Actualicé los permisos del servicio BLE a FLAG_WRITE_NO_RESPONSE. Esto permite que el móvil envíe comandos sin esperar confirmación, eliminando latencias y desconexiones.
Pausas Inteligentes: Sustituí el sleep(1) por un bucle fragmentado de 10 ciclos de 100ms. Esto permite que el ESP32 revise el canal Bluetooth 10 veces por segundo sin afectar la precisión del reloj.
Higiene de RAM: Introduje gc.collect() para limpiar la memoria dinámica en cada ciclo, evitando que el stack de Bluetooth se quede sin espacio tras un uso prolongado.
📺 Resultado Final
Ahora el reloj sincroniza la hora por internet al arrancar y mantiene una conexión Bluetooth sólida como una roca. Esto permite encender/apagar la luz del LCD y consultar el estado desde el móvil de forma instantánea y sin desconexiones accidentales.
Proyecto desarrollado por Sartaza.