#define BLYNK_TEMPLATE_ID "TMPL2l48XFmIX"
#define BLYNK_TEMPLATE_NAME "Proyecto en clase"
#define BLYNK_AUTH_TOKEN "xAtjfhxB_xap0af1wvf2ogcqax_7nTch"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
#include <ESP32Servo.h>
#define DHTPIN 15
#define DHTTYPE DHT22
#define TRIG_PIN 5
#define ECHO_PIN 18
#define LED_PIN 2
#define SERVO_PIN 13
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
bool modoAutomatico = true;
int anguloManual = 0;
float temperatura = 0;
float humedad = 0;
long distancia = 0;
const int alturaMaxima = 400; // cm, altura del tanque
// Blynk: cambio de modo automático/manual
BLYNK_WRITE(V5) {
modoAutomatico = param.asInt();
}
// Blynk: slider para controlar servo en modo manual
BLYNK_WRITE(V6) {
if (!modoAutomatico) {
anguloManual = param.asInt();
servo.write(anguloManual);
}
}
void setup() {
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
dht.begin();
servo.attach(SERVO_PIN);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
Blynk.run();
leerDHT();
leerUltrasonico();
if (modoAutomatico) {
if (temperatura > 35) {
servo.write(90); // Abrir válvula
} else {
servo.write(0); // Cerrar válvula
}
}
delay(2000); // Espera entre lecturas
}
void leerDHT() {
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
if (isnan(temperatura) || isnan(humedad)) {
Serial.println("Error leyendo del DHT!");
return;
}
Blynk.virtualWrite(V0, temperatura);
Blynk.virtualWrite(V1, humedad);
}
void leerUltrasonico() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracion = pulseIn(ECHO_PIN, HIGH);
distancia = duracion * 0.034 / 2;
// Alerta de proximidad
if (distancia > 0 && distancia < 30) {
digitalWrite(LED_PIN, HIGH);
Blynk.virtualWrite(V7, "¡ALERTA! ¡ALERTA! ¡ALERTA!");
} else {
digitalWrite(LED_PIN, LOW);
Blynk.virtualWrite(V7, "Todo normal");
}
// Nivel del tanque
int alturaAgua = alturaMaxima - distancia;
int porcentaje = constrain((alturaAgua * 100) / alturaMaxima, 0, 100);
Blynk.virtualWrite(V2, porcentaje);
}