Sistema de Menú
El módulo principal implementa una navegación por pantallas controlada por 2 botones físicos y complementada con control remoto RC5.
Navegación
stateDiagram-v2
[*] --> SPLASH
SPLASH --> MENU: 2s timeout
MENU --> WIFI_INIT: Botón sup. (opción 0)
MENU --> TIMER: Botón inf. (opción 1)
WIFI_INIT --> WIFI_INFO: web_setup() OK
WIFI_INIT --> WIFI_FAIL: web_setup() falla
WIFI_INFO --> MENU: Botón inf.
WIFI_FAIL --> MENU: Botón inf.
TIMER --> MENU: Botón inf.
TIMER --> TIMER: Botón sup. (reset cronómetro)
Opciones del Menú
| Opción | Pantalla destino | Descripción |
|---|---|---|
| Iniciar WiFi | WIFI_INIT |
Conecta a la red WiFi y monta el servidor web |
| Cronómetro | TIMER |
Entra al cronómetro (detección IR + display) |
La selección se navega con un side selector en el borde de la pantalla.
El side selector soporta 2 elementos (código hardcodeado para count == 2
en screen.cpp:212).
Botones
| Botón | Pin | Acción por pantalla |
|---|---|---|
| Superior | 6 (BTN_TOP_PIN) |
MENU: opción 0 → WiFi; TIMER: reset cronómetro |
| Inferior | 5 (BTN_BOTTOM_PIN) |
MENU: opción 1 → Cronómetro; otros: volver a MENU |
Ambos botones usan INPUT_PULLDOWN. La lectura se hace con digitalRead()
y debounce vía espera activa (while (digitalRead(...))).
⚠️ Advertencia: Los bucles de debounce no tienen timeout. Si un botón se queda atascado, el sistema se congela. Ver MN-01.
Sistema de Interacción
| Componente | Función |
|---|---|
| Botón superior | Navegar opción 0 / resetear cronómetro |
| Botón inferior | Navegar opción 1 / volver al menú |
| LED Power | Indicador de batería (verde normal, rojo parpadeante baja) |
| LED Connection | Indicador de estado WiFi (azul conectado, rojo fallo) |
| Control remoto RC5 | STOP y RESET del cronómetro a distancia |
Control Remoto RC5
El mando IR puede enviar dos comandos que la máquina de estados procesa como eventos pendientes:
| Comando RC5 | Dirección | Evento | Efecto |
|---|---|---|---|
| Program | 0x0B |
EVENT_RESET |
Reinicia el cronómetro |
| Computer | 0x07 |
EVENT_STOP |
Para el cronómetro |
Los eventos se almacenan en pending_event y se procesan en la siguiente
iteración de loop() vía control_manage_pending_event().
Pantalla del Cronómetro
La pantalla SCREEN_TIMER muestra:
| Elemento | Descripción |
|---|---|
| Tiempo actual | Formato MM:SS.mmm (o MMM:SS:MM si > 99 min) |
| Última vuelta | Tiempo de la vuelta anterior |
| Mejor vuelta | Marcada como BEST si coincide con la última |
| Historial | 5 últimas vueltas con número y delta |
| Botón sup. | Label "RESET" |
| Botón inf. | Label "MENU" |
Formato de Tiempos
| Rango | Formato | Ejemplo |
|---|---|---|
| < 100 minutos | MM:SS.mmm |
01:23.456 |
| ≥ 100 minutos | MMM:SS:MM |
123:45:67 |
Deltas de Vuelta
Los deltas se muestran respecto a la mejor vuelta, con signo y precisión de 3 decimales:
| Signo | Color | Significado |
|---|---|---|
− (negativo) |
Verde | Más rápido que la mejor vuelta |
+ (positivo) |
Ámbar | Más lento que la mejor vuelta |
Documento generado el 2026-06-29. Ver también Arquitectura Software, Debug, Comunicaciones.