tutoriales.com

Monitoreo de Calidad del Aire con Sensores de Bajo Costo: Tu Propia Estación Meteorológica Ambiental 🌬️🔬

Este tutorial te guiará paso a paso en la creación de una estación de monitoreo de calidad del aire utilizando componentes económicos. Podrás medir partículas PM2.5 y PM10, temperatura, humedad y gases, y contribuir a la ciencia ciudadana ambiental.

Intermedio20 min de lectura5 views
Reportar error

Introducción al Monitoreo Ambiental Ciudadano 🌍

La calidad del aire es un factor crucial para nuestra salud y el bienestar del planeta. Las grandes estaciones de monitoreo son precisas, pero a menudo escasas y costosas. Aquí es donde entra en juego el monitoreo ciudadano: la capacidad de cualquier persona para recopilar datos ambientales con herramientas accesibles y contribuir a una visión más detallada de nuestro entorno.

Este tutorial te mostrará cómo construir tu propia estación de monitoreo de calidad del aire utilizando sensores de bajo costo. No solo aprenderás sobre electrónica y programación básica, sino que también obtendrás datos valiosos sobre el aire que respiras.

¿Por qué construir tu propia estación? 🤔

  • Conciencia local: Entender la calidad del aire en tu entorno directo, no solo en la estación más cercana.
  • Educación: Aprender sobre ciencia, electrónica, programación y medio ambiente de una manera práctica.
  • Contribución: Tus datos pueden ser valiosos para investigadores y comunidades locales.
  • Coste-efectividad: Una alternativa mucho más económica a las soluciones comerciales.
💡 Consejo: No necesitas ser un experto en electrónica o programación para empezar. Este tutorial está diseñado para principiantes entusiastas.

Componentes Necesarios para tu Estación 🛠️

Para construir nuestra estación, necesitaremos una serie de componentes electrónicos. Aquí tienes una lista detallada:

Lista de Materiales Esenciales

ComponenteDescripciónCantidadCosto Estimado (USD)Enlace de Compra (Ejemplo)
---------------
ESP32 DevKitCMicrocontrolador con Wi-Fi y Bluetooth18-15Amazon
Sensor PM2.5/PM10 (SDS011)Mide partículas suspendidas115-25AliExpress
---------------
Sensor DHT22 (Temp/Hum)Mide temperatura y humedad15-10Adafruit
Sensor MQ-135Mide varios gases (CO2, NH3, benceno, etc.)13-7SparkFun
---------------
ProtoboardPara conectar componentes sin soldar12-5Elegoo
Cables Jumper M-M y M-FPara interconexiones1 set5-10Freenove
---------------
Cable Micro USBPara alimentar el ESP32 y programar12-5Anker
Resistencias (10k Ohm)Para pull-up en algunos sensores1-2<1Componentes
---------------
Caja Protectora (opcional)Impermeable, para exterior110-30Hammond
📌 Nota: Los precios son aproximados y pueden variar. Se recomienda buscar proveedores locales o en línea para encontrar las mejores ofertas.

Herramientas Requeridas 🧰

  • Computadora: Para programar el ESP32.
  • Software Arduino IDE: Entorno de desarrollo para cargar el código.
  • Soldador y estaño (opcional): Si deseas hacer conexiones permanentes y robustas en lugar de usar protoboard.
  • Pelacables (opcional): Si usas cables de alambre sólido.

Preparación del Entorno de Desarrollo 💻

Antes de empezar a conectar los componentes, necesitamos configurar nuestro software.

1. Instalación del Arduino IDE

Descarga e instala la última versión del Arduino IDE desde la página oficial: arduino.cc/downloads.

2. Configuración del ESP32 en Arduino IDE

Para poder programar el ESP32, debemos añadir su soporte al Arduino IDE.

  1. Abre el Arduino IDE.
  2. Ve a Archivo > Preferencias.
  3. En el campo URL de Gestor de Tarjetas Adicionales, añade la siguiente URL (si ya tienes otras, sepáralas con una coma): https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  4. Haz clic en OK.
  5. Ve a Herramientas > Placa > Gestor de Tarjetas....
  6. Busca esp32 e instala la placa esp32 by Espressif Systems.
  7. Una vez instalado, ve a Herramientas > Placa y selecciona tu modelo de ESP32, por ejemplo, ESP32 Dev Module o ESP32 DevKitC. Si no estás seguro, ESP32 Dev Module suele funcionar bien.

3. Instalación de Librerías Necesarias 📚

