Dashboard web profesional para control remoto de LEDs con efectos PWM mediante MQTT
Soporta N dispositivos ESP32 identificados por MAC
┌──────────────┐ ┌────────────────┐ ┌──────────────┐
│ XIAO ESP32 │◄──── MQTT:1883 ──────► │ Mosquitto │◄── WebSocket:9001 ──► │ Dashboard │
│ MicroPython │ d/{MAC}/led/cmd ... │ (Docker) │ nginx proxy /mqtt │ (browser) │
└──────────────┘ └────────────────┘ └──────────────┘
×N │
docker-compose
┌─────┴─────┐
│ nginx │ :80 → Dashboard + WS proxy
└───────────┘
Cada dispositivo se identifica por su MAC address (AA-BB-CC-DD-EE-FF). El dashboard descubre dispositivos automáticamente via suscripciones wildcard (d/+/...).
|
|
|
|
|
|
Descarga la imagen binaria lista para flashear desde GitHub Releases:
# Flashear XIAO ESP32S3 (flash completa de 8 MB)
python -m esptool --chip esp32s3 --port COM3 write_flash 0x0 XIAO_ESP32S3_Compilado.binNota: Después de flashear, aún necesitas crear
config.pycon tus credenciales WiFi y MQTT (ver sección Setup → Firmware).
Comandos esenciales para trabajar con placas ESP32.
# Detectar chip y MAC
python -m esptool chip_id
# Info completa (flash size, crystal, features)
python -m esptool flash_id# Borrar toda la memoria flash (recomendado antes de flashear MicroPython)
python -m esptool --chip esp32s3 --port COM3 erase_flash
# ESP32 clásico (WROOM/WROVER)
python -m esptool --chip esp32 --port COM3 erase_flash# ESP32-S3 (XIAO, 8 MB flash)
python -m esptool --chip esp32s3 --port COM3 write_flash 0x0 firmware.bin
# ESP32 clásico (WROOM, 4 MB flash)
python -m esptool --chip esp32 --port COM3 write_flash -z 0x1000 firmware.bin
# ESP32-C3
python -m esptool --chip esp32c3 --port COM3 write_flash 0x0 firmware.binTip: La dirección de inicio varía por chip:
0x0para S3/C3,0x1000para ESP32 clásico.
# Respaldar flash completa ESP32-S3 (8 MB)
python -m esptool --chip esp32s3 --port COM3 read_flash 0 0x800000 backup_s3.bin
# Respaldar flash ESP32 clásico (4 MB)
python -m esptool --chip esp32 --port COM3 read_flash 0 0x400000 backup_esp32.bin| Chip | Flash | Hex size | Dirección de inicio |
|---|---|---|---|
| ESP32 (WROOM) | 4 MB | 0x400000 |
0x1000 |
| ESP32-S2 | 4 MB | 0x400000 |
0x0 |
| ESP32-S3 (XIAO) | 8 MB | 0x800000 |
0x0 |
| ESP32-C3 | 4 MB | 0x400000 |
0x0 |
firmware/
├── boot.py # Boot temprano + FW_VERSION
├── main.py # WiFi, MQTT, LED, telemetría
├── config.example.py # Template (copiar a config.py)
└── lib/
├── config_store.py # Config runtime + persistencia JSON
├── boot_log.py # Boot counter + crash log (NVS)
├── morse.py # Morse no-bloqueante (ITU timing)
└── webserver.py # HTTP server no-bloqueante
web/
└── index.html # Dashboard (HTML+CSS+JS, single-file)
mosquitto/config/ # Configuración del broker
nginx/ # Reverse proxy + WebSocket
docker-compose.yml # Mosquitto + Nginx
| Componente | Detalle |
|---|---|
| Placa | Seeed Studio XIAO ESP32S3 |
| LED | GPIO 21 (activo bajo) |
| PWM | 1000 Hz, 10-bit (0–1023) |
docker compose up -dLevanta:
- Mosquitto en puertos
1883(MQTT) y9001(WebSocket) - Nginx en puerto
80sirviendo dashboard + proxy WebSocket
Accede al dashboard en http://localhost.
- Instala MicroPython en la XIAO ESP32S3
- Copia
config.example.py→config.pyy edita credenciales - Sube los archivos:
mpremote cp firmware/boot.py :boot.py
mpremote cp firmware/main.py :main.py
mpremote cp firmware/config.py :config.py
mpremote mkdir :lib
mpremote cp firmware/lib/config_store.py :lib/config_store.py
mpremote cp firmware/lib/boot_log.py :lib/boot_log.py
mpremote cp firmware/lib/morse.py :lib/morse.py
mpremote cp firmware/lib/webserver.py :lib/webserver.py- (Opcional) Servir dashboard desde el ESP32:
mpremote mkdir :web
mpremote cp web/index.html :web/index.htmlPrefijo: d/{MAC}/ donde MAC = AA-BB-CC-DD-EE-FF
| Tópico | Dirección | Descripción |
|---|---|---|
d/{MAC}/led/cmd |
Dashboard → Device | Comandos de control |
d/{MAC}/led/status |
Device → Dashboard | Estado JSON (retained) |
d/{MAC}/device/telemetry |
Device → Dashboard | Telemetría periódica |
d/{MAC}/device/online |
Device → Dashboard | LWT online/offline (retained) |
d/{MAC}/config/set |
Dashboard → Device | Enviar nueva configuración |
d/{MAC}/config/current |
Device → Dashboard | Config actual (retained) |
d/{MAC}/config/ack |
Device → Dashboard | ACK de config |
d/{MAC}/wifi/scan |
Dashboard → Device | Solicitar escaneo WiFi |
d/{MAC}/wifi/scan_results |
Device → Dashboard | Resultados del escaneo |
d/{MAC}/wifi/forget |
Dashboard → Device | Borrar config.json y reiniciar |
Publicar en d/{MAC}/led/cmd:
| Comando | Descripción |
|---|---|
on |
Enciende el LED |
off |
Apaga el LED |
toggle |
Alterna on/off |
breathe |
Respiración cíclica |
blink |
Parpadeo (1 Hz) |
strobe |
Parpadeo rápido (10 Hz) |
sos |
Patrón SOS en morse |
fade_in |
Encendido gradual |
fade_out |
Apagado gradual |
brightness:0..100 |
Ajustar brillo |
morse:TEXTO |
Transmitir en morse |