/*este proyecto de taller de grado realiza el riego automatizado de cultivos en campo abierto por medio de la tecnica de goteo
para ello se usa 3 sensores
- sensor de humedad si humedo = 0 logico
- sensor de lluvia si lluvia = 0 logico
- sensor de luz si luz = 0 logico
- sensor de temperatura analogico lm35 10mV/1oC, para este sensor se usara el conversor ADC canal cero del esp 32, resolucion 12 bits
La logica sencuencial del programa sera la siguiente en base al analisis de los sensores:
- no humedo y no lluvia y no luz y temperatura menor a 18 oC = entonces si inicia riego activa minibomba de agua y activa elecgtrovalvula
(1) (1) (1) (tempC<18) (0) (0)
- si humedo, no importa lo demas = entonces no inicia riego
- no humedo y si alguno de si lluvia o si luz o temperatura mayor a 18oC = entonces no inicia riego
*/
#include <LiquidCrystal.h>
//LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
LiquidCrystal lcd(14,27,32,33,25,26);
#define ADC_VREF_mV 3300.0
#define ADC_RESOLUTION 4096.0
//asignacion de pines
int slluvia=19;
int sluz=18;
int shumedad=5;
int ev=2;
int bm=15;
//iniciamos variables
float t=0;
float tempC=0;
float tanterior=0;
int x=0;
float milliVolt=0;
int digital=0;
String auxhumedad = "no";
String auxluz = "no";
String auxlluvia = "no";
int auxmsj=0;
int auxriego = 0;
//iniciamos constantes
//declaramos funciones
void setup()
{
Serial.begin(9600);
// Inicializamos el display de 16 x 2
lcd.begin(16, 2);
//iniciamos pines de entrada y salida
pinMode(slluvia, INPUT);
pinMode(sluz, INPUT);
pinMode(shumedad, INPUT);
pinMode(ev, OUTPUT);
pinMode(bm, OUTPUT);
//iniciamos parametros del sistema
//dht.begin(); //inicia sensor
//mensaje de bienvenida al sistema
//Nos posicionamos en la posiciocion 0,0 del display
lcd.setCursor(0, 0);
//mensaje de bienbenida
lcd.print("Bladimir Palma");
lcd.setCursor(0, 1);
lcd.print("UTB RIEGO");
digitalWrite(ev, HIGH); //activa electrovalvula
digitalWrite(bm, HIGH); //activa bomba de agua
delay(200);
digitalWrite(ev, LOW); //activa electrovalvula
digitalWrite(bm, LOW); //activa bomba de agua
delay(200);
digitalWrite(ev, HIGH); //activa electrovalvula
digitalWrite(bm, HIGH); //activa bomba de agua
delay(200);
digitalWrite(ev, LOW); //activa electrovalvula
digitalWrite(bm, LOW); //activa bomba de agua
delay(2000);
lcd.clear(); //borra lcd
}
void loop()
{
/////////etapa de muestreo de varios datos para hallar valor promedio/////////////
tanterior = 0;
for(x=0;x<10;x++)
{
//iniciamos la lectura de datos de sensor, este proceso se lo hace constante asi como la secuencia de if de abajo, para ver la humedad
digital = analogRead(A0);
delay(5);
milliVolt = digital * (ADC_VREF_mV / ADC_RESOLUTION);
tempC = milliVolt / 10;
tanterior = tanterior + tempC;
}
tempC = tanterior / 10; //hallamos valor promedio de 10 muestras tomadas
//////////////////////////////////////////////////////////////////////////////////
//Serial.println(tempC); //esta linea nos permite mostrar datos en puerto serial, solo para verificar la lectura del sensor lm35
if(digitalRead(shumedad) == 1) //evaluamos la humedad de suelo si esta seco, por verdadero preguntara por los otros parametros, (el sensor humedad nos entrega 1 logico si esta seco)
{
auxhumedad = "no"; //cadena que dice "no esta humedo"
if(digitalRead(slluvia) == 1) //pregunta si no esta lloviendo, (el sensor nos entrega 1 logico si no esta lloviendo)
{
auxlluvia = "no"; //cadena que dice "no esta lloviendo"
if(digitalRead(sluz) == 1) //pregunta si esta relativamente oscuro (el sensor nos entrega 1 logico cuando esta oscuro)
{
auxluz = "no"; //cadena que dice "no hay mucha luz del sol"
if(tempC <= 18) //pregunta si las condiciones de temperatura son ideales para regar, temperatura optima para regar
{
//en esta etapa habria cumplido todo lo necesario para hacer el riego (MODULOS RELAY SE ACTIVAN CON NIVEL BAJO)
digitalWrite(ev, LOW); //activa electrovalvula
digitalWrite(bm, LOW); //activa bomba de agua
auxriego = 1; //estado de si riego
}
else
{
digitalWrite(ev, HIGH); //desactiva electrovalvula
digitalWrite(bm, HIGH); //desactiva bomba de agua
auxriego = 0; //estado de no riego
}
}
else
{
auxluz = "si";
digitalWrite(ev, HIGH); //desactiva electrovalvula
digitalWrite(bm, HIGH); //desactiva bomba de agua
auxriego = 0; //estado de no riego
}
}
else
{
auxlluvia = "si";
if(digitalRead(sluz) == 1) // pregunta si esta oscuro
{
auxluz = "no"; //cadena qu nos dice que no hay luz
}
else
{
auxluz = "si"; //cadena qu nos dice que si hay luz
}
digitalWrite(ev, HIGH); //desactiva electrovalvula
digitalWrite(bm, HIGH); //desactiva bomba de agua
auxriego = 0; //estado de no riego
}
}
else
{
auxhumedad = "si"; //cadena qu nos dice que si esta humedo
if(digitalRead(slluvia) == 1) //pregunta si no esta lloviendo,
{
auxlluvia = "no"; //cadena qu nos dice que no esta lloviendo
}
else
{
auxlluvia = "si"; //cadena qu nos dice que si esta lloviendo
}
if(digitalRead(sluz) == 1) //pregunta si esta oscuro
{
auxluz = "no"; //cadena qu nos dice que no hay luz
}
else
{
auxluz = "si"; //cadena qu nos dice que si hay luz
}
digitalWrite(ev, HIGH); //desactiva electrovalvula
digitalWrite(bm, HIGH); //desactiva bomba de agua
auxriego = 0; //estado de no riego
}
//////etapa de mostrar estado de riego y sensores///////
if(auxmsj == 0) //si es cero muesta sensores
{
auxmsj=1; //cambia de estado a la variable para rotar mensaje
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T = ");
lcd.print(tempC);
lcd.print(" oC");
lcd.setCursor(0,1);
lcd.print("H=");
lcd.print(auxhumedad);
lcd.print(" LL=");
lcd.print(auxlluvia);
lcd.print(" LX=");
lcd.print(auxluz);
}
else
{//si es 1 muestra estado de riego
auxmsj=0; //cambia de estado a la variable para rotar mensaje
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ESTADO:");
if(auxriego == 0) //si es cero muestra no riego
{
lcd.setCursor(0,1);
lcd.print("NO REGANDO");
}
else //simes 1 muestra si riego
{
lcd.setCursor(0,1);
lcd.print("SI REGANDO");
}
}
//////////////////////////////////////////////////////
delay(3000);
}