#include <WiFi.h>
#include <HTTPClient.h>
#include <ESP32Servo.h>
// WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak
String apiKey = "3TI729VCZR14KSBI"; // API Key de ThingSpeak
const char* server = "http://api.thingspeak.com/update";
// Servo
Servo servo1;
// Pines
int trig = 26;
int eco = 25;
int pinServo = 13;
int pinSensor = 34;
// Variables
long duracion = 0;
int distancia = 0;
int humedadRaw = 0;
String comandoSerial = "";
int contadorSeco = 0;
int contadorHumedo = 0;
// Umbrales
int distanciaUmbral = 15; // cm
int humedadMojada = 1000; // ≤1000 = mojado, >1000 = seco
void setup() {
Serial.begin(115200);
pinMode(trig, OUTPUT);
pinMode(eco, INPUT);
pinMode(pinSensor, INPUT);
servo1.attach(pinServo);
servo1.write(90); // Centro
Serial.println("Iniciando WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado.");
Serial.println("Contenedor inteligente iniciado.");
}
void loop() {
// Leer humedad
humedadRaw = analogRead(pinSensor);
Serial.print("Lectura humedad (valor analógico): ");
Serial.print(humedadRaw);
if (humedadRaw <= humedadMojada) {
Serial.println(" → Clasificado como: MOJADO");
} else {
Serial.println(" → Clasificado como: SECO");
}
// Comando manual
if (Serial.available()) {
comandoSerial = Serial.readStringUntil('\n');
comandoSerial.trim();
if (comandoSerial == "seco") {
servo1.write(0);
contadorSeco++;
enviarDatosThingSpeak(contadorSeco, contadorHumedo);
delay(3000);
servo1.write(90);
return;
} else if (comandoSerial == "humedo") {
servo1.write(180);
contadorHumedo++;
enviarDatosThingSpeak(contadorSeco, contadorHumedo);
delay(3000);
servo1.write(90);
return;
} else if (comandoSerial == "limpiar") {
Serial.println("Modo limpieza iniciado (10 minutos)");
servo1.write(0); // Posición para limpieza
delay(600000); // 10 minutos
servo1.write(90);
Serial.println("Limpieza terminada.");
return;
}
}
// Medición de distancia
digitalWrite(trig, LOW);
delayMicroseconds(5);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duracion = pulseIn(eco, HIGH, 30000);
distancia = duracion * 0.034 / 2;
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
if (distancia > 1 && distancia < distanciaUmbral) {
delay(500);
if (humedadRaw <= humedadMojada) {
Serial.println("Acción: Servo a MOJADO (180°)");
servo1.write(180);
contadorHumedo++;
} else {
Serial.println("Acción: Servo a SECO (0°)");
servo1.write(0);
contadorSeco++;
}
delay(3000);
servo1.write(90);
Serial.println("Servo al centro.");
enviarDatosThingSpeak(contadorSeco, contadorHumedo);
Serial.println("------------------------------");
}
delay(1000);
}
void enviarDatosThingSpeak(int seco, int humedo) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = server;
url += "?api_key=" + apiKey;
url += "&field1=" + String(seco);
url += "&field2=" + String(humedo);
Serial.print("Enviando datos a ThingSpeak: ");
Serial.println(url); // ← Muestra el enlace completo
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
Serial.print("Datos enviados. Código de respuesta: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error al enviar datos: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi desconectado. No se enviaron datos.");
}
}