Comunicaciones
IRTimer usa cuatro canales de comunicación: ESP-NOW entre módulos,
WiFi + HTTP/SSE para el overlay web, RC5 IR para control remoto,
y Serial UART para debug.
Interfaces de Comunicación
| Interfaz |
Periférico |
Velocidad |
Propósito |
| ESP-NOW |
WiFi 2.4 GHz |
— |
Comandos START/STOP (aux → principal) |
| WiFi STA+AP |
WiFi 2.4 GHz |
— |
Servidor web + overlay OBS |
| HTTP + SSE |
TCP/80 |
— |
Página web + eventos en tiempo real |
| RC5 IR |
TSSP77038TR |
~1.8 kbps |
Control remoto infrarrojo |
| Serial UART |
USB-CDC |
115200 baud |
Debug y logging |
ESP-NOW
Protocolo peer-to-peer de Espressif para comunicación entre módulos sin
necesidad de WiFi tradicional.
Parámetros
| Característica |
Detalle |
| Dirección |
Aux → Principal (unidireccional) |
| Canal |
Detectado por escaneo WiFi del SSID |
| Payload |
1 byte |
| Retransmisión |
client_start() reintenta; client_finish() no |
| Campo |
Bytes |
Descripción |
| DATA |
1 |
Código de comando |
Comandos
| Valor |
Nombre |
Significado |
27 |
START |
Inicio de cronómetro / nueva vuelta |
42 |
STOP |
Parada del cronómetro |
Flujo de Comunicación
sequenceDiagram
participant Wall as Pared Aux
participant Main as Módulo Principal
participant Web as Web Overlay
Note over Wall: Robot detectado
Wall->>Main: ESP-NOW: 27 (START)
Main-->>Web: SSE: start
Note over Main: Cronómetro en marcha
Note over Wall: Robot cruza meta
Wall->>Main: ESP-NOW: 42 (STOP)
Main-->>Web: SSE: stop
Note over Main: Cronómetro parado
Note over Wall: Nueva vuelta
Wall->>Main: ESP-NOW: 27 (LAP)
Main-->>Web: SSE: lap
Callback de Recepción
web.cpp:286-309
static void data_receive(const uint8_t *mac_addr,
const uint8_t *incomingData, int len) {
if (incomingData[0] == 27) {
stopwatch_disable_sensor_check();
stopwatch_lap();
} else if (incomingData[0] == 42) {
stopwatch_disable_sensor_check();
stopwatch_lap();
stopwatch_stop();
}
}
Al recibir cualquier comando, el sensor IR del módulo principal se deshabilita
(no hay función de re-habilitación). Ver SS-01.
WiFi + Server-Sent Events
El módulo principal opera en modo STA+AP y sirve un overlay web con
actualizaciones en tiempo real vía Server-Sent Events (SSE).
Parámetros WiFi
| Característica |
Detalle |
| Modo |
STA + AP |
| SSID |
Variable de entorno IRTIMER_WIFI_SSID |
| Contraseña |
Variable de entorno IRTIMER_WIFI_PASS |
| Puerto |
80 |
| Servidor |
ESPAsyncWebServer |
Eventos SSE
| Evento |
Disparador |
Datos |
start |
web_start() |
time_ms |
stop |
web_stop() |
— |
lap |
web_lap() |
lap_time_ms, lap_number, last_lap_ms, best_lap_ms |
reset |
web_reset() |
— |
Rate Limiting
| Función |
Rate Limit |
web_start() |
1 evento/segundo |
web_lap() |
1 evento/segundo |
web_reset() |
1 evento/segundo |
web_stop() |
Sin rate limit |
⚠️ Advertencia: web_stop() tiene el rate limit comentado. Ver
CM-02.
Overlay Web
sequenceDiagram
participant Browser as Navegador (OBS)
participant ESP32 as ESP32-C3
participant Stopwatch as Cronómetro
Browser->>ESP32: GET / (index.html)
ESP32-->>Browser: HTML + CSS + JS
Browser->>ESP32: GET /events (SSE)
Note over Browser,ESP32: Conexión SSE abierta
Stopwatch->>ESP32: start/lap/stop/reset
ESP32-->>Browser: event: start/lap/stop/reset
Note over Browser: UI se actualiza en tiempo real
La página web usa Bootstrap 5.3.3 con tema oscuro, diseñada como overlay
para OBS Studio. El cronómetro se actualiza cada 8 ms en el cliente vía
setInterval(__handleTimer, 8).
RC5 IR
Protocolo infrarrojo RC5 decodificado por software en una ISR.
Hardware
| Característica |
Detalle |
| Receptor |
TSSP77038TR (38 kHz) |
| Pin |
GPIO 7 (IR_PIN) |
| Interrupción |
CHANGE (ambos flancos) |
| Frecuencia portadora |
38 kHz (demodulada por el receptor) |
| Bit rate |
~1.8 kHz (889 µs por half-bit) |
Timing
| Parámetro |
Valor |
| Short mínimo |
444 µs |
| Short máximo |
1333 µs |
| Long mínimo |
1334 µs |
| Long máximo |
2222 µs |
| Campo |
Bits |
Descripción |
| Start S1 |
1 |
Bit de inicio (siempre 1) |
| Start S2 |
1 |
Bit de inicio (siempre 1) |
| Toggle |
1 |
Cambia en cada pulsación |
| Address |
5 |
Dirección del dispositivo |
| Command |
6 |
Comando |
Direcciones
| Dirección |
Nombre |
Uso en IRTimer |
0x0B (11) |
Program |
RESET del cronómetro |
0x07 (7) |
Computer |
STOP del cronómetro |
Decodificador
rc5.cpp:1-147
El decodificador implementa la máquina de estados del algoritmo Clearwater
con 4 estados y una tabla de transición trans[] = {0x01, 0x91, 0x9B, 0xFB}.
Los comandos decodificados se convierten en RC5_EVENTS que la máquina de
estados de pantalla procesa en control_manage_pending_event().
Serial UART
| Parámetro |
Valor |
| Interfaz |
USB-CDC |
| Baudrate |
115200 |
| Formato |
8N1 |
| Uso |
Serial.print / Serial.println para debug |
Documento generado el 2026-06-29. Ver también Arquitectura Software, Sensores, Debug.