#define BLYNK_TEMPLATE_ID "TMPL2kFP_8lLZ"
#define BLYNK_TEMPLATE_NAME "PROYECTOTESIS"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
// Credenciales Wi-Fi
char ssid[] = "Wokwi-GUEST"; // Tu SSID de Wi-Fi
char pass[] = ""; // Tu contraseña de Wi-Fi
char auth[] = "alBTf44nEewKoCz-z51lGyMbmHkXE0-1"; // AUTH TOKEN
// Pines
#define trigPin 5
#define echoPin 18
#define MQ135_PIN 4
#define LED_ROJO 26
#define LED_VERDE 25
#define LED_AMARILLO 33
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C de la LCD
// Variables
int calidadAire = 0;
const int UMBRAL_GAS = 400;
float distancia = 0.0;
const int UMBRAL_DISTANCIA = 50; // Umbral para considerar el baño ocupado
bool modoLimpieza = false; // Estado del modo de limpieza
// Funciones
float medirDistancia() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracion = pulseIn(echoPin, HIGH);
return (duracion * 0.034) / 2; // Conversión a cm
}
void setup() {
// Configuración Serial
Serial.begin(115200);
// Configuración de pines
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(MQ135_PIN, INPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
// Inicialización de LCD
lcd.init();
lcd.backlight();
lcd.print("Iniciando...");
// Conectar a la red Wi-Fi y Blynk
Blynk.begin(auth, ssid, pass); // Usando credenciales
// Confirmación en LCD
lcd.clear();
lcd.print("Conectado a Blynk");
delay(2000);
lcd.clear();
}
// Activar modo limpieza manual desde el Segmented Switch
BLYNK_WRITE(V2) {
int estado = param.asInt();
if (estado == 1) {
modoLimpieza = true;
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_AMARILLO, HIGH);
lcd.clear();
lcd.print("Estado: Limpieza");
Blynk.virtualWrite(V0, "Estado: Limpieza");
} else {
modoLimpieza = false;
}
}
void loop() {
Blynk.run(); // Mantener la conexión con Blynk
if (!modoLimpieza) {
// Medición de distancia
distancia = medirDistancia();
// Lectura del MQ135
calidadAire = analogRead(MQ135_PIN);
// Control de LEDs y LCD según las condiciones
if (calidadAire > UMBRAL_GAS) {
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, HIGH);
lcd.clear();
lcd.print("Estado: Limpieza");
lcd.setCursor(0, 1);
lcd.print("Gas: Toxico!");
Blynk.virtualWrite(V0, "Estado: Limpieza");
} else if (distancia < UMBRAL_DISTANCIA) {
digitalWrite(LED_ROJO, HIGH);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
lcd.clear();
lcd.print("Estado: Ocupado");
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distancia);
lcd.print(" cm");
Blynk.virtualWrite(V0, "Estado: Ocupado");
} else {
digitalWrite(LED_ROJO, LOW);
digitalWrite(LED_VERDE, HIGH);
digitalWrite(LED_AMARILLO, LOW);
lcd.clear();
lcd.print("Estado: Libre");
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distancia);
lcd.print(" cm");
Blynk.virtualWrite(V0, "Estado: Libre");
}
}
// Enviar datos a Blynk
Blynk.virtualWrite(V1, calidadAire); // Nivel de gases
delay(1000); // Evitar bucles excesivos
}