Función: drawHeartbeat()
Cada 500 ms alterna un pequeño cuadrado rojo/negro en la esquina superior izquierda.
Sirve para:
- Confirmar que el firmware no está congelado
- Ver que el bucle principal sigue ejecutándose
- Detectar bloqueos de MQTT o WiFi
Es simple pero muy útil en pantallas embebidas.
8) 📡 Estado MQTT (OK / ERROR)
Función: updateMQTTStatus()
Cada 5 segundos:
- Comprueba si
client.connected() - Borra el área del estado
- Escribe MQTT: OK en verde
- O MQTT: ERROR en rojo
Esto permite saber de un vistazo si la pantalla está recibiendo datos o no.
9) 📥 Recepción de datos MQTT (callback)
Función: callback()
Del topic nestdisk/cpu/stats se extraen, entre otros, estos valores del JSON:
"load""cpu_temp""freq"
Y los convierte a float o int.

10) 🔄 Reconexion automática MQTT
Función: reconnectMQTT()
Cada 5 segundos intenta reconectar si:
- No hay conexión
- El broker está disponible
- El WiFi está operativo
Si reconecta, vuelve a suscribirse al topic.
11) 🖼️ Actualización de valores en pantalla
Función: updateValues()
Redibuja solo cuando:
- El valor cambia
- O supera un umbral (ej. LOAD cambia ≥ 5%)
Esto mantiene la pantalla fluida y evita parpadeos.
12) 🔁 Bucle principal (loop)
El loop está limitado a 30 FPS (33 ms por frame). En cada iteración:
- Reconexion MQTT
- Procesamiento de mensajes
- Heartbeat
- Estado MQTT
- Actualización de valores
Es un ciclo muy eficiente para un ESP32‑S3.
Tras esta descripción general del funcionamiento del firmware, pasamos ahora a uno de los elementos más distintivos de la interfaz: el logo personalizado. Su generación no es trivial y nos ha servido para entender cómo preparar gráficos compatibles con las capacidades de Open Nextion y su motor LVGL.
122
Se nos había pasado incluir el pequeño vídeo que hemos hecho sobre CPU-MONITOR
Y también como no la «demo oficial» de Nextion … aunque es más bonita la nuestra ¿no?