#define BLYNK_TEMPLATE_ID "TMPL2lNpv2YZg"
#define BLYNK_TEMPLATE_NAME "Nini Gomez"
#define BLYNK_AUTH_TOKEN "3PsSmtOqK9MTH5zNKICd1b_pqBPkgaGy"
#include <DHTesp.h>// esta libreria se usa para conectar a wifi la tarjeta
#include <BlynkSimpleEsp32.h>// esta libreria se usa para la conexion a la plataforma Blynk
#include <Wire.h>// permite comunicarse con dispositivos por bus I2C (Inter-Integrated Circuit o 2 alambres)
#include <LiquidCrystal_I2C.h>//para imprimir mensajes en una pantalla LCD usando una mochila I2C
#include <WiFi.h>//biblioteca de Arduino que contiene las funciones para conectarse a una red Wi-F
#include <NTPClient.h>//se utiliza para sincronizar la hora de un sistema informático con una fuente
#include <WiFiUdp.h>// esta libreria se usa para que el dispositivo se uncliente de la red wifi
#define DHTPIN 13
#define LED_PIN 25
#define POT_PIN 34 // Pin al que está conectado el potenciómetro
#define BUZZER_PIN 26 // Pin al que está conectado el buzzer
#define RED_LED_PIN 12 // Pin al que está conectado el led rojo del LED RGB
#define GREEN_LED_PIN 14 // Pin al que está conectado el led verde del LED RGB
#define BLUE_LED_PIN 27 // Pin al que está conectado el led azul del LED RGB
DHTesp dht;
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int ppmValue = 0; // Declarar ppmValue en un alcance global
BlynkTimer timer;
// Configuración de la pantalla LCD 20x16
LiquidCrystal_I2C lcd(0x27, 20, 4); // Dirección I2C 0x27, 20 caracteres x 4 líneas
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(POT_PIN, INPUT); // Configurar el pin del potenciómetro como entrada
pinMode(BUZZER_PIN, OUTPUT); // Configurar el pin del buzzer como salida
pinMode(RED_LED_PIN, OUTPUT); // Configurar el pin del led rojo del LED RGB como salida
pinMode(GREEN_LED_PIN, OUTPUT); // Configurar el pin del led verde del LED RGB como salida
pinMode(BLUE_LED_PIN, OUTPUT); // Configurar el pin del led azul del LED RGB como salida
Serial.begin(115200);
dht.setup(DHTPIN, DHTesp::DHT22); // Inicializar el sensor DHT
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, sendDHTData); // Enviar datos del DHT cada 2 segundos
// Inicializar la pantalla LCD
lcd.init();
lcd.backlight();
// Inicializar el cliente NTP
timeClient.begin();
}
void sendDHTData() {
float t = dht.getTemperature();
float h = dht.getHumidity();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Leer el valor del potenciómetro
ppmValue = analogRead(POT_PIN);
// Mapear el valor del potenciómetro de 0 a 150
ppmValue = map(ppmValue, 0, 4095, 0, 150);
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
Blynk.virtualWrite(V2, ppmValue);
// Obtener la hora y la fecha de Internet
timeClient.update();
String dateTimeString = timeClient.getFormattedTime();
// Limpiar la pantalla y mostrar los datos
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humedad: ");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temperatura: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("CO2 (ppm): ");
lcd.print(ppmValue);
lcd.setCursor(0, 3);
lcd.print(dateTimeString); // Mostrar la hora y la fecha
Serial.print("Humedad: ");
Serial.print(h);
Serial.print("%\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" °C");
Serial.print("CO2 (ppm): ");
Serial.println(ppmValue);
Serial.print("Hora y fecha: ");
Serial.println(dateTimeString);
// Activar el buzzer si el valor de ppm es mayor que 100
if (ppmValue > 100) {
digitalWrite(LED_PIN, HIGH); // Encender LED
digitalWrite(BUZZER_PIN, HIGH); // Activar el buzzer
Blynk.virtualWrite(V3, HIGH); // Activa el widget de notificación en la app Blynk
} else {
digitalWrite(LED_PIN, LOW); // Apagar LED
digitalWrite(BUZZER_PIN, LOW); // Desactivar el buzzer
Blynk.virtualWrite(V3, LOW); // Desactiva el widget de notificación en la app Blynk
}
// Controlar el LED RGB según el valor de ppm
if (ppmValue <= 50) {
// Verde
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, LOW);
} else if (ppmValue <= 100) {
// Naranja
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, HIGH);
} else {
// Rojo
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
}
}
void loop() {
Blynk.run();
timer.run();
}