//Programa realizado por Super AgroFighter para el canal
//de youtube de Agricultura Electrónica
//https://youtu.be/MdCUvPTvpCo
//Suscribirse, que no cuesta naaaaaa!!!! :D
//Muchas gracias majos!!!!
/*POSIBLES CASOS
1 Nivel bajo de agua. Muestra temp/hum y humedad del suelo. Da aviso rellenar tanque
1.1 Activo bomba. Muestra temp/hum y humedad del suelo. Da otro aviso: No se puede regar, rellenar tanque.
2 Nivel agua OK. Muestra temp/hum y humedad del suelo. Aviso nivel OK
2.1 Humedad suelo OK. Muestra temp/hum y humedad del suelo.
2.1.1 Activo bomba. Comienza el riego
2.2 Humedad suelo NO OK. Muestra temp/hum y humedad del suelo. Comienza riego automático.
2.2.2 Activo bomba. Muestra aviso, no se puede activar riego manual. Riego automático activo.
*/
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int sensor = 2;//Pin 2 para el valor del sensor DHT11
int temp, HumA;//Configuro las variables de temperatura y humedad del DHT11
int boton = 3;//Pin 3 para activar manualmente la bomba
const int nivel = 9; //Pin 9 para medir el nivel de agua
const int bomba = 13; //Pin 13 para la bomba --> Rele
const int HumS = A0; //A0 para la humedad del suelo
const int lluvia = A1; //A0 para la humedad del suelo
DHT dht (sensor, DHT22);//Configuro el modelo de DHT. Es el DHT11
int botonest = 0; //Inicializamos a 0 el estado del boton
///////////////////////////////Parte de humedad suelo y riego
void setup()
{
Serial.begin(9600);
pinMode(HumS, INPUT);//Configuro humedadsuelo como entrada
pinMode(bomba, OUTPUT);//Configuro bomba como salida
pinMode(nivel, INPUT);//Configuro en nivel de agua como entrada
pinMode(boton, INPUT);//Configuro en boton como entrada
pinMode(lluvia, INPUT);
//PARA EL SENSOR DHT11
dht.begin();//Arranco el sensor DHT11
//PARA LA PANTALLA LCD
lcd.init(); //Inicializamos el LCD
lcd.backlight(); //Activamos la luz de fondo
lcd.clear(); //Limpiamos lo que haya en pantalla
lcd.setCursor(0, 0); //Iniciamos el cursor en el punto 0,0
}
void loop()
{
int SensorValue = analogRead(HumS)*100/1024;//Leo el valor de la humedad y lo meto en SensorValue
int SensorNivel = digitalRead(nivel); //Leo lo que marca el nivel de agua
int botonest = digitalRead(boton);//Leo lo que marca el boton
int llueve = analogRead (lluvia);// mide si esta lloviendo o no
//Leo y meto los valores de temperatura y humedad en las variables temp y humedad
HumA = dht.readHumidity();
temp = dht.readTemperature();
/////Puerto serie
//Imprimo por el puerto serie los valores de temperatura y humedad del DHT11
Serial.print("Temperatura: "); Serial.print(temp);
Serial.print("ºC Humedad: "); Serial.print(HumA); Serial.println("%");
//Imprimo por el puerto serie el valor de la humedad del SUELO
Serial.print("Humedad del suelo: "); Serial.print(SensorValue); Serial.println("%");
/////Para mostrarlo en el LCD
lcd.init(); //Inicializamos el LCD
lcd.backlight(); //Activamos la luz de fondo
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("DHT:");
lcd.print(temp);
lcd.print("C/");
lcd.print(HumA);
lcd.print("%");
lcd.setCursor(0, 1); //Posicion: columna cero fila uno
lcd.print("HS:");
lcd.print(SensorValue);
lcd.print("%");
if (llueve > 700)
{
lcd.print("Llueve");
}
else
{
lcd.print("No llueve");
}
/*
//esto si quiero que la pantalla vaya de izquierda a derecha.
for(int c=0;c<12;c++){ //hace una secuencia hacia la izquierda y luego hacia la derecha, por 12 pasos
lcd.scrollDisplayLeft();
delay(600); }
for(int c=0; c<12;c++){
lcd.scrollDisplayRight();
delay(600); }
lcd.clear();//blanqueamos la pantalla
*/
if (SensorNivel == 0 && botonest == 1)
{ Serial.println("Nivel bajo de Agua. Rellenar el tanque");
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("Nivel bajo agua");
lcd.setCursor(0, 1); //Posicion: columna cero fila cero
lcd.print("Rellenar tanque");
delay (2000);
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("DHT:");
lcd.print(temp);
lcd.print("C/");
lcd.print(HumA);
lcd.print("%");
lcd.setCursor(0, 1); //Posicion: columna cero fila uno
lcd.print("HS:");
lcd.print(SensorValue);
lcd.print("%");
if (llueve > 700)
{
lcd.print("Llueve");
}
else
{
lcd.print("No llueve");
}
delay (1000);
}
if (SensorNivel == 0 && botonest == 0)
{ Serial.println("Imposible regar, nivel bajo de agua. Debe rellenar el tanque");
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("IMPOSIBLE REGAR");
lcd.setCursor(0, 1); //Posicion: columna cero fila cero
lcd.print("Nivel bajo");
}
if (SensorNivel == 1)
{
Serial.println("Nivel de agua correcto, se puede regar");
if ((SensorValue <= 700) && (llueve < 700)) // el valor que considero seco y hay que regar es de 700
{
Serial.println("La tierra está seca, comienza el riego automático");
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("Riego automatico");
lcd.setCursor(0, 1); //Posicion: columna cero fila uno
lcd.print("HS:");
lcd.print(SensorValue);
lcd.print("%");
digitalWrite(bomba, HIGH);
if (botonest == 1)
{ Serial.println("No se puede activar riego manual. Riego automático activo");
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("Regando automatico");
lcd.setCursor(0, 1); //Posicion: columna cero fila cero
lcd.print("NO MANUAL");
delay(1000);
}
}
if (SensorValue > 700) //No es necesario el riego automático, pero se puede regar de forma manual
{
if (botonest == 1) {
Serial.println("Regando de forma manual");
lcd.clear();//blanqueamos la pantalla
lcd.setCursor(0, 0); //Posicion: columna cero fila cero
lcd.print("Riego manual");
lcd.setCursor(0, 1); //Posicion: columna cero fila uno
lcd.print("HS:");
lcd.print(SensorValue);
lcd.print("%");
digitalWrite(bomba, HIGH);
delay(5000);
}
if (botonest == 0) {
digitalWrite(bomba, LOW);
}
}
}
}