/*
Sistema de Riego Automatizado
Este código controla un sistema de riego basado en:
- Sensor de humedad del suelo
- Relé para controlar una bomba de agua o válvula solenoide
- Opcionalmente: sensor de temperatura y pantalla LCD
*/
// Definición de pines
const int sensorHumedadPin = A0; // Sensor de humedad conectado al pin analógico A0
const int relePin = 7; // Relé conectado al pin digital 7
const int ledIndicadorPin = 4; // LED indicador conectado al pin digital 4
// Valores de umbral para la humedad del suelo
const int umbralSecoPercent = 30; // Por debajo de este valor se activa el riego (en porcentaje)
const int umbralHumedoPercent = 70; // Por encima de este valor se detiene el riego (en porcentaje)
// Tiempos
const unsigned long tiempoMaximoRiego = 300000; // Tiempo máximo de riego (5 minutos en milisegundos)
const unsigned long intervaloLectura = 5000; // Intervalo entre lecturas (5 segundos)
unsigned long tiempoInicioRiego = 0; // Para controlar el tiempo de riego
unsigned long ultimaLectura = 0; // Para controlar el intervalo entre lecturas
// Variables de estado
bool riegoActivo = false;
int humedadSueloPercent = 0;
void setup() {
// Inicialización de comunicación serial
Serial.begin(9600);
// Configuración de pines
pinMode(relePin, OUTPUT);
pinMode(ledIndicadorPin, OUTPUT);
// Asegurarse de que el riego está apagado al iniciar
apagarRiego();
Serial.println("Sistema de riego automatizado iniciado");
Serial.println("--------------------------------------");
}
void loop() {
unsigned long tiempoActual = millis();
// Leer humedad del suelo a intervalos regulares
if (tiempoActual - ultimaLectura >= intervaloLectura) {
leerHumedadSuelo();
ultimaLectura = tiempoActual;
// Imprimir estado actual
Serial.print("Humedad del suelo: ");
Serial.print(humedadSueloPercent);
Serial.println("%");
}
// Comprobar si es necesario regar
if (!riegoActivo && humedadSueloPercent < umbralSecoPercent) {
iniciarRiego();
}
// Comprobar si es necesario detener el riego
if (riegoActivo) {
// Detener si ya está suficientemente húmedo
if (humedadSueloPercent > umbralHumedoPercent) {
apagarRiego();
Serial.println("Riego detenido: humedad suficiente");
}
// Detener si se ha excedido el tiempo máximo
else if (tiempoActual - tiempoInicioRiego > tiempoMaximoRiego) {
apagarRiego();
Serial.println("Riego detenido: tiempo máximo alcanzado");
}
}
// Blink LED indicador si el riego está activo
if (riegoActivo) {
digitalWrite(ledIndicadorPin, (tiempoActual / 500) % 2); // Parpadea cada 0.5 segundos
} else {
digitalWrite(ledIndicadorPin, LOW);
}
}
// Función para leer el sensor de humedad y convertir a porcentaje
void leerHumedadSuelo() {
int valorSensor = analogRead(sensorHumedadPin);
// Convertir el valor del sensor a porcentaje (ajustar estos valores según calibración)
// Nota: Algunos sensores dan 0-1023 donde 0 es mojado y 1023 es seco
// Aquí asumimos que 0 es completamente seco y 1023 es completamente húmedo
humedadSueloPercent = map(valorSensor, 1023, 0, 0, 100);
// Limitar el valor al rango 0-100%
humedadSueloPercent = constrain(humedadSueloPercent, 0, 100);
}
// Función para iniciar el riego
void iniciarRiego() {
digitalWrite(relePin, HIGH);
riegoActivo = true;
tiempoInicioRiego = millis();
Serial.println("Riego iniciado");
}
// Función para detener el riego
void apagarRiego() {
digitalWrite(relePin, LOW);
riegoActivo = false;
}