Nuestros sensores requieren librerías específicas para comunicarse con el ESP32.

  1. Librería para SDS011 (Sensor de Partículas):
    • Ve a Programa > Incluir Librería > Gestionar Librerías....
    • Busca SDS011 e instala la librería SDS011 de Chris Micro o similar.
  2. Librería para DHT22 (Temperatura y Humedad):
    • Busca DHT sensor library e instala la librería DHT sensor library de Adafruit.
    • Busca también Adafruit Unified Sensor e instálala (es una dependencia de la anterior).
  3. Librería para MQ-135 (Sensor de Gas):
    • Busca MQ135 e instala la librería MQ135 de Georg K .
🔥 Importante: Asegúrate de seleccionar la placa ESP32 correcta y el puerto COM asignado a tu ESP32 cuando lo conectes al ordenador. Esto lo puedes verificar en `Herramientas` > `Puerto`.

Conexión de Componentes: El Cerebro de tu Estación 🧠

Ahora vamos a conectar los sensores al ESP32. Sigue estos esquemas de conexión cuidadosamente.

Diagrama de Conexión General

VCC (5V) GND ESP32 WROOM GND GPIO 16 (RX2) GPIO 17 (TX2) GPIO 4 VIN (5V) GPIO 34 (ADC) GPIO 35 SDS011 TX RX VCC GND DHT22 VCC DATA GND MQ-135 VCC GND DO AO Líneas de Alimentación Comunes

1. Conexión del Sensor SDS011 (Partículas PM2.5/PM10) ✨

Este sensor se comunica a través de UART (Serial).

Pin SDS011Pin ESP32DescripciónNotas
------------
VCC3.3V/5VAlimentaciónEl SDS011 puede usar 5V. El ESP32 puede alimentarse con 5V a través de su puerto USB y tiene un pin de 5V.
GNDGNDTierraSiempre conecta las tierras.
------------
TXD16 (RX2)TransmisiónTX del SDS011 va al RX del ESP32 (GPIO16).
RXD17 (TX2)RecepciónRX del SDS011 va al TX del ESP32 (GPIO17).
⚠️ Advertencia: Algunos ESP32 usan GPIO16 y GPIO17 como pines RX2/TX2. Asegúrate de verificar la documentación de tu placa específica si hay conflictos.

2. Conexión del Sensor DHT22 (Temperatura y Humedad) 🌡️💧

Este sensor utiliza un protocolo de un solo cable.

Pin DHT22Pin ESP32DescripciónNotas
------------
VCC3.3VAlimentaciónConectar al pin 3.3V del ESP32.
DATAD22DatosConectar a un pin digital disponible (GPIO22).
------------
GNDGNDTierraSiempre conecta las tierras.
💡 Consejo: A menudo se recomienda una resistencia *pull-up* de 10k Ohm entre el pin DATA y VCC para una comunicación más estable.

3. Conexión del Sensor MQ-135 (Gases) 💨

Este sensor tiene una salida analógica (AO) y una digital (DO). Usaremos la analógica para una lectura más precisa.

Pin MQ-135Pin ESP32DescripciónNotas
------------
VCC3.3VAlimentaciónConectar al pin 3.3V del ESP32.
GNDGNDTierraSiempre conecta las tierras.
------------
AOVP (ADC1_CH0)Salida AnalógicaConectar al pin de entrada analógica del ESP32 (GPIO36).
DO(Opcional)Salida DigitalSe puede conectar a un pin digital si solo se necesita un umbral. No usaremos esta en este tutorial.
📌 Nota: Los pines analógicos del ESP32 pueden variar. GPIO36 (VP) es un buen punto de partida para ADC1.

Programación del ESP32: El Código de tu Estación 📄

Ahora que los componentes están conectados, es hora de darles vida con código. Abriremos el Arduino IDE y escribiremos nuestro programa.

Estructura General del Código

Nuestro código tendrá las siguientes partes:

  1. Inclusión de Librerías: Para los sensores y el Wi-Fi.
  2. Definición de Pines: Asignación de los pines GPIO para cada sensor.
  3. Configuración de Wi-Fi: Para conectar el ESP32 a internet y enviar datos.
  4. Calibración de Sensores (MQ-135): Ajustes iniciales para el sensor de gas.
  5. Lectura de Datos: Funciones para leer cada sensor.
  6. Envío de Datos: Enviar los datos a un servidor (por ejemplo, ThingSpeak).
