#include "DHT.h"
// Pines
#define DHTPIN 25 // Pin conectado al DHT22
#define DHTTYPE DHT22
#define SOIL_PIN 34 // Pin analógico sensor de humedad suelo
#define RELAY_PIN 0 // Pin digital para relay (control de bomba)
#define LED_PIN 2 // LED en ESP32 (representa estado de bomba)
DHT dht(DHTPIN, DHTTYPE);
// Umbrales de humedad suelo (% C.C.)
const float HUM_ON = 60.0; // Encender bomba si ≤ 60%
const float HUM_OFF = 80.0; // Apagar bomba si ≥ 80%
// Umbrales de temperatura (alertas)
const float TEMP_MIN = 9.0; // °C
const float TEMP_MAX = 20.0; // °C
// Protección de tiempo máximo de riego
const unsigned long MAX_RUN_TIME = 300000UL; // 5 minutos en ms
// Variables
float soilHumidity = 0.0; // % humedad suelo
bool bombaEncendida = false;
unsigned long startTime = 0; // tiempo de encendido de la bomba
// Función para imprimir log con tiempo
void logMessage(String msg) {
Serial.print("[");
Serial.print(millis() / 1000); // tiempo en segundos
Serial.print("s] ");
Serial.println(msg);
}
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // bomba apagada
digitalWrite(LED_PIN, LOW);
logMessage("Sistema de Riego Automático - ESP32 iniciado.");
}
void loop() {
// Leer temperatura y humedad ambiente
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
logMessage("⚠️ Error al leer DHT22");
} else {
Serial.print("[");
Serial.print(millis() / 1000);
Serial.print("s] ");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" °C | Humedad Ambiente: ");
Serial.print(h);
Serial.println(" %");
// Alertas de temperatura fuera de rango
if (t < TEMP_MIN) {
logMessage("⚠️ ALERTA: Temperatura BAJA (< 9 °C)");
}
if (t > TEMP_MAX) {
logMessage("⚠️ ALERTA: Temperatura ALTA (> 20 °C)");
}
}
// Leer humedad de suelo (ejemplo con mapeo 0-4095 → 0-100 %)
int rawValue = analogRead(SOIL_PIN);
soilHumidity = map(rawValue, 0, 4095, 100, 0);
// Nota: invertir si tu sensor da valores altos en seco
Serial.print("[");
Serial.print(millis() / 1000);
Serial.print("s] Humedad del Suelo: ");
Serial.print(soilHumidity);
Serial.println(" % C.C.");
// Lógica de control con histéresis
if (!bombaEncendida && soilHumidity <= HUM_ON) {
encenderBomba();
} else if (bombaEncendida && soilHumidity >= HUM_OFF) {
apagarBomba();
}
// Verificar tiempo máximo de riego
if (bombaEncendida && (millis() - startTime >= MAX_RUN_TIME)) {
logMessage("⏱️ Tiempo máximo alcanzado (5 min). Apagando bomba.");
apagarBomba();
}
delay(5000); // leer cada 5 segundos
}
void encenderBomba() {
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
bombaEncendida = true;
startTime = millis(); // registrar inicio
logMessage("💧 Bomba ENCENDIDA - Iniciando riego...");
}
void apagarBomba() {
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
bombaEncendida = false;
logMessage("✅ Bomba APAGADA – Humedad dentro del rango óptimo (60–80 % C.C.)");
}