📡 Construye Un Monitor De Calidad Del Aire Con ESP32 Y ThingSpeak
by duirobotics in Circuits > Arduino
28 Views, 1 Favorites, 0 Comments
📡 Construye Un Monitor De Calidad Del Aire Con ESP32 Y ThingSpeak

Este proyecto permite medir la calidad del aire utilizando un ESP32, sensores MQ-135, MQ-9 y DHT11, una pantalla OLED para visualizar los datos y ThingSpeak para el monitoreo remoto.
✅ Mide CO₂, CO, temperatura y humedad
✅ Envía datos a la nube con ThingSpeak
✅ Visualización en pantalla OLED
✅ Fácil implementación con Arduino IDE
📺 Mira el video tutorial aquí: https://youtu.be/iAMZQ1Qq0s4
Supplies
️ Materiales Necesarios
Hardware:
✔ ESP32 con WiFi
✔ Sensor MQ-135 (CO₂)
✔ Sensor MQ-9 (CO)
✔ Sensor DHT11 (temperatura y humedad)
✔ Pantalla OLED 128x64
✔ Protoboard y cables
️ Software:
Arduino IDE
Librerías: DHT, Adafruit GFX, Adafruit SSD1306, ThingSpeak
Plataforma ThingSpeak para visualización en la nube
🔌 Paso 1: Configuración De ThingSpeak

1️⃣ Crea una cuenta en https://thingspeak.com/
2️⃣ Crea un canal nuevo con estos campos:
- Campo 1: CO₂ (ppm)
- Campo 2: Humedad (%)
- Campo 3: Temperatura (°C)
- Campo 4: CO (ppm)
- 3️⃣ Guarda la API Key para integrarla en el código.
🔌 Paso 2: Conectar Los Componentes
📍 Conexiones:
ComponenteESP32
MQ-135 (CO₂)
A0 (GPIO 34)
MQ-9 (CO)
A1 (GPIO 35)
DHT11
D19
Pantalla OLED
I2C (SDA → GPIO 21, SCL → GPIO 22)
📌 IMPORTANTE: Usa una fuente de alimentación externa si los sensores consumen mucha energía.
👉 Puedes instalarlas desde Arduino IDE en Gestor de Librerías.
📜 Paso 3: Código En Arduino IDE
1️⃣ Instala las librerías necesarias en Arduino IDE:
🔹 DHT sensor library
🔹 Adafruit GFX Library
🔹 Adafruit SSD1306
🔹 ThingSpeak
2️⃣ Copia el código y sube al ESP32:
#include <DHT.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <ThingSpeak.h>
// Configuración WiFi y ThingSpeak
#define WIFI_SSID "TU_SSID"
#define WIFI_PASSWORD "TU_PASSWORD"
const char* server = "api.thingspeak.com";
String apiKey = "TU_API_KEY";
// Configuración pantalla OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Sensores
const int a = 34; // MQ-135 CO₂
const int b = 35; // MQ-9 CO
const int c = 19; // DHT11
DHT sensorDHT(c, DHT11);
int mq135, mq9;
WiFiClient client;
void setup() {
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Error OLED");
while (true);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.print(" MONITOR AIRE");
display.display();
// Conectar a WiFi
Serial.println("Conectando a WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(" Conectado!");
ThingSpeak.begin(client);
}
void loop() {
// Leer sensores
mq135 = analogRead(a);
mq9 = analogRead(b);
int temp = sensorDHT.readTemperature();
int hum = sensorDHT.readHumidity();
if (isnan(temp) || isnan(hum)) {
Serial.println("Error DHT11");
temp = 0; hum = 0;
}
// Conversión MQ-135 (CO₂) a ppm
float ppm_co2 = calcularPPM(mq135, -0.3679, 0.815, 57);
// Conversión MQ-9 (CO) a ppm
float ppm_co = calcularPPM(mq9, -0.4101, 1.075, 19);
// Mostrar en Serial
Serial.print("CO2: "); Serial.println(ppm_co2);
Serial.print("CO: "); Serial.println(ppm_co);
Serial.print("Temp: "); Serial.println(temp);
Serial.print("Humedad: "); Serial.println(hum);
// Mostrar en pantalla OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print("CO2: "); display.print(ppm_co2, 2); display.print(" PPM");
display.setCursor(0, 12);
display.print("CO: "); display.print(ppm_co, 2); display.print(" PPM");
display.setCursor(0, 24);
display.print("Temp: "); display.print(temp); display.print(" C");
display.setCursor(0, 36);
display.print("Humedad: "); display.print(hum); display.print(" %");
display.display();
// Enviar datos a ThingSpeak
if (client.connect(server, 80)) {
ThingSpeak.setField(1, ppm_co2);
ThingSpeak.setField(2, hum);
ThingSpeak.setField(3, temp);
ThingSpeak.setField(4, ppm_co);
ThingSpeak.writeFields(2828420, apiKey);
client.stop();
}
delay(5000); // Esperar 5 segundos antes de la próxima lectura
}
// Función para calcular PPM
float calcularPPM(int lectura, float m, float b, float ro) {
float voltaje = (5.0 * lectura) / 4094;
float rs = 20 * ((5.0 - voltaje) / voltaje);
float ratio = rs / ro;
return pow(10, (log(ratio) - b) / m);
}
📲 Paso 4: Visualización En App Inventor






Para ver los datos en el celular:
1️⃣ Ir a MIT App Inventor
2️⃣ Crear una nueva app con etiquetas para CO₂, CO, temperatura y humedad
3️⃣ Conectar ThingSpeak a la app para mostrar datos en tiempo real
📌 Mira el video para detalles de la interfaz 🎥
🚀 Pruebas Y Mejoras
✔ Revisar valores en OLED y ThingSpeak
✔ Asegurar conexión WiFi estable
✔ Optimizar lecturas para mayor precisión
📌 Mejoras posibles:
✅ Notificaciones cuando los niveles de CO₂ sean altos
✅ Agregar más sensores como PM2.5
✅ Conectar a una base de datos para análisis a largo plazo
Downloads
🎥 Video Explicativo
📺 Mira el video completo:
👉 https://youtu.be/iAMZQ1Qq0s4
📢 Si te gustó este tutorial, compártelo y comenta! 🚀💨
#ESP32 #IoT #Arduino #CalidadDelAire #Electrónica #DIY #ThingSpeak #Makers