#include <WiFi.h>
#include <HardwareSerial.h>
#include <DHT.h>
#include "SDS011.h"
#include "MQ135.h"

// -----------------------------------------------------------------
//                         Configuración Wi-Fi
// -----------------------------------------------------------------
const char* ssid = "TU_NOMBRE_WIFI";
const char* password = "TU_CONTRASEÑA_WIFI";

// -----------------------------------------------------------------
//                       Configuración ThingSpeak
// -----------------------------------------------------------------
// Regístrate en thingspeak.com, crea un nuevo canal y copia estos valores
String apiKey = "TU_API_KEY_THINGSPEAK"; // API Key de escritura de tu canal
const char* server = "api.thingspeak.com";
WiFiClient client;

// -----------------------------------------------------------------
//                       Definición de Pines
// -----------------------------------------------------------------
// SDS011 (Sensor de Partículas)
// Usamos Serial2 en ESP32 (GPIO16 RX, GPIO17 TX)
SDS011 sds(Serial2);
const int SDS_RX_PIN = 16; // Pin RX del ESP32 (para TX del SDS011)
const int SDS_TX_PIN = 17; // Pin TX del ESP32 (para RX del SDS011)

// DHT22 (Temperatura y Humedad)
#define DHTPIN 22        // Pin digital donde conectamos el DHT22
#define DHTTYPE DHT22    // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);

// MQ-135 (Sensor de Gases)
const int MQ135_PIN = 36; // Pin analógico VP (GPIO36) en ESP32
MQ135 gasSensor = MQ135(MQ135_PIN); 

// Intervalo de lectura y envío de datos (en milisegundos)
unsigned long lastSendTime = 0;
const long sendInterval = 60000; // Enviar datos cada 60 segundos (1 minuto)

