//Medición de la calidad del aire
//Everth A Marin
//Telemetria
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// WIFI
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String apiKey = "98IQLNLPZKE79N0A";
// LCD 20x4
LiquidCrystal_I2C lcd(0x27, 20, 4);
// DHT22 SENSOR DE TEMPERATURA Y HUMEDAD
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// SENSORES(SIMULADOS CON POTENCIOMETROS)
#define MQ7_PIN 34//SENSOR DE MONOXIDO DE CARBONO
#define MQ135_PIN 35//SENSOR DE DIOXIDO DE CARBONO
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
dht.begin();
lcd.setCursor(0,0);
lcd.print("Conectando WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.clear();
lcd.print("WiFi OK");
delay(2000);
}
void loop() {
// LECTURAS
float temperatura = dht.readTemperature();//LECTURA SENSOR DE TEMPERATURA
float humedad = dht.readHumidity();//LECTURA HUMEDAD
int mq7 = analogRead(MQ7_PIN);//LECTURA SENSOR DE MONOXIDO DE CARBONO
int mq135 = analogRead(MQ135_PIN);//LECTURA SENSOR DIOXIDO DE CARBONO
float co_ppm = map(mq7, 0, 4095, 0, 100);//SET DE POTENCIOMETRO SIMULADOR DE SENSOR DE CO
float co2_ppm = map(mq135, 0, 4095, 400, 2000);//SET DE POTENCIOMETRO SIMULADOR SENSOR DE CO2
if (isnan(temperatura) || isnan(humedad)) {
Serial.println("Error DHT");
return;
}
// EVALUACION DEL ESTADO DEL AIRE
String estadoGeneral;
String estadoCO;
String estadoCO2;
int estadoNum = 0;
//SE ESTABLECEN RANGOS TIPICOS DE SEGURIDAD
if (co_ppm < 30) estadoCO = "Seguro";
else if (co_ppm < 70) estadoCO = "Precaucion";
else estadoCO = "Peligro";
if (co2_ppm < 800) estadoCO2 = "Bueno";
else if (co2_ppm < 1200) estadoCO2 = "Moderado";
else estadoCO2 = "Malo";
if (estadoCO == "Peligro" || estadoCO2 == "Malo") {
estadoGeneral = "ALERTA";
estadoNum = 2;
} else if (estadoCO == "Precaucion" || estadoCO2 == "Moderado") {
estadoGeneral = "CUIDADO";
estadoNum = 1;
} else {
estadoGeneral = "AIRE OK";
estadoNum = 0;
}
// IMPRESION DATOS SENSORES EN PUERTO SERIAL
Serial.println("LECTURA DE SENSORES");
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" °C");
Serial.print("Humedad: ");
Serial.print(humedad);
Serial.println(" %");
Serial.print("CO (MQ7): ");
Serial.print(co_ppm);
Serial.println(" ppm");
Serial.print("CO2 (MQ135): ");
Serial.print(co2_ppm);
Serial.println(" ppm");
// ENVIO DATOS ATHINGSPEAK
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "http://api.thingspeak.com/update?api_key=" + apiKey;
url += "&field1=" + String(temperatura,1);
url += "&field2=" + String(co_ppm,1);
url += "&field3=" + String(co2_ppm,1);
url += "&field4=" + String(humedad,1);
url += "&field5=" + String(estadoNum);
Serial.println(url);
http.begin(url);
int httpCode = http.GET();
Serial.print("HTTP Code: ");
Serial.println(httpCode);
http.end();
}
// PANTALLA 1
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp: "); lcd.print(temperatura,1); lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("Humedad: "); lcd.print(humedad,1); lcd.print(" %");
lcd.setCursor(0,2);
lcd.print("CO: "); lcd.print(co_ppm,1); lcd.print(" ppm");
lcd.setCursor(0,3);
lcd.print("CO2: "); lcd.print(co2_ppm,1); lcd.print(" ppm");
delay(4000);
// PANTALLA 2
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CALIDAD DEL AIRE");
lcd.setCursor(0,1);
lcd.print("Estado: "); lcd.print(estadoGeneral);
lcd.setCursor(0,2);
lcd.print("CO: "); lcd.print(estadoCO);
lcd.setCursor(0,3);
lcd.print("CO2: "); lcd.print(estadoCO2);
delay(11000);
}