11. Pruebas y resultados - diegogopa/Challenge-IOT GitHub Wiki
11. Pruebas y resultados
11.1 Resumen del banco de pruebas
| Banco | Objetivo | Estado |
|---|---|---|
| B1 | Calibración de nivel, T/HR, UV y presión | Completo |
| B2 | Emulación acelerada | Completo |
| B3 | Lógica de clasificación | Completo |
| B4 | Notificaciones | Completo |
| B5 | Robustez | Completo |
| B6 | Repetibilidad y energía | Repetibilidad completa; consumo estimado (no medido) |
11.2 Resultados B1 — Calibración
Nivel
Sensor HC-SR04, 10 lecturas por distancia (L1–L10). El nivel esperado va de 100 % (5 cm) a 0 % (20 cm).
| Distancia real (cm) | Promedio (cm) | Sesgo (cm) | σ (cm) | Error máx. (cm) | Nivel esperado (%) | Nivel medido (%) | Error nivel (pp) |
|---|---|---|---|---|---|---|---|
| 5 | 5.15 | +0.15 | 0.12 | 0.30 | 100.0 | 99.0 | −1.0 |
| 7.5 | 7.68 | +0.18 | 0.09 | 0.30 | 83.3 | 82.1 | −1.2 |
| 10 | 10.15 | +0.15 | 0.08 | 0.30 | 66.7 | 65.7 | −1.0 |
| 12.5 | 12.59 | +0.09 | 0.07 | 0.20 | 50.0 | 49.4 | −0.6 |
| 15 | 15.14 | +0.14 | 0.11 | 0.30 | 33.3 | 32.4 | −0.9 |
| 17.5 | 17.69 | +0.19 | 0.23 | 0.40 | 16.7 | 15.4 | −1.3 |
| 20 | 20.39 | +0.39 | 0.10 | 0.60 | 0.0 | 0.0 | 0.0 |
Error medio: 0.18 cm
Error máximo: 0.60 cm (a 20 cm)
Ajuste lineal: y = 0.9895x − 0.051 (distancia real = f(distancia medida))
R²: 0.9998
El sensor mide ligeramente de más en todo el rango (sesgo positivo de 0.09 a 0.39 cm), lo que se traduce en un error de nivel de entre 0 y 1.3 puntos porcentuales. La dispersión es baja (σ ≤ 0.23 cm).
Nota sobre el rango de nivel: esta caracterización del HC-SR04 se hizo entre 5 y 20 cm, y la columna "Nivel esperado" usa la geometría de esa prueba (5 cm = 100 %, 20 cm = 0 %). El firmware v3.2 entregado usa el modelo a escala de 4 cm = 100 % y 9 cm = 0 % (sección 8.3). El error en distancia (sesgo ≤ 0.39 cm) es válido para ambos casos, pero en un rango de 5 cm cada 0.1 cm equivale a 2 pp de nivel, por lo que el error en nivel con la geometría final es mayor que el de esta tabla.
Temperatura y humedad
Las pruebas se hicieron con el firmware sin calibración aplicada (constantes CAL_T, CAL_H y CAL_P en 1.0 y 0.0), por lo que los resultados corresponden a los sensores sin corregir y los ajustes lineales son propuestas de calibración, no correcciones activas.
Temperatura (DHT22 vs. higrómetro de referencia, resolución 0.1 °C):
| Condición | N | Prom. Ref (°C) | Sesgo (°C) | MAE (°C) | RMSE (°C) | Error máx. (°C) | σ DHT22 (°C) |
|---|---|---|---|---|---|---|---|
| Ambiente | 10 | 29.7 | −0.30 | 0.30 | 0.30 | 0.30 | 0.00 |
| Calentador | 11 | 31.9 | +0.11 | 0.11 | 0.12 | 0.20 | 0.12 |
| Nevera | 8 | 11.4 | −2.85 | 2.85 | 2.95 | 4.20 | 0.97 |
- Ajuste lineal (ambiente + calentador):
Ref = 0.840·DHT22 + 5.00, R² = 0.9994, RMSE tras calibrar = 0.028 °C. Con solo dos niveles de temperatura casi estacionarios, el ajuste es indicativo, no concluyente, y no se recomienda aplicarlo en el firmware sin más puntos. - Nevera: ambos sensores se introdujeron 20 min antes de medir y las lecturas aún evolucionaban (régimen transitorio, distinta masa térmica de cada sensor). Por eso su error no se usó para calibrar ni se considera representativo de la exactitud del DHT22.
Humedad relativa (DHT22 vs. higrómetro, 10 lecturas por condición):
| Condición | Prom. Ref (% HR) | Prom. DHT22 (% HR) | Sesgo (% HR) | σ DHT22 (% HR) | Error máx. (% HR) |
|---|---|---|---|---|---|
| Ambiente | 52.0 | 53.4 | +1.45 | 0.22 | 1.8 |
| Ambiente seco | 38.0 | 39.8 | +1.79 | 0.20 | 2.1 |
| Humidificado | 72.1 | 73.3 | +1.14 | 0.19 | 1.5 |
- Global (N = 30): sesgo = MAE =
+1.46 % HR. - Ajuste lineal:
Ref = 1.019·DHT22 − 2.51, R² = 0.9997. - Criterio esperado (|sesgo| ≤ 5 % HR y σ ≤ 1 % HR): cumplido en las tres condiciones. El DHT22 lee consistentemente entre 1 y 2 % HR por encima de la referencia, un sesgo corregible por software con las constantes
CAL_H_AyCAL_H_Bdel firmware (ajuste propuesto: a = 1.019, b = −2.51), que durante estas pruebas no estaban aplicadas.
UV
Sensor GUVA-S12SD. Referencia utilizada: sensibilidad nominal del sensor (≈ 0.1 V por índice UV; índice 11 ≈ 1.1 V) y un índice UV de referencia asignado a cada condición. No se contó con un radiómetro UV calibrado.
En el firmware, el índice UV se calcula como (V − 0.14) / 0.1 (offset UV_V_OFFSET = 0.14 V, ajustado con el sensor tapado), y una lectura de exactamente 0 mV se marca como falla del sensor. La columna "Índice equivalente" de la tabla usa la sensibilidad nominal V/0.1, sin offset.
| Condición | Voltaje mín (V) | Voltaje máx (V) | Índice UV de referencia | Índice equivalente (nominal, sin offset) |
|---|---|---|---|---|
| Habitación cerrada, sin luz solar | 0.00 | 0.00 | 0 | 0 |
| Luz solar por ventana (15:40) | 0.02 | 0.02 | 0 | ≈ 0.2 |
| Lámpara UV | 0.40 | 0.50 | 4.5 | 4.0 – 5.0 |
Interpretación: sin fuente UV el sensor entrega 0 V; con luz solar a través de vidrio entrega un valor mínimo (el vidrio filtra buena parte del UV-B), y con la lámpara el voltaje es coherente con el índice de referencia (4.5 ≈ 0.45 V). Son solo tres puntos, por lo que esto valida el orden de magnitud y la respuesta cualitativa, no una calibración fina.
Presión (verificación adicional)
BMP180 comparado con la presión de un celular (app Atmospheric Pressure Barometer, App Store), promedio de 10 lecturas por medición, en cuatro momentos del día:
| Momento | BMP180 (hPa) | Celular (hPa) | Error (hPa) |
|---|---|---|---|
| Medición 1 | 734 | 733 | +1 |
| Medición 2 | 735 | 734 | +1 |
| Medición 3 | 733 | 732 | +1 |
| Medición 4 | 734 | 733 | +1 |
Sesgo medio: +1 hPa, constante en las cuatro mediciones. La referencia (celular) no es instrumentación calibrada. Calibración propuesta: CAL_P_A = 1.0, CAL_P_B = −1.0. Como la lógica de fusión usa la variación de presión (ΔP en 3 h) y no su valor absoluto, un sesgo constante no afecta la regla de caída de presión.
11.3 Resultados B2 — Emulación acelerada
Tiempos de detección medidos por escenario (5 repeticiones; la fuga tuvo 4 detecciones). Los tiempos esperados provienen del diseño del firmware (ciclos de ≈ 2.4 s). Las pruebas se hicieron en modo acelerado: la ventana de cálculo de la tasa de fuga (VENTANA_TASA_MS) y la de presión (PRES_VENTANA_MS) se redujeron a 60 s. En operación normal son de 5 min y 3 h respectivamente, por lo que la detección de fuga real tardaría varios minutos.
| Escenario | Detecciones | Tiempo medio (s) | Rango (s) | Tiempo esperado máx. (s) | Estado detectado |
|---|---|---|---|---|---|
| Desborde | 5/5 | 7.4 | 6.4 – 8.9 | ≈ 9 (≤ 4 ciclos) | DESBORDE |
| Sequía | 5/5 | 5.9 | 5.1 – 6.9 | ≈ 7 (≤ 3 ciclos) | SEQUIA |
| Riesgo de sequía (evap ≥ 70 %) | 5/5 | 6.5 | 5.9 – 7.2 | ≈ 7 (≤ 3 ciclos) | SEQUIA |
| Fuga | 4/5 | 90.0 | 68 – 117 | ≈ 62 a 122 (1–2 ventanas de 60 s) | FUGA |
| Falla de sensor | 5/5 | 12.3 | 12.0 – 12.6 | ≈ 12 (5 ciclos) | ERROR_SENSOR |
Interpretación:
Se detectaron los cinco tipos de escenario. Desborde, sequía, riesgo de sequía y falla de sensor se detectaron en todas las repeticiones (20/20) y en tiempos acordes con el diseño; solo dos valores superaron levemente el tiempo nominal (7.2 s en riesgo de sequía y 12.6 s en falla de sensor, por menos de 1 s). La fuga se detectó en 4 de 5 repeticiones, dentro de la ventana esperada de 62 a 122 s; la repetición 4 no fue detectada (ver B3). Esta es la detección más lenta por diseño, pues requiere acumular ventanas de tiempo (60 s en esta configuración acelerada).
11.4 Resultados B3 — Clasificación
Cinco repeticiones por escenario (30 pruebas en total):
| Escenario | Rep. | Evento real | Alarma | Estado obtenido | Clase | Tiempo (s) |
|---|---|---|---|---|---|---|
| Normal | 1, 2, 4, 5 | 0 | 0 | OK | VN | — |
| Normal | 3 | 0 | 1 | FUGA | FP | 64 |
| Desborde | 1–5 | 1 | 1 | DESBORDE | VP | 6.4 – 8.9 |
| Sequía | 1–5 | 1 | 1 | SEQUIA | VP | 5.1 – 6.9 |
| Riesgo de sequía | 1–5 | 1 | 1 | SEQUIA | VP | 5.9 – 7.2 |
| Fuga | 1, 2, 3, 5 | 1 | 1 | FUGA | VP | 68, 101, 74, 117 |
| Fuga | 4 | 1 | 0 | OK | FN | — |
| Falla de sensor | 1–5 | 1 | 1 | ERROR_SENSOR | VP | 12.0 – 12.6 |
Indicadores:
- Verdaderos positivos: 24
- Falsos positivos: 1 (alarma de FUGA en condición normal, rep. 3)
- Falsos negativos: 1 (fuga no detectada, rep. 4)
- Verdaderos negativos: 4
- Precisión de detección = VP/(VP+FP) = 24/25 = 0.96
- Sensibilidad = VP/(VP+FN) = 24/25 = 0.96
- Exactitud = (VP+VN)/total = 28/30 = 0.93
- Tiempo medio de detección: 23.4 s (influido por los escenarios de fuga)
- Evidencia de histéresis:
| Estado | Nivel de entrada (%) | Nivel de salida (%) | Esperado entrada | Esperado salida |
|---|---|---|---|---|
| DESBORDE | 95.6 | 89.8 | 95 | 90 |
| SEQUIA | 19.7 | 25.4 | 20 | 25 |
La entrada y la salida de cada estado ocurren en niveles distintos, con una banda de ≈ 6 pp, y coinciden con los umbrales de diseño, lo que evita oscilaciones alrededor del umbral.
Los dos errores se concentran en la clase FUGA, la que depende de parámetros temporales (en estas pruebas, ventanas aceleradas de 60 s). Una posible causa es que, con una ventana tan corta, variaciones mínimas de nivel se amplifican al expresarse en %/h (0.1 % en 60 s equivale a 6 %/h); esto es una hipótesis que no se verificó. Refuerza la necesidad de validar experimentalmente esos parámetros, también con la ventana real de 5 min (ver 11.8).
Falla de sensor: ante una falla del ultrasónico (sin eco) el sistema pasa al estado ERROR_SENSOR, muestra nivel ERR, activa la alarma sonora y publica la alerta en el tablero web. Se detectó en 5/5 repeticiones, en ≈ 12 s (5 ciclos). Es el único sensor que cambia el estado del sistema a ERROR_SENSOR. Las fallas de DHT22, BMP180, GUVA y OLED no cambian el estado: activan una bandera de falla que se muestra como ERR en la OLED, como aviso en el tablero web y como registro en el historial de eventos, con chirrido del buzzer (ver B5).
11.5 Resultados B4 — Notificaciones
Latencias desde el evento hasta la notificación, 10 repeticiones:
| Canal | Media (s) | σ (s) | Máximo (s) |
|---|---|---|---|
| Buzzer | 7.03 | 1.12 | 8.6 |
| OLED | 6.88 | 1.11 | 8.4 |
| Tablero web | 9.06 | 1.47 | 11.6 |
| Silenciar | 0.89 | 0.31 | 1.4 |
El buzzer, la OLED y el tablero se actualizaron correctamente en las 10 repeticiones. El buzzer y la OLED responden prácticamente al mismo tiempo (≈ 7 s); el tablero web tarda en promedio ≈ 2 s más, lo esperable por el intervalo de consulta de la página. La opción de silenciar funcionó en todas las repeticiones, con una respuesta inferior a 1.5 s.
11.6 Resultados B5 — Robustez
| Prueba | Cómo se realizó | Respuesta observada | Tiempo (s) | Tiempo esperado (s) |
|---|---|---|---|---|
| DHT22 desconectado (DATA) | Se retiró el cable DATA | Aviso DHT22, ERR en OLED y tablero, chirrido | 7.2 | ≈ 7 (3 ciclos) |
| BMP180 desconectado | Se desconectó SDA | Aviso BMP180, P:ERR; reinicializó al reconectar | 7 | ≈ 7 (3 ciclos) |
| GUVA desconectado | Se retiró el cable S | Sin aviso: la lectura quedó en un valor bajo, no detectable | — | ≈ 7 / no garantizado |
| Ultrasónico sin eco | Se apuntó a un espacio abierto | ERROR_SENSOR, nivel ERR, alarma sonora | 12.3 | ≈ 12 (5 ciclos) |
| OLED desconectada | Se desconectó SDA/SCL | Pantalla apagada; aviso FALLA_OLED en tablero | 3 | ≤ 3 |
| Pérdida de WiFi | Router apagado 30 s | OLED con x, evento FALLA_WIFI, reconectó solo | — | < 10 tras volver el router |
| Valor fuera de rango | Lectura forzada | Descartada por el firmware | 7.1 | ≈ 7 |
| Acceso desde otra red | Datos móviles | Timeout | sin respuesta | inmediato |
| Clave incorrecta | Clave errónea | Solicitó autenticación (HTTP 401) | 0.5 | inmediato |
| Reinicio del ESP32 | Se reinició el equipo | Histórico y eventos borrados; inició en OK | — | Se borran (RAM) |
Manejo de fallas de sensor: cuando un sensor falla, el sistema activa una alerta y la notifica en el tablero web, donde aparece el aviso "Sensor desconectado o sin lectura" con el sensor afectado y un evento FALLA_x en el registro. Hay dos niveles:
- Ultrasónico (nivel): cambia el estado del sistema a ERROR_SENSOR (5 ciclos sin eco, ≈ 12 s), con nivel
ERRy alarma sonora continua. - DHT22, BMP180, GUVA y OLED: no cambian el estado; activan una bandera de falla (3 ciclos malos, ≈ 7 s; la OLED se revisa cada 3 s) con
ERRen pantalla y tablero y chirrido corto cada 3 s. La falla de la OLED se ve solo en el tablero, porque la pantalla está apagada.
Los sensores se reinicializan solos al recuperar el dato (BMP180 y OLED por I2C; el DHT22 se recupera al volver a leer). Una lectura fuera de rango se descarta y solo se cuenta como falla si se repite. La pérdida de WiFi no activa el buzzer: se muestra una x en la OLED, se registra como evento FALLA_WIFI (visible en el tablero solo al reconectar, porque con el WiFi caído no hay acceso web) y se reintenta la conexión cada 10 s.
Excepción: la desconexión del GUVA-S12SD no se detectó, porque el sensor es analógico y su lectura queda en un valor bajo indistinguible de una medición real de 0 UV. El firmware solo avisa si hay saturación, ruido alto o 0 mV exacto, por lo que esta falla no está garantizada.
11.7 Resultados B6 — Repetibilidad y energía
Repetibilidad (desviación estándar sobre lecturas repetidas en condiciones constantes):
| Variable | σ observada |
|---|---|
| Distancia (HC-SR04), 7 puntos × 10 lecturas | 0.07 – 0.23 cm |
| Temperatura DHT22 (ambiente) | 0.00 °C |
| Temperatura DHT22 (calentador) | 0.12 °C |
| Humedad DHT22 | 0.19 – 0.22 % HR |
| Tiempos de detección de desborde / sequía | 6.4 – 8.9 s / 5.1 – 6.9 s |
| Tiempos de detección de falla de sensor | 12.0 – 12.6 s |
Los tiempos de detección de los escenarios de ciclos fijos son repetibles. Los de fuga varían más (68 a 117 s) por depender de la alineación con las ventanas de tiempo (60 s en la configuración acelerada de las pruebas).
Consumo de energía:
| Modo | Corriente estimada (mA) | Rango de referencia (hojas de datos) |
|---|---|---|
| Reposo (WiFi conectado, sin alarma) | 168 | ≈ 160–260 mA |
| Alarma sonando (buzzer) | 186 | reposo + ≈ 10–30 mA |
| Arranque (pico) | 430 | picos de ≈ 400–500 mA al iniciar WiFi |
Estos valores no son una medición directa con instrumentación adecuada: se estimaron a partir de la documentación de los componentes y deben tomarse como referencia aproximada. Todos caen dentro de los rangos esperados, pero para dimensionar la fuente o una batería conviene medirlos con un multímetro o medidor de corriente en serie.
11.8 Observaciones y limitaciones
Los resultados deben interpretarse considerando las limitaciones ya identificadas en el proyecto:
- El HC-SR04 puede verse afectado por espuma, superficies irregulares, inclinación o turbulencia.
- El GUVA-S12SD requiere calibración para obtener una estimación ambiental más precisa.
- El DHT22 tiene limitaciones de actualización y precisión frente a instrumentación profesional.
- El histórico se almacena en RAM y se pierde al reiniciar el ESP32. Además es corto: 60 muestras (≈ 1 h) y los últimos 10 eventos.
- Los parámetros de fuga y riesgo deben validarse experimentalmente, incluida la ventana real de 5 min, ya que las pruebas se hicieron con ventanas aceleradas de 60 s.
- El BMP180 mide presión absoluta (sin compensar a nivel del mar) y el firmware solo usa su tendencia (caída ≥ 2 hPa en 3 h) como indicador complementario de riesgo; no se estima la presión atmosférica a nivel del mar ni se hace pronóstico.
- Las constantes de calibración de temperatura, humedad y presión no están aplicadas en el firmware.
11.9 Conclusión de las pruebas
Funciones demostradas experimentalmente:
- Medición de nivel con error medio de 0.18 cm (máx. 0.60 cm) y R² = 0.9998.
- Medición de humedad con sesgo de +1.46 % HR, dentro del criterio de ±5 %, y de temperatura con sesgo de −0.30 a +0.11 °C en condiciones estacionarias.
- Detección de desborde, sequía, riesgo de sequía y falla de sensor en 20/20 repeticiones y en tiempos acordes con el diseño; histéresis verificada en los umbrales de 95/90 % y 20/25 %.
- Alerta ante falla de sensor con aviso local y notificación en el tablero web: estado ERROR_SENSOR para el ultrasónico y bandera de falla (con
ERR, chirrido y evento) para DHT22, BMP180 y OLED. - Notificaciones por buzzer, OLED y tablero (7.0, 6.9 y 9.1 s en promedio) y silenciado en menos de 1.5 s.
- Control de acceso (Timeout desde otra red, 401 con clave incorrecta) y recuperación automática ante pérdida de WiFi.
Limitaciones y trabajo futuro:
- La detección de fuga tuvo 1 falso positivo y 1 falso negativo en 5 repeticiones por escenario; los parámetros de ventana y umbral deben ajustarse con más pruebas, y repetirse con la ventana real de 5 min (se probó con 60 s).
- La falla del GUVA-S12SD no es detectable de forma confiable.
- La calibración de UV se apoya en tres puntos y sin radiómetro de referencia; la de presión, en un celular.
- La respuesta del DHT22 a temperaturas bajas (nevera) no pudo evaluarse por el régimen transitorio y requiere una prueba con equilibrio térmico.
- El consumo de corriente es estimado, no medido.
- El histórico y los eventos se pierden al reiniciar el ESP32.
- La precisión de detección (0.96) proviene de una muestra pequeña (30 pruebas) y debe confirmarse con más repeticiones.