#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "RTClib.h"
#include <DHT.h>
#include <DHT_U.h>
unsigned long previousMillis = 0;
const long interval1 = 1000; // Intervalo para tarea 1 en milisegundos
const long interval2 = 100; // Intervalo para tarea 2 en milisegundos
const long interval3 = 500;
int HUMSUELO=0;
int HUMSUELO2=0;
int suelo=0;
int suelo2=0;
float promHumSuelo=0;
const int rele=13;
int HSMinAct=EEPROM.read(0);
LiquidCrystal_I2C lcd(0x27,16,2);
RTC_DS1307 RTC;
char CLAVE[2];
int INDICE=0;
int test=0;
//Horario de riego/////////////////////////////
int h1_c1=13; int m1_c1=30; int s1_c1=0;/////
int h2_c1=7; int m2_c1=45; int s2_c1=0;/////
int h3_c1=8; int m3_c1=30; int s3_c1=0;/////
int h4_c1=8; int m4_c1=45; int s4_c1=0;/////
int h5_c1=9; int m5_c1=30; int s5_c1=0;/////
int h6_c1=10; int m6_c1=15; int s6_c1=0;/////
int h7_c1=10; int m7_c1=30; int s7_c1=0;/////
int h8_c1=13; int m8_c1=25; int s8_c1=0;/////
int h9_c1=20; int m9_c1=52; int s9_c1=0;/////
int h10_c1=14; int m10_c1=36; int s10_c1=0;///
int h11_c1=99; int m11_c1=0; int s11_c1=0;////
int h12_c1=99; int m12_c1=0; int s12_c1=0;////
int h13_c1=99; int m13_c1=0; int s13_c1=0;////
int h14_c1=99; int m14_c1=0; int s14_c1=0;////
int h15_c1=99; int m15_c1=0; int s15_c1=0;////
int h16_c1=99; int m16_c1=0; int s16_c1=0;////
///////////////////////////////////////////////
int diaSemana;
int segundo;
int minuto;
int hora;
int hum;
int temp;
int SENSOR=10;
DHT dht(SENSOR, DHT22);
char tecla=' ';
int contador = 1;
const byte FILAS = 4;
const byte COLS = 4;
char teclas[FILAS][COLS]=
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinFilas[FILAS] ={2,3,4,5};
byte pinCols[COLS]={6,7,8,9};
Keypad Teclado = Keypad( makeKeymap(teclas), pinFilas, pinCols, FILAS, COLS );
void intro();
int dia_de_semana();
void setup() {
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
lcd.init();
lcd.backlight();
pinMode(13,OUTPUT);
intro();
dht.begin();
Serial.begin(9600);
}
void intro()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bienvenido usuario");
lcd.setCursor(0,1);
lcd.print(" Menu");
delay(4000);
lcd.clear();
}
void MenuFecha()
{
diaSemana= dia_de_semana();
DateTime now = RTC.now();
lcd.setCursor(0,0);
lcd.print("D:");
lcd.print(now.year(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.day(), DEC);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("T:");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
lcd.print(" ");
}
void AccionFecha()
{
if(tecla=='0')contador=1;
}
void Menu1()
{
lcd.setCursor(0,0);
lcd.print("FECH>1 ");
lcd.setCursor(9,0);
lcd.print("ProHS>2");
lcd.setCursor(0,1);
lcd.print("Aut >3 ");
lcd.setCursor(9,1);
lcd.print("MAS>* ");
}
void Menu2()
{
lcd.setCursor(0,0);
lcd.print("LUZ >1 ");
lcd.setCursor(8,0);
lcd.print("HUMTEM>2");
lcd.setCursor(0,1);
lcd.print("SUEL>3 ");
lcd.setCursor(8,1);
lcd.print("MENU ># ");
}
void Menu3(){
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval2) {
previousMillis = currentMillis; // Actualizar el tiempo previo
// Realizar tarea 1 aquí
lcd.setCursor(0,0);
lcd.print("LUZ : ");
lcd.setCursor(5,0);
lcd.print(analogRead(A0));
lcd.setCursor(0,1);
lcd.print("MENU># ATRAS>0");
}
}
void Menu4()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval1) {
previousMillis = currentMillis; // Actualizar el tiempo previo
// Realizar tarea 1 aquí
lcd.setCursor(0,0);
lcd.print("HUM: ");
lcd.setCursor(5,0);
lcd.print(hum);
lcd.print("%");
lcd.setCursor(9,0);
lcd.print("TEMP");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("MENU># ATRAS>0");
}
}
void Menu5()
{
suelo= analogRead(A1);
suelo2= analogRead(A2);
HUMSUELO= map(suelo, 1023, 0, 0, 100);
HUMSUELO2= map(suelo2, 1023, 0, 0, 100);
promHumSuelo=(HUMSUELO + HUMSUELO2)/2;
if(HUMSUELO<0)HUMSUELO=0;
lcd.setCursor(0,0);
lcd.print("HUMSUEL: ");
lcd.setCursor(8,0);
lcd.print(promHumSuelo);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("MENU># ATRAS>0");
delay(500);
}
void limpia(){
lcd.setCursor(0,0);
lcd.print("HSmin: ");
lcd.setCursor(0,1);
//HSMinAct=EEPROM.read(0);
lcd.print("HSMinAct: ");
lcd.setCursor(6,0);
if(tecla=='A')contador=1;
}
void Accion1()
{
if(tecla=='1')contador=6;
if(tecla=='3')contador=8;
if(tecla=='*')contador=2;
if(tecla=='2')contador=7;
}
void Accion2(){
if(tecla=='1')contador=3;
if(tecla=='2')contador=4;
if(tecla=='#')contador=1;
if(tecla=='3')contador=5;
}
void Accion3 ()
{
if(tecla=='#') contador=1;
if(tecla=='0') contador=2;
}
void Accion4()
{
if(tecla=='#') contador=1;
if(tecla=='0') contador=2;
}
void MenuAut()
{
lcd.setCursor(0,0);
lcd.print("Modo Aut activo ");
delay(100);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("MENU># DESACT>0");
}
void automatico()
{
Serial.println(promHumSuelo);
if(promHumSuelo < EEPROM.read(0))
{digitalWrite(13,1);}
else{digitalWrite(13,0);}
if(tecla=='#') contador=1;
if(tecla=='0'){ contador=1;
digitalWrite(13,0);}
}
int dia_de_semana(){
// Encuentar el dia de la semana de una fecha
int n_dia;
int r_dia;
int n_mes;
int t_mes;
int n_anno;
int d_anno;
int t_siglo=6;
DateTime now = RTC.now(); //fecha y hora del RTC
lcd.setCursor(13,1);
n_anno=(now.year()-2000);
d_anno=n_anno/4;
n_dia=now.day();
n_mes=now.month();
switch (n_mes) {
case 1:
t_mes=0;
break;
case 2:
t_mes=3;
break;
case 3:
t_mes=3;
break;
case 4:
t_mes=6;
break;
case 5:
t_mes=1;
break;
case 6:
t_mes=4;
break;
case 7:
t_mes=6;
break;
case 8:
t_mes=2;
break;
case 9:
t_mes=5;
break;
case 10:
t_mes=0;
break;
case 11:
t_mes=3;
break;
case 12:
t_mes=5;
break;
default:
t_mes=t_mes;
break;
}
r_dia=n_dia+t_mes+n_anno+d_anno+t_siglo;
r_dia = r_dia % 7;
switch (r_dia) {
case 1:
lcd.print("Lun");
Serial.print(" Lun ");
break;
case 2:
lcd.print("Mar");
Serial.println(" Mar ");
break;
case 3:
lcd.print("Mie");
Serial.print(" Mie ");
break;
case 4:
lcd.print("Jue");
Serial.print(" Jue ");
break;
case 5:
lcd.print("Vie");
Serial.print(" Vie ");
break;
case 6:
lcd.print("Sab");
Serial.print(" Sab ");
break;
case 0:
lcd.print("Dom");
Serial.print(" Dom ");
break;
default:
lcd.print("---");
Serial.print(" ---");
break;
}
return r_dia;
}
void activar_timbre(){
digitalWrite(rele, HIGH);
digitalWrite(13,HIGH);
lcd.setCursor(0,0);
lcd.print("sistema ON ");
Serial.println("sistema Activo");
delay(10000);
digitalWrite(rele, LOW);
digitalWrite(13,LOW);
}
void horario_1(){
// lcd.setCursor(13,0);
// lcd.print("1");
// Serial.print("Horario_1 ");
if ((hora==h1_c1) && (minuto==m1_c1) && (segundo==s1_c1)) activar_timbre();
if ((hora==h2_c1) && (minuto==m2_c1) && (segundo==s2_c1)) activar_timbre();
if ((hora==h3_c1) && (minuto==m3_c1) && (segundo==s3_c1)) activar_timbre();
if ((hora==h4_c1) && (minuto==m4_c1) && (segundo==s4_c1)) activar_timbre();
if ((hora==h5_c1) && (minuto==m5_c1) && (segundo==s5_c1)) activar_timbre();
if ((hora==h6_c1) && (minuto==m6_c1) && (segundo==s6_c1)) activar_timbre();
if ((hora==h7_c1) && (minuto==m7_c1) && (segundo==s7_c1)) activar_timbre();
if ((hora==h8_c1) && (minuto==m8_c1) && (segundo==s8_c1)) activar_timbre();
if ((hora==h9_c1) && (minuto==m9_c1) && (segundo==s9_c1)) activar_timbre();
if ((hora==h10_c1) && (minuto==m10_c1) && (segundo==s10_c1)) activar_timbre();
if ((hora==h11_c1) && (minuto==m11_c1) && (segundo==s11_c1)) activar_timbre();
if ((hora==h12_c1) && (minuto==m12_c1) && (segundo==s12_c1)) activar_timbre();
if ((hora==h13_c1) && (minuto==m13_c1) && (segundo==s13_c1)) activar_timbre();
if ((hora==h14_c1) && (minuto==m14_c1) && (segundo==s14_c1)) activar_timbre();
if ((hora==h15_c1) && (minuto==m15_c1) && (segundo==s15_c1)) activar_timbre();
if ((hora==h16_c1) && (minuto==m16_c1) && (segundo==s16_c1)) activar_timbre();
}
void GuardarDatos()
{
unsigned long currentMillis = millis();
tecla=Teclado.getKey();
lcd.setCursor(9,1);
lcd.print(EEPROM.read(0));
lcd.setCursor(8,0);
if(tecla)
{
if(isDigit(tecla)){
CLAVE[INDICE]=tecla;
if (currentMillis - previousMillis >= 4000) {
previousMillis = currentMillis; // Actualizar el tiempo previo
lcd.print(atoi(CLAVE));
// Realizar tarea 1 aquí
}
INDICE++;
}
else{if(tecla=='#'|| tecla=='*')
{
if(tecla=='#')
{
test= atoi(CLAVE);
// Serial.print(test);
EEPROM.write(0,test);
if(INDICE>=1){
CLAVE[0]=0;
CLAVE[1]=0;
INDICE=0;
}
}
if(tecla==('*')){
Serial.print("Memoria");
Serial.print(EEPROM.read(0));
Serial.print("Valor del test");
Serial.print(test);
INDICE=0;
limpia();
}
}else{
lcd.setCursor(0,0);
lcd.print("no num");
delay(1000);
limpia();
}
}
}
}
void loop() {
unsigned long currentMillis = millis();
DateTime now= RTC.now();
//Serial.println("Temperatura");
temp= dht.readTemperature();
//Serial.println(temp);
hum= dht.readHumidity();
//Serial.println("Humedad");
suelo= analogRead(A1);
suelo2= analogRead(A2);
HUMSUELO= map(suelo, 1023, 0, 0, 100);
HUMSUELO2= map(suelo2, 1023, 0, 0, 100);
promHumSuelo=(HUMSUELO+HUMSUELO2)/2;
hora= now.hour();
minuto=now.minute();
segundo=now.second();
//Serial.println(hum);
//delay(200);
horario_1();
tecla= Teclado.getKey();
if(tecla){
// lcd.clear();
// delay(100);
}
if(contador==4){Menu4();Accion4();}
if(contador==3){Menu3();Accion3();}
if(contador==2){Menu2();Accion2();}
if(contador==1){Menu1();Accion1();}
if(contador==5){Menu5();Accion4();}
if(contador==6){MenuFecha();AccionFecha(); }
if(contador==7){limpia();GuardarDatos();}
if(contador==8){MenuAut();automatico();}
}