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_A y CAL_H_B del 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 ERR y 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 ERR en 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.