#include <Wire.h>
#include <hd44780.h> // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
#include <RTClib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//Pines i/o
#define Horizontal A6
#define Vertical A7
hd44780_I2Cexp lcd; // declare lcd object: auto locate & auto config expander chip
RTC_DS1307 rtc; //declare lcd object: auto locate & auto config expander chip
OneWire oneWire(6);
DallasTemperature sensor(&oneWire);
int bandera=1;
int PULSADOR = 5; // pulsador incorporado pin digital 10
int Medio; // variable para almacenar valor leido del pulsador
int Izquierda = 0;
int Derecha = 0;
int Arriba = 0;
int Abajo = 0;
int SensorPin1 = A0; /* sensor 1*/
int SensorPin2 = A1; /* sensor 1*/
int SensorPin3 = A2; /* sensor 1*/
int Sensor1 = 0;
int Sensor2 = 0;
int Sensor3 = 0;
int Promsensor;
int maximo = 80; /* 80% */
int minimo = 30; /* 30% */
int Horamax= 2;
int Horamin= 23;
int Horatotal;
int Temperaturamax = 27;
int menu = 0;
int menuplantas = 0;
int menuconfig = 0;
int brillo = 0;
String bomba1;
String luz;
String Aire;
int Contador1=0;
int Contador2 =0;
int aux1 = 0;
void setup() {
pinMode(PULSADOR, INPUT);
pinMode(2,OUTPUT); /* Declaramos pin como salida */
pinMode(3,OUTPUT); /* Declaramos pin como salida */
pinMode(4,OUTPUT); /* Declaramos pin como salida */
Serial.begin(9600); /* Iniciamos el puerto serie , de esta forma podemos visualizar las lecturas en el monitor serie*/
/*pinMode(Horizontal, INPUT);
pinMode(Vertical, INPUT);*/
lcd.begin (16, 2); /*columnas y filas de lcd */
lcd.clear();
rtc.begin();
rtc.adjust(DateTime(2023, 8, 8, 22, 50, 0));
}
void loop() {
DateTime now = rtc.now();
if(analogRead(Horizontal) > 480 && analogRead(Horizontal) < 520 || analogRead(Vertical) > 480 && analogRead(Vertical) < 520){
if(now.second()>=Contador1){
Contador2 = now.second()-Contador1;
}
if(now.second()<Contador1){
Contador2 = 60-Contador1+now.second();
}
if(Contador2>=30){
lcd.off();
lcd.noBacklight();
aux1=1;
}
}
if((analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480)||(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023)||(analogRead(Vertical) >= 0 && analogRead(Vertical) < 480)||(analogRead(Vertical) > 520 && analogRead(Vertical) <= 1023)){
Contador1 = now.second();
if(aux1==1){
lcd.on();
aux1=0;
}
}
Serial.println(Contador2);
sensor.requestTemperatures();
float temperatura = sensor.getTempCByIndex (0);
Sensor1 = map (analogRead(SensorPin1), 0, 1023, 0,100); /* valores porcentuales dentro del rango */
Sensor2 = map (analogRead(SensorPin2), 0, 1023, 0,100); /* valores porcentuales dentro del rango */
Sensor3 = map (analogRead(SensorPin3), 0, 1023, 0,100); /* valores porcentuales dentro del rango */
if (Sensor1>=maximo && Sensor2>=maximo && Sensor3>=maximo){
digitalWrite(2, LOW); /* desactivo bomba de riego */
bomba1 = "Sin Riego";
}
if (Sensor1<=minimo && Sensor2<=minimo && Sensor3<=minimo){
digitalWrite(2, HIGH); /* activo bomba de riego */
bomba1 = "Regando";
}
if(Horamax >= Horamin){
Horatotal = Horamax-Horamin;
if (now.hour() >= Horamin && now.hour() < Horamax){
digitalWrite(3, HIGH); /* activo bomba de riego */
luz = "Luz Encendida";
}
else{
digitalWrite(3, LOW); /* activo bomba de riego */
luz = "Luz Apagada";
}
}
if(Horamax < Horamin){
Horatotal = 24-Horamin+Horamax;
if (now.hour() >= Horamin || now.hour() < Horamax){
digitalWrite(3, HIGH); /* activo bomba de riego */
luz = "Luz Encendida";
}
else{
digitalWrite(3, LOW); /* activo bomba de riego */
luz = "Luz Apagada";
}
}
if (temperatura > Temperaturamax){
digitalWrite(4, HIGH); /* activo bomba de riego */
Aire = "Aire Encendido";
}
else{
digitalWrite(4, LOW); /* activo bomba de riego */
Aire = "Aire Apagado";
}
if(bandera==1){
if(analogRead(Vertical) >= 0 && analogRead(Vertical) < 480){
menu++;
if(menu >= 4){
menu = 4;
}
delay(50);
}
if(analogRead(Vertical) > 520 && analogRead(Vertical) <= 1023){
menu--;
if(menu <= 0){
menu = 0;
}
delay(50);
}
if(digitalRead(PULSADOR)==LOW){
bandera=0;
lcd.clear();
delay(50);
}
switch (menu){
case 0:
lcd.setCursor(0,0);
lcd.print("1 Plantas <");
lcd.setCursor(0,1);
lcd.print("2 Luz ");
break;
case 1:
lcd.setCursor(0,0);
lcd.print("1 Plantas ");
lcd.setCursor(0,1);
lcd.print("2 Luz <");
break;
case 2:
lcd.setCursor(0,0);
lcd.print("3 Temperatura <");
lcd.setCursor(0,1);
lcd.print("4 Ventilador ");
break;
case 3:
lcd.setCursor(0,0);
lcd.print("3 Temperatura ");
lcd.setCursor(0,1);
lcd.print("4 Ventilador <");
break;
case 4:
lcd.setCursor(0,0);
lcd.print("5 Ajustes <");
lcd.setCursor(0,1);
lcd.print(" ");
break;
}
}
if (bandera==0){
switch (menu){
case 0:
if(analogRead(Vertical) >= 0 && analogRead(Vertical) < 480){
menuplantas++;
if(menuplantas >= 2){
menuplantas = 2;
}
delay(50);
}
if(analogRead(Vertical) > 520 && analogRead(Vertical) <= 1023){
menuplantas--;
if(menuplantas <= 0){
menuplantas = 0;
}
delay(50);
}
if(digitalRead(PULSADOR)==LOW){
bandera=1;
menuplantas=0;
lcd.clear();
delay(50);
}
switch (menuplantas){
case 0:
lcd.setCursor(0,0);
lcd.print("Sensor 1 ");
lcd.print(Sensor1); //Mostrar números finales//
lcd.print("%"); //imprimir el símbolo de porcentaje al final//
lcd.print(" "); //Limpie los caracteres adicionales//
lcd.setCursor(0,1);
lcd.print(bomba1);
lcd.print(" ");
break;
case 1:
lcd.setCursor(0,0);
lcd.print("Sensor 2 ");
lcd.print(Sensor2); //Mostrar números finales//
lcd.print("%"); //imprimir el símbolo de porcentaje al final//
lcd.print(" "); //Limpie los caracteres adicionales//
lcd.setCursor(0,1);
lcd.print(bomba1);
lcd.print(" "); //Limpie los caracteres adicionales// delay(1);
break;
case 2:
lcd.setCursor(0,0);
lcd.print("Sensor 3 ");
lcd.print(Sensor3); //Mostrar números finales//
lcd.print("%"); //imprimir el símbolo de porcentaje al final//
lcd.print(" "); //Limpie los caracteres adicionales//
lcd.setCursor(0,1);
lcd.print(bomba1);
lcd.print(" "); //Limpie los caracteres adicionales// delay(1);
break;
}
break;
case 1:
if(digitalRead(PULSADOR)==LOW){
bandera=1;
lcd.clear();
delay(200);
break;
}
lcd.setCursor(0,0);
lcd.print(luz);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Tiempo 9:00");
break;
case 2:
if(digitalRead(PULSADOR)==LOW){
bandera=1;
lcd.clear();
delay(50);
break;
}
lcd.setCursor(0,0);
lcd.print("Temperatura ");
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.print(" C");
lcd.print(" ");
break;
case 3:
if(digitalRead(PULSADOR)==LOW){
bandera=1;
lcd.clear();
delay(50);
break;
}
lcd.setCursor(0,0);
lcd.print(Aire);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
break;
case 4:
if(analogRead(Vertical) >= 0 && analogRead(Vertical) < 480){
menuconfig++;
if(menuconfig >= 4){
menuconfig = 4;
}
delay(50);
}
if(analogRead(Vertical) > 520 && analogRead(Vertical) <= 1023){
menuconfig--;
if(menuconfig <= 0){
menuconfig = 0;
}
delay(50);
}
if(digitalRead(PULSADOR)==LOW){
bandera=1;
menuconfig=0;
lcd.clear();
delay(50);
}
switch (menuconfig){
case 0:
lcd.setCursor(0,0);
lcd.print("Encendido de luz");
lcd.print(" "); //Limpie los caracteres adicionales//
if(analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480){
Horamin = Horamin + 1;
if(Horamin >= 24){
Horamin = 24;
}
delay(50);
}
if(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023){
Horamin = Horamin - 1;
if(Horamin <= 0){
Horamin = 0;
}
delay(50);
}
lcd.setCursor(0,1);
lcd.print(Horamin);
lcd.print(" Horas ");
lcd.print("(");
lcd.print(Horatotal);
lcd.print(") ");
break;
case 1:
lcd.setCursor(0,0);
lcd.print("Apagado de luz");
lcd.print(" "); //Limpie los caracteres adicionales//
if(analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480){
Horamax = Horamax + 1;
if(Horamax >= 24){
Horamax = 24;
}
delay(50);
}
if(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023){
Horamax = Horamax - 1;
if(Horamax <= 0){
Horamax = 0;
}
delay(50);
}
lcd.setCursor(0,1);
lcd.print(Horamax);
lcd.print(" Horas ");
lcd.print("(");
lcd.print(Horatotal);
lcd.print(") ");
break;
case 2:
lcd.setCursor(0,0);
lcd.print("Humedad Minima");
lcd.print(" "); //Limpie los caracteres adicionales//
if(analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480){
minimo = minimo + 1;
if(minimo >= 100){
minimo = 100;
}
delay(50);
}
if(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023){
minimo = minimo - 1;
if(minimo <= 0){
minimo = 0;
}
delay(50);
}
lcd.setCursor(0,1);
lcd.print(minimo);
lcd.print(" %");
lcd.print(" ");
break;
case 3:
lcd.setCursor(0,0);
lcd.print("Humedad Maxima");
lcd.print(" "); //Limpie los caracteres adicionales//
if(analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480){
maximo = maximo + 1;
if(maximo >= 100){
maximo = 100;
}
delay(50);
}
if(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023){
maximo = maximo - 1;
if(maximo <= 0){
maximo = 0;
}
delay(50);
}
lcd.setCursor(0,1);
lcd.print(maximo);
lcd.print(" %");
lcd.print(" ");
break;
case 4:
lcd.setCursor(0,0);
lcd.print("T. Ambiente Max");
lcd.print(" "); //Limpie los caracteres adicionales//
if(analogRead(Horizontal) >= 0 && analogRead(Horizontal) < 480){
Temperaturamax = Temperaturamax + 1;
if(Temperaturamax >= 35){
Temperaturamax = 35;
}
delay(50);
}
if(analogRead(Horizontal) > 520 && analogRead(Horizontal) <= 1023){
Temperaturamax = Temperaturamax - 1;
if(Temperaturamax <= 0){
Temperaturamax = 0;
}
delay(50);
}
lcd.setCursor(0,1);
lcd.print(Temperaturamax);
lcd.print(" C");
lcd.print(" ");
break;
}
break;
}
}
}