Controlador para aire lavado basado en un termostato comercial, adaptado para la placa JC3248W535 (ESP32-S3 + panel AXS15231B QSPI 320x480) usando ESP-IDF + LVGL 9.5.
- UI de termostato en pantalla completa (320x480), fondo oscuro con acento azul.
- Sistema: switch ON/OFF con indicador ACTIVO/APAGADO y barra de nivel de agua.
- Bomba: copo de nieve que alterna BOMBA ACTIVA (azul) / DETENIDA (gris). Solo se activa cuando el sistema está encendido.
- Velocidad: botones A (ALTO) / B (BAJA), disponibles con el sistema activo.
- Demo: temperatura, nivel de agua, estado y reloj simulados (timers LVGL).
- Touch capacitivo AXS15231B por I2C con las coordenadas mapeadas 1:1.
Placa JC3248W535:
| Señal | Pin |
|---|---|
| LCD CS | 45 |
| LCD SCK | 47 |
| LCD D0–D3 | 21, 48, 40, 39 |
| Backlight | 1 |
| Touch SDA | 4 |
| Touch SCL | 8 |
| Touch RST | 12 |
| Touch INT | 11 |
- Display: AXS15231B, QSPI, 320x480, RGB565 (big-endian en el cable).
- Touch: AXS15231B, I2C addr
0x3Ba 400 kHz. - Flash 16 MB QIO @ 80 MHz, PSRAM 8 MB OPI @ 80 MHz.
- ESP-IDF v5.4+ (probado con un clon reciente en
~/esp/esp-idf). - Python 3 y Git.
source ~/esp/esp-idf/export.sh
idf.py set-target esp32s3
idf.py build
idf.py flashMonitorear:
idf.py monitorNota: si
idf.py monitorfalla con "requires standard input TTY", usa pyserial directo:python3 -c "import serial,time; s=serial.Serial('/dev/ttyACM0',115200)".
Gestionadas por idf.py (ver main/idf_component.yml):
espressif/esp_lvgl_port >= 2.0.0lvgl/lvgl >= 9.1.0
main/
main.c UI, driver de display/touch, timers
snow.c Imágenes del copo de nieve (96x96 ARGB8888) generadas desde los PNG
fa_solid.c Iconos Font Awesome Solid
idf_component.yml
CMakeLists.txt
partitions.csv Partición factory (app 4 MB)
sdkconfig.defaults
Los PNG originales del copo (copo-de-nieve-Azul.png, copo-de-nieve-Gris.png)
se convierten a datos de píxeles ARGB8888 de 96x96 para main/snow.c
(recorte del contenido + resize Lanczos + centrado).
- El protocolo QSPI del AXS15231B replica el demo de Arduino_GFX: opcodes
0x02(cmd) /0x32(RAMWRC), y el flush siempre escribe la ventana completa con CASET + RASET + RAMWR antes del burst. - El read del touch requiere write con STOP + read separado (un repeated-start devuelve ceros).
ORIENTATION_TEST=1dibuja un patrón rojo/verde para verificar la orientación del panel (idf.py build -DORIENTATION_TEST=1).