Cambio importante: el módulo de botones chino tiene los pads
cortocircuitados a KCOM (que está a GND), lo que fuerza GPIO 26
y 27 a LOW constantemente y dispara acciones sin tocarlos.
Solución temporal: solo GPIO 25 funciona como botón.
Multi-pulsación para 3 acciones:
- 1 tap = DONE
- 2 taps = NEXT (re-poll)
- 3 taps = SNOOZE 5 min
- mantener 1s+ = sleep/wake pantalla
Cuando llegue la placa nueva con 3 pulsadores mecánicos de 6mm,
se restaura la lógica de 3 botones en GPIO 25/26/27.
- Botones en GPIO 25 (PLAY=DONE), 26 (V+=NEXT), 27 (V-=SNOOZE)
- KCOM del módulo a GND, lógica invertida (HIGH reposo, LOW al pulsar)
- INPUT_PULLUP, detección por flanco descendente con debounce 200ms
- GPIO 25 ya no es vibrador (ahora es botón DONE), vibrador desactivado
- OLED con feedback toast al pulsar (1.2s sin pisar)
- Toast 'Nueva!' al recibir tarea nueva del polling
- Quitado código de test ADC y de matriz resistiva
Fixes pantalla:
- GPIO 14 ya no es botón (era strapping pin, causaba glitches y reset)
- Botones solo en 25/26/27 que no son strapping pins
- Reescritura desde cero con arquitectura modular (Config, UI, Vib, Task, Api, Portal, Wifi)
- NVS en lugar de SPIFFS para persistencia
- WiFi: máquina de estados BOOT→CONNECTING→CONNECTED/FAILED→PORTAL
- OLED: 5 frames nombrados (boot, connecting, idle, task, portal)
- API: cliente HTTP reutilizable con lectura completa del body
- Portal: AP + DNS + WebServer, /test restaura correctamente web/dns
- Cmd serie: B0/B1/B2 simula botones, S estado, P pines, A ADC, C calibrar
- Vibrador: patrón 2-buzz al recibir tarea nueva
WiFi default: PHARMACO/arnoldgym2010 (BatKuevaUp sin internet)