// -----------------------------------------------------------------
//                            Setup
// -----------------------------------------------------------------
void setup() {
  Serial.begin(115200);
  
  // Inicializar SDS011
  Serial2.begin(9600, SERIAL_8N1, SDS_RX_PIN, SDS_TX_PIN);
  sds.begin(SDS_RX_PIN, SDS_TX_PIN);
  Serial.println("SDS011 inicializado.");
  
  // Inicializar DHT22
  dht.begin();
  Serial.println("DHT22 inicializado.");

  // Calibrar MQ-135 (opcional, mejora la precisión)
  // Se recomienda ventilar el sensor durante 24-48h antes de calibrar.
  // Opcionalmente, puedes usar un valor de RO (Resistance at zero point) pre-calibrado
  // gasSensor.setR0(valor_de_calibracion_Ro);
  Serial.println("Calibrando MQ-135...");
  gasSensor.calibrate(); // Esto tarda un poco y necesita aire fresco
  Serial.print("MQ-135 R0: ");
  Serial.println(gasSensor.getR0());

  // Conectar a Wi-Fi
  Serial.print("Conectando a ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi conectado.");
  Serial.print("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

// -----------------------------------------------------------------
//                            Loop
// -----------------------------------------------------------------
void loop() {
  if (millis() - lastSendTime > sendInterval) {
    lastSendTime = millis();

    // 1. Leer Sensor DHT22
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Error al leer del sensor DHT22!");
      h = -999.0; // Valor para indicar error en ThingSpeak
      t = -999.0;
    }

    // 2. Leer Sensor SDS011
    float p25 = 0.0;
    float p10 = 0.0;
    int error = sds.read(&p25, &p10);

    if (!error) {
      Serial.print("PM2.5: "); Serial.print(p25); Serial.println(" ug/m3");
      Serial.print("PM10: "); Serial.print(p10); Serial.println(" ug/m3");
    } else {
      Serial.println("Error al leer del sensor SDS011.");
      p25 = -999.0;
      p10 = -999.0;
    }

    // 3. Leer Sensor MQ-135
    float resistance = gasSensor.getResistance();
    float ppmCO2 = gasSensor.getPPM(); // ppm de CO2 equivalente
    float r0 = gasSensor.getR0();

    Serial.print("Resistencia MQ-135: "); Serial.println(resistance);
    Serial.print("CO2eq (ppm): "); Serial.println(ppmCO2);
    Serial.print("MQ-135 R0: "); Serial.println(r0);

    // 4. Enviar datos a ThingSpeak
    if (WiFi.status() == WL_CONNECTED) {
      if (client.connect(server, 80)) {
        String postStr = apiKey;
        postStr += "&field1=";
        postStr += String(t);
        postStr += "&field2=";
        postStr += String(h);
        postStr += "&field3=";
        postStr += String(p25);
        postStr += "&field4=";
        postStr += String(p10);
        postStr += "&field5=";
        postStr += String(ppmCO2);
        postStr += "\r\n\r\n";

        client.print("POST /update HTTP/1.1\n");
        client.print("Host: ");
        client.print(server);
        client.print("\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);

        Serial.println("Datos enviados a ThingSpeak.");
        client.stop();
      } else {
        Serial.println("Fallo la conexión a ThingSpeak.");
      }
    } else {
      Serial.println("WiFi no conectado. Reintentando...");
      WiFi.begin(ssid, password);
    }
  }
}
⚠️ Advertencia: Reemplaza `TU_NOMBRE_WIFI`, `TU_CONTRASEÑA_WIFI` y `TU_API_KEY_THINGSPEAK` con tus credenciales reales.

Calibración del Sensor MQ-135 💨

El sensor MQ-135 es sensible a una amplia gama de gases y requiere calibración para obtener lecturas más significativas. La calibración implica determinar el valor R0 (resistencia del sensor en aire limpio).

  1. Exposición a aire limpio: Deja el sensor MQ-135 funcionando en un entorno con aire lo más limpio posible (idealmente exterior, lejos de fuentes de contaminación) durante 24-48 horas. Esto permite que el sensor se estabilice.
  2. Método calibrate(): La librería MQ135 tiene un método calibrate() que se encarga de calcular R0. Llama a gasSensor.calibrate() en setup(), como se muestra en el código.
  3. Ajuste manual: Si conoces un valor R0 de una calibración anterior o de un ambiente controlado, puedes usar gasSensor.setR0(valor_de_R0) para fijarlo. Esto evita la necesidad de calibrar cada vez.
💡 Consejo: Los valores de PPM para el MQ-135 son de CO2 equivalente y pueden no ser exactos para un gas específico sin una calibración y caracterización más profunda. Sirve como un indicador de la presencia de gases contaminantes.

Visualización de Datos con ThingSpeak 📊

ThingSpeak es una plataforma IoT gratuita que nos permite enviar, almacenar y visualizar datos de nuestros sensores en tiempo real.

1. Crear una Cuenta en ThingSpeak

Ve a thingspeak.com y regístrate para una cuenta gratuita.

2. Crear un Nuevo Canal

  1. Haz clic en New Channel.
  2. Name: Dale un nombre a tu estación (ej. "Mi Estación Ambiental Casa").
  3. Description: Una breve descripción.
  4. Fields: Define 5 campos para tus datos:
    • Field 1: Temperatura (°C)
    • Field 2: Humedad (%)
    • Field 3: PM2.5 (µg/m³)
    • Field 4: PM10 (µg/m³)
    • Field 5: CO2eq (ppm)
  5. Puedes añadir unidades a cada campo.
  6. Haz clic en Save Channel.

3. Obtener tu API Key de Escritura

Después de crear el canal, ve a la pestaña API Keys. Copia el Write API Key. Este es el que debes pegar en tu código Arduino.

4. Ver tus Datos en Tiempo Real

Una vez que hayas subido el código a tu ESP32 y se esté ejecutando, comenzará a enviar datos a ThingSpeak. Puedes ver los gráficos generados automáticamente en la pestaña Private View de tu canal.

Dashboard ThingSpeak - Monitor Ambiental Canal ID: 884210 Temperatura (°C) 10:00 11:00 12:00 25° Humedad (%) 10:00 11:00 12:00 60% Partículas PM2.5 (µg/m³) 10:00 11:00 12:00 15 Partículas PM10 (µg/m³) 10:00 11:00 12:00 30 CO2 Equivalente (ppm) 10:00 11:00 12:00 450
🔥 Importante: ThingSpeak ofrece la posibilidad de crear tus propios widgets y paneles de control, así como realizar análisis de datos y enviar alertas. ¡Explora sus funcionalidades!

Consideraciones para la Instalación Exterior 🏡

Si planeas instalar tu estación al aire libre para obtener datos más representativos, hay algunas consideraciones importantes.

1. Protección contra el Clima 🌧️☀️

  • Caja Estanca: Es fundamental encerrar todos los componentes electrónicos en una caja estanca (IP65 o superior) para protegerlos de la lluvia, la humedad, el polvo y la luz solar directa. Las cajas de derivación eléctrica son una buena opción.
  • Ventilación: Aunque necesites protección, los sensores (especialmente el SDS011 y el MQ-135) necesitan aire para funcionar. Puedes hacer pequeños orificios cubiertos con mallas finas o usar un diseño que permita el flujo de aire sin exponer directamente los componentes a los elementos.
  • Ubicación: Coloca la estación en un lugar sombreado, lejos de fuentes directas de calor o frío, y a una altura adecuada (1.5 - 3 metros del suelo) para evitar la interferencia de fuentes terrestres y obtener una muestra de aire representativa.

2. Alimentación Eléctrica ⚡

  • Adaptador de Corriente: Puedes usar un adaptador de corriente USB de 5V/1A o 5V/2A para alimentar el ESP32, asegurándote de que el cable USB esté protegido de la humedad.
  • Energía Solar (Opcional): Para una solución completamente autónoma, puedes integrar un pequeño panel solar, un controlador de carga y una batería de litio. Esto añade complejidad, pero libera la estación de la necesidad de una toma de corriente.

3. Estabilidad y Fiabilidad 📈

  • Conexiones Soldadas: Para una instalación permanente, se recomienda soldar todas las conexiones en lugar de usar una protoboard, que puede ser inestable con el tiempo y la exposición.
  • Watchdog Timer: Implementar un Watchdog Timer en el código del ESP32 puede reiniciar automáticamente el microcontrolador si se bloquea, mejorando la fiabilidad de la estación.
  • Actualizaciones OTA: Considera implementar actualizaciones Over-The-Air (OTA) para poder actualizar el firmware del ESP32 sin tener que desconectarlo y conectarlo físicamente a la computadora.

Mantenimiento y Mejora de tu Estación ✅

Una vez que tu estación esté funcionando, un buen mantenimiento y la búsqueda de mejoras garantizarán su longevidad y la precisión de los datos.

Mantenimiento Regular

  • Limpieza de Sensores: El sensor SDS011 puede acumular polvo en su ventilador y entrada. Límpialo suavemente cada pocos meses. El DHT22 también puede requerir una limpieza ocasional si se ensucia.
  • Revisión de Conexiones: Verifica periódicamente que todos los cables estén bien conectados y que no haya corrosión, especialmente en entornos húmedos.
  • Calibración (MQ-135): Aunque el MQ-135 tiene una calibración inicial, su precisión puede beneficiarse de una re-calibración o ajuste de R0 si notas que sus lecturas se desvían con el tiempo o si el entorno cambia significativamente.

Posibles Mejoras y Expansión 🚀

  • Almacenamiento Local de Datos: Además de ThingSpeak, puedes almacenar los datos en una tarjeta SD usando un módulo lector de tarjetas para el ESP32. Esto es útil si pierdes la conexión Wi-Fi temporalmente.
  • Otros Sensores:
    • Sensor de Ruido (Módulo MAX9814): Mide los niveles de decibelios para un monitoreo de contaminación acústica.
    • Sensor UV (Módulo VEML6075): Mide la radiación ultravioleta.
    • Sensor de Lluvia: Para detectar precipitaciones.
  • Servidor Local/Base de Datos: Para usuarios más avanzados, puedes configurar un servidor local (Raspberry Pi) o una base de datos para recopilar y analizar tus datos de manera más personalizada.
  • Paneles Solares: Como se mencionó, una fuente de alimentación solar te dará más libertad en la ubicación.
  • Comunicación LoRa/LoRaWAN: Si tu estación está en un área sin Wi-Fi, puedes usar módulos LoRa para enviar datos a distancias más largas, conectándote a una pasarela LoRaWAN.
¿Por qué es importante la precisión del sensor MQ-135?El MQ-135 es un sensor de gas semiconductor de óxido metálico (MOS) de bajo costo. Su precisión varía y es más un indicador de *presencia* de gases contaminantes (CO2, NH3, benceno, alcohol, monóxido de carbono, etc.) que un medidor exacto de un gas específico. Para obtener mediciones precisas de CO2, por ejemplo, se necesitaría un sensor NDIR (Non-Dispersive Infrared) como el MH-Z19, que son más caros. La calibración en aire limpio y el uso de la fórmula de sensibilidad para el gas de interés pueden mejorar su utilidad como un índice de calidad del aire general.
Proyecto completado: ¡90% listo para mejorar tu mundo!

Al construir y mantener tu propia estación de monitoreo ambiental, te conviertes en un científico ciudadano activo, contribuyendo a una mayor comprensión de nuestro entorno y fomentando la acción informada. ¡Felicidades por tu iniciativa! ✨

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!