// (o\---/o)
// ( , , )
// ___,--.(_(Y)_),--.____
//| "--" "--" |
//| Don't Worry Be Happy |
//| HECTOR E. VILLARREAL |
//| 2023 |
//|______________________|
// ) | (
// (___,'.___)
//Contro Riego 2 zonas ver 1.02 08-02-2024
//---------------------------------------------------------------------------------------------------
//Librerias
//--------------------------------------------------------------
#include <LiquidCrystal.h>
#include <EEPROM.h> //Librería de EEPROM
#include <Arduino.h>
#include <Wire.h>
#include <RTClib.h>
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
//Set LCD 2x16
LiquidCrystal lcd(3, 4, A3, A2, A1, A0); // Corresponde a (RS, EN, D4, D5, D6, D7)
//RTC INI
RTC_DS1307 RTC; // inicializa el modulo RTC
//BOTONES
int BTN_MENU = 12; // Boton SET MENU
int BTN_PLUS = 11; // Boton +
int BTN_MINUS = 10; // Boton -
int BTN_MAN = 9; // Boton RIEGO MANUAL
int BTN_AUT = 7; // Boton RIEGO AUTOMATICO
int BTN_RESET = 2; // Boton RESET
//EEPROM 24C256
#define EEPROM_SIZE 512
//#define EEPROM_ADDRESS 0x50
const byte EEPROM_ADDR = 0x50; // I2C address for 24LC128 EEPROM
char inputBuffer[100]; // Increased buffer size to accommodate data
int inputIndex = 0;
//RELAYS
int RUN_RELAY = 8; //Relay Bomba
int ZONE1_RELAY = 6; //Relay zona 1
int ZONE2_RELAY = 13; //Relay zona 2
//VARIABLES
int r_diaSemana; // almacena el resultado del dia de la semana calculad
int segundo; int minuto; int hora; int anio; int mes; int dia;
//int horaAuto, int minutoAuto;
int menu = 0;
int menuAuto = 0;
int tiempo1; int tiempo2; int second1; int second2;
int tiempoA1; int tiempoA2; int secondA1; int secondA2;
int horaAuto1; int horaAuto2; int minuteAuto1; int minuteAuto2;
String name;
const int r = 300;
//Estructura de hora
struct Horario {
int hora; int minuto; int segundo;
bool esLargo;
String nombre;
};
//unsigned long startTime = 0; // Variable para almacenar el tiempo de inicio
//unsigned long duration = 0; // Variable para almacenar la duración del temporizador
//unsigned long setTime = 0; // Variable para configurar el temporizador
//bool countdownStarted = false; // Variable para verificar si se ha iniciado el conteo regresivo
//bool timeConfigured = false; // Variable para verificar si se ha configurado el tiempo
bool zona1Activada = false; // Variable para almacenar si la zona esta activada
bool zona2Activada = false; // Variable para almacenar si la zona esta activada
unsigned long previousMillis = 0; // Almacena el tiempo del último ciclo
const long interval = 100; // Intervalo de 1 segundo
int noConf = 0;
int numberOfZones = 4;
//int tiempo[6];
int i;
//------------------------------------------------------------------------------------------------------
//INICIALIZACION y CONFIGURACION del sistema
//------------------------------------------------------------------------------------------------------
void setup(void) {
Serial.begin(115200); // start serial port
LCDIni(); //Mensaje de inicio
// Entradas
pinMode(BTN_MENU,INPUT);
pinMode(BTN_PLUS,INPUT);
pinMode(BTN_MINUS,INPUT);
pinMode(BTN_RESET,INPUT);
pinMode(BTN_MAN,INPUT);
pinMode(BTN_AUT,INPUT);
//Salidas
pinMode(RUN_RELAY,OUTPUT);
pinMode(ZONE1_RELAY,OUTPUT);
pinMode(ZONE2_RELAY,OUTPUT);
// Me aseguro que estén en bajo
digitalWrite(RUN_RELAY, LOW);
digitalWrite(ZONE1_RELAY, LOW);
digitalWrite(ZONE2_RELAY, LOW);
RTC.begin(); // start sRTC modulo
RTCError(); //Mensaje de error de RTC
}
//-----------------------------------------------------------------------------------------------
//Programa a ejecutar LOOP
//-----------------------------------------------------------------------------------------------
void loop(void) {
RTCError();
DateTime now = RTC.now(); //fecha y hora del RTC
switch(menu) {
case 0:
DisplayDateTime();
break;
case 1:
DisplaySetHour();
break;
case 2:
DisplaySetMinute();
break;
case 3:
DisplaySetYear();
break;
case 4:
DisplaySetMonth();
break;
case 5:
DisplaySetDay();
break;
case 6:
StoreAgg();
menu = 0;
break;
case 7:
setRiegoMan1();
break;
case 8:
setRiegoMan2();
break;
case 9:
riegoManual();
break;
case 10:
riegoMan1();
break;
case 11:
riegoMan2();
break;
case 12:
SetHourAUT1();
break;
case 14:
setAutoMan();
break;
}
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.println();
segundo=now.second();
minuto=now.minute();
hora=now.hour();
int r_diaSemana = dia_de_semana();
}
//-----------------------------------------------------------------------------------------------
//FUNCIONES A USAR
//--------------------------------------------------------------
// función de mensaje inicio
//--------------------------------------------------------------
void LCDIni() { // función de mensaje inicio
lcd.begin(16, 2); // Tipo de LCD
lcd.setCursor(4, 0);
lcd.print("Welcome!");
Serial.print("Garden Controller - 2 zonas");
delay(1000);
lcd.setCursor(0, 2);
String message = "Garden Control 2";
for (byte i = 0; i < message.length(); i++) {
lcd.print(message[i]);
delay(100);
}
delay(3000);
lcd.clear();
}
//--------------------------------------------------------------
// función de mensaje error de RTC
//--------------------------------------------------------------
void RTCError() { // función de mensaje error de RTC
if (! RTC.begin()){
Serial.println ("Modulo RTC no encontrado!");
lcd.begin(16, 2); // Tipo de LCD
lcd.setCursor(4, 0);
lcd.print("RTC Bad!");
lcd.setCursor (0,1);
lcd.print("Replace battery");
while (1);
}
}
//--------------------------------------------------------------
// Función que encuentra el día de la semana de una fecha
//--------------------------------------------------------------
int dia_de_semana() { // Encuentra 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
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.setCursor(13,0);
lcd.print("DOM");
break;
case 2:
lcd.setCursor(13,0);
lcd.print("LUN");
break;
case 3:
lcd.setCursor(13,0);
lcd.print("MAR");
break;
case 4:
lcd.setCursor(13,0);
lcd.print("MIE");
break;
case 5:
lcd.setCursor(13,0);
lcd.print("JUE");
break;
case 6:
lcd.setCursor(13,0);
lcd.print("VIE");
break;
case 0:
lcd.setCursor(13,0);
lcd.print("SAB");
break;
default:
lcd.setCursor(13,0);
lcd.print("---");
break;
}
return r_dia;
}
//--------------------------------------------------------------
// Función de DisplayDateTime CASE 0
//--------------------------------------------------------------
void DisplayDateTime () { // Función de DisplayDateTime
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
digitalWrite(RUN_RELAY, LOW); // Apagar el Pin bomba
digitalWrite(ZONE1_RELAY, LOW); // Apagar el Pin riego 1
digitalWrite(ZONE2_RELAY, LOW); // Apagar el Pin riego 2
if(digitalRead(BTN_AUT)){ // Menu de riego Automático
menu=12;
delay(100);
}
if(digitalRead(BTN_MAN)){ // Menu de riego Manual
menu=7;
delay(100);
}
if(digitalRead(BTN_RESET)){ // MODO Automático / Manual
menu=14;
delay(100);
}
lcd.setCursor(0, 1);
lcd.print("");
if(digitalRead(BTN_MENU)){
menu=1;
delay(100);
}
lcd.setCursor(0, 1);
lcd.print("");
if (now.hour()<=9){
lcd.print("0");
}
lcd.print(now.hour(), DEC);
hora=now.hour();
lcd.print(":");
if (now.minute()<=9){
lcd.print("0");
}
lcd.print(now.minute(), DEC);
minuto=now.minute();
lcd.print(":");
if(digitalRead(BTN_MENU)){
menu=1;
delay(100);
}
if (now.second()<=9){
lcd.print("0");
}
lcd.print(now.second(), DEC);
lcd.setCursor(0, 0);
lcd.print("");
if (now.day()<=9){
lcd.print("0");
}
lcd.print(now.day(), DEC);
dia=now.day();
lcd.print("/");
if(digitalRead(BTN_MENU)){
menu=1;
delay(r);
}
if (now.month()<=9){
lcd.print("0");
}
lcd.print(now.month(), DEC);
mes=now.month();
lcd.print("/");
lcd.print(now.year() - 2000, DEC);
anio=now.year();
if(digitalRead(BTN_MENU)){
menu=1;
delay(r);
}
}
//--------------------------------------------------------------
// Función de DisplaySetHour CASE 1
//--------------------------------------------------------------
void DisplaySetHour() { // Función de DisplaySetHour
// time setting
lcd.clear();
DateTime now = RTC.now();
lcd.setCursor(0,0);
lcd.print("Set Hora:");
lcd.setCursor(0,1);
lcd.print(hora,DEC);
while(!digitalRead(BTN_MENU)){
if(digitalRead(BTN_PLUS)==HIGH){
if(hora==23){
hora=0;
}else{
hora=hora+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if(hora==0){
hora=23;
}else{
hora=hora-1;
}
delay(r);
}
DateTime now = RTC.now();
lcd.setCursor(0,0);
lcd.print("Set Hora:");
lcd.setCursor(0,1);
lcd.print(hora,DEC);
lcd.print(" ");
}
menu=2;
delay(r);
}
//---------------------------------------------------------------
// Función de DisplaySetMinute CASE 2
//--------------------------------------------------------------
void DisplaySetMinute() { // Función de DisplaySetMinute
// Setting the minutes
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Minutos:");
lcd.setCursor(0,1);
lcd.print(minuto,DEC);
while(!digitalRead(BTN_MENU)){
if(digitalRead(BTN_PLUS)==HIGH){
if (minuto==59){
minuto=0;
}else{
minuto=minuto+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (minuto==0){
minuto=59;
}else{
minuto=minuto-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Set Minutos:");
lcd.setCursor(0,1);
lcd.print(minuto,DEC);
lcd.print(" ");
}
menu=3;
delay(r);
}
//---------------------------------------------------------------
// Función de DisplaySetYear CASE 3
//--------------------------------------------------------------
void DisplaySetYear() { // Función de DisplaySetYear
// setting the year
lcd.clear();
lcd.setCursor(0,0);
char esp = 0xEE;
lcd.print("Set A");
lcd.print(esp);
lcd.print("o:");
lcd.setCursor(0,1);
lcd.print(anio,DEC);
delay(r);
while(!digitalRead(BTN_MENU)){
if(digitalRead(BTN_PLUS)==HIGH){
anio=anio+1;
}
if(digitalRead(BTN_MINUS)==HIGH){
anio=anio-1;
}
delay(r);
lcd.setCursor(0,0);
char esp = 0xEE;
lcd.print("Set A");
lcd.print(esp);
lcd.print("o:");
lcd.setCursor(0,1);
lcd.print(anio,DEC);
lcd.print(" ");
}
menu=4;
delay(r);
}
//---------------------------------------------------------------
// Función de DisplaySetMonth CASE 4
//--------------------------------------------------------------
void DisplaySetMonth() { // Función de DisplaySetMonth
// Setting the month
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set Mes:");
lcd.setCursor(0,1);
lcd.print(mes,DEC);
while(!digitalRead(BTN_MENU)){
if(digitalRead(BTN_PLUS)==HIGH){
if (mes==12){
mes=1;
}else{
mes=mes+1;
}
}
if(digitalRead(BTN_MINUS)==HIGH){
if (mes==1){
mes=12;
}else{
mes=mes-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Mes:");
lcd.setCursor(0,1);
lcd.print(mes,DEC);
lcd.print(" ");
delay(r);
}
menu=5;
delay(r);
}
//---------------------------------------------------------------
// Función de DisplaySetDay CASE 5
//--------------------------------------------------------------
void DisplaySetDay() { // Función de DisplaySetDay
// Setting the day
lcd.clear();
delay(100);
while(!digitalRead(BTN_MENU)){
if(digitalRead(BTN_PLUS)==HIGH){
if (dia==31){
dia=1;
}else{
dia=dia+1;
}
}
if(digitalRead(BTN_MINUS)==HIGH){
if (dia==1){
dia=31;
}else{
dia=dia-1;
}
}
lcd.setCursor(0,0);
lcd.print("Set Dia:");
lcd.setCursor(0,1);
lcd.print(dia,DEC);
lcd.print(" ");
delay(r);
}
menu=6;
delay(r);
}
//---------------------------------------------------------------
// Función de Almecenamiento de datos en RTC CASE 6
//--------------------------------------------------------------
void StoreAgg() { // Función de Almecenamiento de datos en RTC
// Variables saving
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardando");
lcd.setCursor(0,1);
lcd.print("Configuracion");
RTC.adjust(DateTime(anio,mes,dia,hora,minuto,0));
delay(3000);
lcd.clear();
}
//---------------------------------------------------------------
// Función SET tiempo de riego Zona 1 CASE 7
//--------------------------------------------------------------
void setRiegoMan1() { // Setting the minutes
tiempo1 = 0;
lcd.clear();
lcd.print("SET MANUAL");
delay(2000);
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempo1,DEC);
lcd.setCursor(10,1);
lcd.print("ZONA 1");
while(!digitalRead(BTN_MAN)){
if(digitalRead(BTN_PLUS)==HIGH){
if (tiempo1==10){
tiempo1=0;
}else{
tiempo1=tiempo1+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (tiempo1==0){
tiempo1=10;
}else{
tiempo1=tiempo1-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempo1,DEC);
lcd.print(" ");
}
menu=8;
delay(r);
}
//---------------------------------------------------------------
// Función SET tiempo de riego Zona 2 CASE 8
//--------------------------------------------------------------
void setRiegoMan2() { // Setting the minutes
tiempo2 = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempo2);
lcd.setCursor(10,1);
lcd.print("ZONA 2");
while(!digitalRead(BTN_MAN)){
if(digitalRead(BTN_PLUS)==HIGH){
if (tiempo2==10){
tiempo2=0;
}else{
tiempo2=tiempo2+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (tiempo2==0){
tiempo2=10;
}else{
tiempo2=tiempo2-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempo2);
lcd.print(" ");
}
menu=9;
delay(r);
}
//---------------------------------------------------------------
// función de riego MANUAL CASE 9
//--------------------------------------------------------------
void riegoManual() {
if (tiempo1 == 0 && tiempo2 ==0) {
noConf = 0;
noConfig();
delay (2000);
lcd.clear();
menu=0;
}
else{
lcd.clear();
menu=10;
}
}
//---------------------------------------------------------------
// función de Display en caso de no configurado
//--------------------------------------------------------------
void noConfig() {
lcd.clear();
lcd.setCursor(0,0);
if (noConf==0){
lcd.print("Config MAN Min:");
}
if (noConf==1){
lcd.print("Config AUTO Min:");
}
lcd.setCursor(0,1);
lcd.print("No Configurado");
}
//---------------------------------------------------------------
// función de riego MANUAL Zona 1 CASE 10
//--------------------------------------------------------------
void riegoMan1() {
if (tiempo1 == 0 && tiempo2 !=0) {
lcd.clear();
menu=11;
}
else{
lcd.clear();
int tiempos1 = tiempo1 *60;
int minute1 = (tiempo1 % 60)-1;
int second1 = 60;
while(!digitalRead(BTN_RESET)){
unsigned long currentMillis = millis(); // Obtener el tiempo actual
digitalWrite(RUN_RELAY, HIGH); // Inicio el Pin bomba
digitalWrite(ZONE1_RELAY, HIGH); // AInicio el Pin riego 2
lcd.setCursor(0,0);
lcd.print("Regando Manual");
lcd.setCursor(0,1);
lcd.print(minute1);
lcd.print(":");
if (second1 < 10) { // Si el contador llega a cero
lcd.print("0");
}
lcd.print(second1);
lcd.setCursor(10,1);
lcd.print("ZONA 1");
if (currentMillis - previousMillis >= interval) { // Si ha pasado 1 segundo
previousMillis = currentMillis; // Actualizar el tiempo del último ciclo
tiempos1--; // Decrementar el contador
second1--; // Decrementar el contador de segundos
if (second1 == 0) { // Si el contador llega a cero
minute1= minute1- 1;
second1 = 60;
}
if (tiempos1 == 0) { // Si el contador llega a cero
break;
}
}
lcd.setCursor(0,0);
lcd.print("Regando Manual");
lcd.setCursor(0,1);
lcd.print(minute1);
lcd.print(":");
if (second1 < 10) { // Si el contador llega a cero
lcd.print("0");
}
lcd.print(second1);
lcd.setCursor(10,1);
lcd.print("ZONA 1");
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Riego Manual");
if (tiempos1 == 0) { // Si el contador llega a cero
if (tiempo2 != 0) { // Si tiempo2 distinto de cero sigue al riego zona 2
digitalWrite(RUN_RELAY, LOW); // Apagar el Pin bomba
digitalWrite(ZONE1_RELAY, LOW); // Apagar el Pin riego 2
lcd.clear();
menu=11;
}
else{
lcd.setCursor(0,1);
lcd.print("Finalizado");
digitalWrite(RUN_RELAY, LOW); // Apagar el Pin bomba
digitalWrite(ZONE1_RELAY, LOW); // Apagar el Pin riego 2
delay (2000);
lcd.clear();
menu=0;
delay(r);
}
}
else{
lcd.setCursor(0,1);
lcd.print("Cancelado");
digitalWrite(RUN_RELAY, LOW); // Apagar el Pin bomba
digitalWrite(ZONE1_RELAY, LOW); // Apagar el Pin riego 2
delay (2000);
lcd.clear();
menu=0;
}
}
}
//---------------------------------------------------------------
// función de riego MANUAL Zona 2 CASE 11
//--------------------------------------------------------------
void riegoMan2() {
lcd.clear();
int tiempos2 = tiempo2 *60;
int minute2 = (tiempo2 % 60)-1;
int second2 = 60;
while(!digitalRead(BTN_RESET)){
unsigned long currentMillis = millis(); // Obtener el tiempo actual
digitalWrite(RUN_RELAY, HIGH); // Inicio el Pin bomba
digitalWrite(ZONE2_RELAY, HIGH); // AInicio el Pin riego 2
lcd.setCursor(0,0);
lcd.print("Regando Manual");
lcd.setCursor(0,1);
lcd.print(minute2);
lcd.print(":");
if (second2 < 10) { // Si el contador llega a cero
lcd.print("0");
}
lcd.print(second2);
lcd.setCursor(10,1);
lcd.print("ZONA 2");
if (currentMillis - previousMillis >= interval) { // Si ha pasado 1 segundo
previousMillis = currentMillis; // Actualizar el tiempo del último ciclo
tiempos2--; // Decrementar el contador
second2--; // Decrementar el contador de segundos
if (second2 == 0) { // Si el contador llega a cero
minute2= minute2- 1;
second2 = 60;
}
if (tiempos2 == 0) { // Si el contador llega a cero
break;
}
}
lcd.setCursor(0,0);
lcd.print("Regando Manual");
lcd.setCursor(0,1);
lcd.print(minute2);
lcd.print(":");
if (second2 < 10) { // Si el contador llega a cero
lcd.print("0");
}
lcd.print(second2);
lcd.setCursor(10,1);
lcd.print("ZONA 2");
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Riego Manual");
if (tiempos2 == 0) { // Si el contador llega a cero
lcd.setCursor(0,1);
lcd.print("Finalizado");
}
else{
lcd.setCursor(0,1);
lcd.print("Cancelado");
}
digitalWrite(RUN_RELAY, LOW); // Apagar el Pin bomba
digitalWrite(ZONE2_RELAY, LOW); // Apagar el Pin riego 2
delay (2000);
lcd.clear();
menu=0;
}
//--------------------------------------------------------------
// Función de SetHour AUTOMATICO Zona 1 CASE 12
//--------------------------------------------------------------
void SetHourAUT1() { // Función de SetHour Automática
lcd.clear();
DateTime now = RTC.now();
horaAuto1=now.hour();
minuteAuto1=now.minute();
lcd.print("SET AUTOMATICO");
delay(2000);
lcd.setCursor(0,0);
lcd.print("Set Hora AUTO:");
if (horaAuto1<=9){
lcd.print("0");
}
lcd.setCursor(0,1);
lcd.print(horaAuto1, DEC);
lcd.print(":");
if (minuteAuto1<=9){
lcd.print("0");
}
lcd.setCursor(3,1);
lcd.print(minuteAuto1, DEC);
lcd.setCursor(10,1);
lcd.print("ZONA 1");
// Set Hora //
while(!digitalRead(BTN_AUT)){
if(digitalRead(BTN_PLUS)==HIGH){
if(horaAuto1==23){
horaAuto1=0;
}else{
horaAuto1=horaAuto1+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if(horaAuto1==0){
horaAuto1=23;
}else{
horaAuto1=horaAuto1-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Set Hora AUTO:");
lcd.setCursor(0,1);
if (horaAuto1<=9){
lcd.print("0");
}
lcd.print(horaAuto1,DEC);
lcd.print(":");
lcd.setCursor(3,1);
if (minuteAuto1<=9){
lcd.print("0");
}
lcd.print(minuteAuto1,DEC);
}
delay(300);
// Set Minutos //
lcd.setCursor(0,0);
lcd.print("Set Min AUTO:");
while(!digitalRead(BTN_AUT)){
if(digitalRead(BTN_PLUS)==HIGH){
if (minuteAuto1==59){
minuteAuto1=0;
}else{
minuteAuto1=minuteAuto1+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (minuteAuto1==0){
minuteAuto1=59;
}else{
minuteAuto1=minuteAuto1-1;
}
delay(r);
}
lcd.setCursor(3,1);
if (minuteAuto1<=9){
lcd.print("0");
}
lcd.print(minuteAuto1,DEC);
}
delay(300);
lcd.clear();
delay(r);
menu=0;
}
void setAutoMan() {
lcd.setCursor(12,1);
lcd.print("AUTO");
}
/**
//---------------------------------------------------------------
// función de riego ZONA 1 Minutos SET AUTOMATICO CASE 12
//--------------------------------------------------------------
void setRiegoAuto11() {
// Setting the minutes
tiempoA1 = 0;
secondA1 = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempoA1,DEC);
lcd.setCursor(10,1);
lcd.print("ZONA 1");
while(!digitalRead(BTN_AUT)){
if(digitalRead(BTN_PLUS)==HIGH){
if (tiempoA1==10){
tiempoA1=0;
}else{
tiempoA1=tiempoA1+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (tiempoA1==0){
tiempoA1=10;
}else{
tiempoA1=tiempoA1-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempoA1,DEC);
lcd.print(" ");
}
if (tiempoA1 != 0) { // Si hay tiempo de riego
zona1Activada = true;
}
delay(300);
menu=13;
}
//---------------------------------------------------------------
// función de riego ZONA 2 Minutos SET AUTOMATICO CASE 13
//--------------------------------------------------------------
void setRiegoAuto2() {
// Setting the minutes
tiempoA2 = 0;
secondA2 = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempoA2,DEC);
lcd.setCursor(10,1);
lcd.print("ZONA 2");
while(!digitalRead(BTN_AUT)){
if(digitalRead(BTN_PLUS)==HIGH){
if (tiempoA2==10){
tiempoA2=0;
}else{
tiempoA2=tiempoA2+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (tiempoA2==0){
tiempoA2=10;
}else{
tiempoA2=tiempoA2-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("Tiempo de riego:");
lcd.setCursor(0,1);
lcd.print(tiempoA2,DEC);
lcd.print(" ");
}
if (tiempoA2 != 0) { // Si hay tiempo de riego
zona2Activada = true;
}
delay(1000);
lcd.clear();
menu=0;
}
if (tiempoA1 == 0 && tiempoA2 ==0) {
noConf = 1;
noConfig();
delay (3000);
lcd.clear();
menu=12;
delay(r);
}else{
menu=11;
delay(r);
}
//---------------------------------------------------------------
// función de riego ZONA 1 Día SET AUTOMATICO CASE 11
//--------------------------------------------------------------
void riegoAuto2() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("D L Ma Mi J V S");
lcd.setCursor(0,1);
lcd.print("Config");
lcd.setCursor(10,1);
lcd.print("ZONA 1");
while(!digitalRead(BTN_AUT)){
if(digitalRead(BTN_PLUS)==HIGH){
if (tiempo1==10){
tiempo1=0;
}else{
tiempo1=tiempo1+1;
}
delay(r);
}
if(digitalRead(BTN_MINUS)==HIGH){
if (tiempo1==0){
tiempo1=10;
}else{
tiempo1=tiempo1-1;
}
delay(r);
}
lcd.setCursor(0,0);
lcd.print("D L Ma Mi J V S");
lcd.setCursor(0,1);
lcd.print("Config");
lcd.setCursor(10,1);
lcd.print("ZONA 1");
}
menu=0;
delay(r);
} **/
/**
//---------------------------------------------------------------
// Función de Almecenamiento de datos en EEprom CASE
//--------------------------------------------------------------
void StoreEPROM() { // Función de Almecenamiento de datos en RTC
// Variables saving
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Guardando");
lcd.setCursor(0,1);
lcd.print("Configuracion");
RTC.adjust(DateTime(anio,mes,dia,hora,minuto,0));
delay(3000);
lcd.clear();
}
void viewSavedData() {
int eepromAddress = 0;
char buffer[EEPROM_SIZE];
int bytesRead = 0;
Serial.print("Data read from EEPROM: \n");
while (true) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(eepromAddress >> 8);
Wire.write(eepromAddress & 0xFF);
Wire.endTransmission(false);
Wire.requestFrom(EEPROM_ADDRESS, 1);
if (Wire.available()) {
char data = Wire.read();
buffer[bytesRead] = data;
bytesRead++;
if (data == '\0' || bytesRead >= EEPROM_SIZE) {
// Print the current entry and move to the next line
buffer[bytesRead] = '\0';
Serial.println(buffer);
if (data == '\0') {
break; // Reached the end of EEPROM
}
bytesRead = 0; // Reset for the next entry
}
} else {
break;
}
eepromAddress++;
}
delay(1000);
}
void saveToEEPROM() {
String dataToStore = "Rs." + String(inputBuffer) + " - " + volume +"litre" + "-" + dateTimeStr + "\n";
int eepromAddress = 0;
// Find the first available EEPROM address
while (eepromAddress < EEPROM_SIZE) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(eepromAddress >> 8);
Wire.write(eepromAddress & 0xFF);
Wire.endTransmission(false);
Wire.requestFrom(EEPROM_ADDRESS, 1);
if (Wire.available()) {
char data = Wire.read();
if (data == '\0') {
break; // Found an empty slot
}
} else {
break;
}
eepromAddress++;
}
if (eepromAddress < EEPROM_SIZE) {
// Write each byte of the string to EEPROM
for (int i = 0; i < dataToStore.length(); i++) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write(eepromAddress >> 8);
Wire.write(eepromAddress & 0xFF);
Wire.write(dataToStore[i]);
Wire.endTransmission();
delay(5);
eepromAddress++;
if (eepromAddress >= EEPROM_SIZE) {
Serial.println("Error: EEPROM memory full");
delay(1000000000);
break;
}
}
Serial.println("Data saved to EEPROM: " + dataToStore);
delay(1000);
} else {
Serial.println("Error: EEPROM memory full");
}
}
//---------------------------------------------------------------
//FIN PROGRAMA
//---------------------------------------------------------------
//if ((hora==h1_c1) && (minuto==m1_c1) && (segundo==s1_c1)) activar_zona1();
//if ((hora==h2_c1) && (minuto==m2_c1) && (segundo==s2_c1)) activar_zona2();
if (key == 'D') {
inputBuffer[inputIndex] = '\0'; // Null-terminate the string
saveToEEPROM(inputBuffer);
inputIndex = 0; // Reset the input index
code = 0;
}
// Variable para especificar "Que días de la semana se va a regar el patio"
//(0=domingo, 1=lunes, 2=martes,3=miercoles,4=jueves, 5=viernes,6=sabado)
int diasRiegoPatio[] = {0, 1, 3, 4 }; // ajustar esto según tus necesidades
//--- SESIONES POR DIAS ---
// hora y minuto que empieza a regar la Sesion 1 y si esta activada
bool sesion_1_activada = true;
int horaQueEmpieza_zona1 = 19;
int minutoQueEmpieza_zona1 = 30;
// hora y minuto que empieza a regar la Sesion 2 y si esta activada
bool sesion_2_activada = true;
int horaQueEmpieza_zona2 = 19;
int minutoQueEmpieza_zona2 = 36;
if ( (sesion_1_activada == true)
&& (fecha.hour() == horaQueEmpieza_zona1)
&& ((fecha.minute() >= (minutoQueEmpieza_zona1)){
}
void regarzona2(int horaQueEmpieza_zona2, int minutoQueEmpieza_zona2){
}
void regarzona1(int horaQueEmpieza_zona1, int minutoQueEmpieza_zona1){
}
**/