04. Componentes y seleccion tecnologica - diegogopa/Challenge-IOT GitHub Wiki
4. Componentes y selección tecnológica
4.1 Componentes utilizados
| Componente | Cantidad | Función | Interfaz |
|---|---|---|---|
| ESP32 DevKit V1 | 1 | Procesamiento, servidor web y WiFi | — |
| HC-SR04 | 1 | Distancia a la superficie del agua (nivel) | Digital (TRIG/ECHO) |
| DHT22 | 1 | Temperatura y humedad relativa | 1 hilo |
| GUVA-S12SD | 1 | Radiación UV | Analógica (ADC) |
| BMP180 (módulo GY-68) | 1 | Presión atmosférica absoluta | I2C, dirección 0x77 |
| OLED SH1106 1.3" 128×64 | 1 | Visualización local | I2C, dirección 0x3C |
| Buzzer activo | 1 | Alarma sonora | Digital |
| Resistencia 1 kΩ | 1 | Comprada, no implementada (divisor del ECHO) | — |
| Resistencia 2 kΩ | 1 | Comprada, no implementada (divisor del ECHO) | — |
| Fuente de alimentación | 1 | Alimentación del ESP32 y los sensores | USB / 5 V |
| Cables y elementos de conexión | 1 juego | Conexión de los componentes dentro de la caja | — |
| Caja de protección de riel hermética con tapa transparente (Halux, 14 × 18 × 8 cm) | 1 | Alojamiento y protección de la electrónica, modificada con Dremel para exponer el fotodiodo del GUVA-S12SD y el DHT22 (sección 17) | — |
El WiFi es el radio integrado del ESP32; no se agregó ningún módulo de comunicación adicional.
4.2 ESP32
Se seleccionó el ESP32 DevKit V1 frente a Arduino Uno o Raspberry Pi (esta última prohibida por el enunciado) porque:
- Integra WiFi 802.11 b/g/n, necesario para alojar el tablero de control sin hardware adicional.
- Su procesador de doble núcleo con FreeRTOS permite ejecutar la medición en una tarea independiente del hilo principal, como exige el reto.
- Tiene ADC de 12 bits (GUVA-S12SD), I2C configurable en cualquier pin (OLED + BMP180) y GPIO suficientes para los cinco periféricos.
- Su costo y consumo son mucho menores que los de una Raspberry Pi.
Sus funciones son: leer los sensores, filtrar las mediciones, calcular nivel, tendencia, tasa de cambio, índice UV, evaporación y tendencia de presión, ejecutar la lógica de fusión, vigilar fallas, controlar OLED y buzzer y servir el tablero web.
4.3 HC-SR04
Se seleccionó el HC-SR04 frente a sensores de nivel resistivos, capacitivos o flotadores porque mide sin contacto con el agua (sin corrosión ni contaminación del agua almacenada), es de bajo costo y su lógica de disparo/eco es simple de integrar (pulseIn).
El HC-SR04 [5] mide el tiempo de vuelo de un pulso ultrasónico. El firmware compensa la velocidad del sonido con la temperatura del DHT22:
v (cm/µs) = 0.03313 + 0.0000606 · T(°C)
La distancia se convierte en porcentaje de nivel y se usa también para calcular la tendencia y la tasa de cambio. Al alimentarse a 5 V, su salida ECHO se conecta directamente al GPIO 18 del ESP32 (3.3 V); la adaptación mediante divisor queda como trabajo futuro (sección 14).
4.4 DHT22
Se seleccionó el DHT22 frente al DHT11 por su mayor rango y precisión (±0.5 °C, ±2–5 % HR frente a ±2 °C, ±5 % HR) y por su integración sencilla (un solo pin de datos). Se descartó el BME280 (temperatura, humedad y presión en un chip) por disponibilidad en el momento del diseño; la presión se resolvió con un BMP180 independiente (sección 4.6).
El DHT22 [6] mide temperatura y humedad relativa, que alimentan el índice de evaporación y la compensación de la velocidad del sonido del HC-SR04.
4.5 GUVA-S12SD
Se seleccionó el GUVA-S12SD frente al ML8511 por su disponibilidad y por entregar una salida analógica directa proporcional a la radiación UV, leída con el ADC del ESP32.
El GUVA-S12SD [7] entrega aproximadamente 0.1 V por unidad de índice UV. El firmware promedia 16 lecturas, resta un offset de oscuridad y clasifica el resultado en BAJA, MEDIA, ALTA, MUY ALTA o EXTREMA según las categorías de la OMS [8].
4.6 BMP180
Se incorporó el BMP180 [9] para cumplir con la medición de presión atmosférica que exige la pregunta guía. Se eligió porque:
- Es de bajo costo y estaba disponible para el equipo.
- Usa I2C, por lo que comparte el bus de la OLED sin ocupar pines adicionales (OLED en 0x3C, BMP180 en 0x77).
- Su resolución (0.01 hPa) y exactitud relativa (≈ ±0.12 hPa) son suficientes para detectar la tendencia que usa la lógica de fusión: una caída de ≥ 2 hPa en 3 horas, indicio de cambio de tiempo.
- Existe una librería madura (Adafruit BMP085, compatible con BMP180).
El BMP180 mide presión absoluta; no se convierte a presión a nivel del mar porque la lógica solo usa su variación.
4.7 OLED
Se seleccionó una OLED I2C SH1106 frente a un LCD 16×2 porque permite gráficos e iconos (barra de nivel, tendencia, severidad UV, encabezado invertido de alarma) y solo requiere dos pines (SDA/SCL), compartidos con el BMP180.
La pantalla muestra: nivel (barra animada y %), temperatura, humedad, índice UV, tendencia del nivel, índice de evaporación, alternadamente categoría UV y presión (con ! si la presión está cayendo), barras de severidad UV, estado de WiFi (W/x), indicador de funcionamiento y, cuando corresponde, el encabezado de alarma (!! SEQUIA !!, !! DESBORDE !!, !! FUGA !!, ! SENSOR !) o de falla (FALLA: DHT BMP UV). Un sensor fallido se muestra como ERR.
4.8 Buzzer
Se seleccionó un buzzer activo frente a uno pasivo porque suena con una señal digital HIGH/LOW, sin generar PWM.
Tiene dos patrones:
- Alarma de estado (SEQUIA, DESBORDE, FUGA, ERROR_SENSOR): pitido intermitente, 400 ms encendido / 400 ms apagado.
- Falla de componente (DHT22, BMP180, GUVA-S12SD, ultrasónico u OLED): chirrido corto de 120 ms cada 3 s.
Ambos se pueden silenciar desde el tablero; un nuevo estado de alarma o una nueva falla vuelven a activarlo.
4.9 Conectividad WiFi y servidor web
Se utilizó el radio WiFi integrado del ESP32 porque el alcance requerido es la WLAN de la zona, sin costo adicional. La librería ESPAsyncWebServer atiende las peticiones de forma asíncrona, sin bloquear la tarea de sensado ni el ciclo principal. Se descartó MQTT por restricción del reto y porque requeriría un broker externo.