Banco de Pruebas - Carvaa-7/Challenge1_IoT GitHub Wiki
Banco de Pruebas — Configuración Experimental, Resultados y Análisis
Este documento describe el experimento diseñado para validar rigurosamente el sistema, siguiendo la estructura exigida: calibración contra referencia conocida, emulación acelerada de condiciones críticas, validación de la lógica de fusión y umbrales, pruebas de notificación, pruebas de robustez y casos límite, y repetibilidad/desempeño. Todas las pruebas se realizaron sobre el modelo a escala de laboratorio que emula el comportamiento de un cuerpo de agua como el embalse de Tominé.
1. Calibración de sensores contra referencia conocida (ground truth)
HC-SR04 (nivel)
Referencia: regla física insertada en el tanque, midiendo la altura real de la columna de agua.
Procedimiento: con el tanque vacío se midió la distancia sensor→fondo (SENSOR_ALTURA_CM); con el tanque lleno al 80% se midió la distancia sensor→superficie y se calculó NIVEL_MAX_CM por diferencia.
Resultado:SENSOR_ALTURA_CM = 10.54 cm, NIVEL_MAX_CM = 5.44 cm.
Herramienta de calibración: sketch dedicado (05_calibracion_hcsr04.ino) que reporta 10 lecturas por muestra, promedio y desviación estándar, para descartar inestabilidad antes de fijar los valores.
HX711 + celda de carga (peso)
Referencia: báscula de precisión ("gramera") como ground truth.
Procedimiento: regresión lineal de mínimos cuadrados con múltiples pares (peso real, lectura cruda), mediante un sketch dedicado (04_calibracion_galga.ino) con comandos t (tara), <peso> (registrar punto), c (calcular regresión).
Primer intento (20-sep): 12 puntos, error promedio 73.8g, error máximo 148.4g, con saltos de signo en la lectura cruda — diagnosticado como torsión mecánica de la celda (montaje no perfectamente horizontal / extremo fijo no realmente inmóvil), no como ruido electrónico.
Corrección: se ajustó el montaje mecánico (nivelación, fijación del extremo fijo, centrado consistente del objeto).
Segundo intento (27-sep), tras corregir el montaje: 7 puntos (90g–402g).
Peso real (g)
Lectura cruda
Peso estimado (g)
Error (g)
90.0
56844
83.6
6.4
169.0
108747
165.4
3.6
233.0
149547
229.7
3.3
402.0
259349
402.8
0.8
157.0
105439
160.2
3.2
140.0
99054
150.1
10.1
353.0
227203
352.1
0.9
Factor de calibración final:634.3359 · Intercepto:3824.06 · Error promedio:4.04 g · Error máximo:10.13 g.
Hallazgo adicional del banco de pruebas: el peso real del tanque (modelo a escala) lleno resultó ser ~100g (no el valor inicialmente asumido de 1000g), y se identificó que la celda de carga es más susceptible a interferencia mecánica externa (presión accidental sobre el tanque) que el HC-SR04. Como resultado, se ajustó la lógica de fusión para priorizar el sensor de nivel (70/30 en condiciones normales, 100% nivel si hay discrepancia) — ver Variables Ambientales y Lógica de Fusión.
BME280 / BH1750
Verificación funcional mediante bus I2C scanner y comparación de valores contra referencia ambiental (termómetro/higrómetro de referencia, y prueba de oclusión de luz con la mano para confirmar respuesta del BH1750).
Presión atmosférica leída (~748-751 hPa) es consistente con la altitud de la sabana de Bogotá / zona del embalse de Tominé (~2600 msnm), validando la plausibilidad física de la lectura.
2. Emulación acelerada de condiciones reales
Condición emulada
Método
Resultado esperado
Vaciado del embalse (modelo a escala) — nivel crítico
Extracción manual de agua / manipulación del nivel
Escalamiento Normal→Preventivo→Alto→Crítico, LEDs y buzzer cambiando en cada umbral
Llenado del embalse (modelo a escala) — mejora de nivel
Adición controlada de agua al tanque
Escalamiento inverso Crítico→Alto→Preventivo→Normal, demostrando que la lógica responde en ambas direcciones
Calor y radiación
Fuente de calor + linterna sobre BME280/BH1750
Aumento del IEE; si IEE > 0.7 y hay riesgo base ≥25%, escalamiento +25 puntos ("ESCALADO")
Ventana corta de evapotranspiración
VENTANA_EVAP_MS reducido temporalmente (de 1h a ~2 min) para pruebas de banco
Cálculo de ET0 visible en /api/data y Monitor Serial sin esperar el ciclo real de producción (24h)
Discrepancia entre sensores
Fuerza externa manual sobre el tanque (alterando el peso sin alterar el nivel real)
El sistema detecta discrepancia_sensores = true y prioriza el nivel en vez de tomar el peor caso
3. Validación de la lógica de fusión y de los umbrales de alerta
Se verificó cada transición de estado (Normal↔Preventivo↔Alto↔Crítico) variando manualmente el nivel de agua, confirmando que el cambio de LEDs, patrón de buzzer y pantalla del LCD coincide con los umbrales definidos (25/50/75%).
Se verificó el escalamiento climático (IEE) de forma aislada, confirmando que no se dispara si el riesgo base es Normal (<25%), evitando falsos positivos por clima cuando el nivel aún es saludable.
Se verificó la regla de discrepancia forzando una diferencia >20 puntos entre riesgo_nivel y riesgo_peso.
4. Pruebas de notificación
Prueba
Procedimiento
Resultado
Latencia de alarma física
Cambio brusco de nivel → medir tiempo hasta cambio de LED/buzzer
≤2s (ciclo de fusión)
Actualización del tablero web
Cambio de estado → medir tiempo hasta reflejarse en /api/data
≤3s (polling del frontend)
Actualización del histórico
Verificar /api/historico tras >5 min de ejecución
Buffer circular de 60 muestras poblándose correctamente
Desactivación de alarma desde el tablero
POST /api/silenciar con alarma activa
Buzzer se silencia 10 min; LEDs continúan reflejando el estado real
5. Pruebas de robustez y casos límite
Caso
Procedimiento
Resultado
Valores fuera de rango
Sensor desconectado / lectura inválida del HC-SR04 (duracion == 0)
Se marca *_ok = false, expuesto en /api/data, evitando que una lectura inválida (-1) contamine el cálculo de nivel
Pérdida de WLAN
Apagar el router / alejar el ESP32
El sistema sigue operando localmente (sensores, LEDs, buzzer, LCD); el tablero web queda inaccesible pero no se congela el firmware
Reconexión de WLAN
Restaurar la señal
Reconexión automática en ≤10s, sin reiniciar el ESP32 (gestionarWiFi() no bloqueante)
Acceso no autorizado
Intentar acceder a /api/data sin credenciales
Solicitud de autenticación HTTP; sin credenciales válidas, no se expone ningún dato
Falla de subida de firmware por interferencia de pin
GPIO2 con periférico activo durante boot
Reubicación de la señal (HX711 SCK) a GPIO14, eliminando el conflicto
6. Repetibilidad, precisión y desempeño
Calibración de la celda de carga repetida en dos sesiones (20-sep y 27-sep), documentando la mejora de error tras corregir la causa raíz mecánica — evidenciando un proceso de calibración repetible y trazable, no un ajuste de una sola vez.
Consumo energético / autonomía estimada:(completar con medición de corriente promedio del sistema en operación normal, si se dispone de multímetro/medidor de consumo; estimar autonomía si se alimentara por batería).