Modulo reloj fiable 24 horas.

Buenas tarde soy principiante en arduino y en el foro, estoy tratando de hacer un cambiador automático del agua del acuario.
Por mucho que intento no puedo encontrarle la vuelta si alguien me puede ayudar estare muy agradecido.
La idea es que al llegar un día y hora de la semana la alarma ponga en bajo un relé que alimenta una electro válvula hasta que un final de carrera mande un pulso y cambie el estado del relé a alto hasta acá donde cuelgo yo.
luego ese relé en reposo deja pasar corriente al relé de rellenado el que cortara con un final de carrera al estar lleno el acuario, hasta acá esta parte masomeno esta, lo que me faltaria es poner una información para cuando baje el nivel del agua por evaporación y se active el final de carrera tarde un tiempo en encender no se si pasado unos minutos(30) ejemplo o unas horas como se pueda.
Esa es la idea principal quizás el tiempo de llenado tenga que tener intervalos prendido y en reposo para que se enfríe la electro válvula ya que tardara horas en llenarse o cambiar a otra válvula que siga llenando.
Y por ultimo agregar una información que si no se cumpilo el programa x corte de luz inicie al arrancar arduino
se que pido mucho pero si no explico todo junto a un que vayamos por pasos alomejor los hago trabajar doble adjunto lo que pude lograr en muchas horas. no encuentro como subirlo resumido en una ventana

// RTC FECHA Y TEMPERATURA EL PROFE GARCÍA
// Fecha, Hora, Temperatura y dia de la semana
// con modulo DS3231, LCD 4x20 y Arduino Uno By:www.dinastiatecnologica.com
// Conexion i2C :Arduino UNO SCL-> A5 SDA->A4 VCC->5V GND->GND
// Conexion RTC :Arduino UNO GND->GND VCC->5V SCL-> SCL SDA->SDA los dos pines despues del ...12,13,GND,AREF,SDA,SCL

#include <Wire.h>
#include <Sodaq_DS3231.h>
#include <LiquidCrystal_I2C.h> //PARA LCD I2C
LiquidCrystal_I2C lcd(0x27,20,4); //PARA LCD I2C
bool alarma = true;
int PinBoton =4; // botón
int EstadoBoton =0; // nivel 0=bajo 1=alto o prendido
char DiaSemana[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab" };
// La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
// Ejemplo 2017 Julio 12,2:20:00 pm dia 1-Lunes (0=Dom, 1=Lun, 2=Mar, 3=Mie, 4=Jue, 5=Vie, 6=Sab)
DateTime dt(2020, 7, 25, 17, 49, 50, 0); //comentar en la segunda carga el ultimo dígito es el dia =0 Dom

void setup ()
{
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Modulo RTC no encontrado !");
while (1);
}
Wire.begin();
rtc.begin();
// La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
rtc.setDateTime(dt); //comentar en la segunda carga

lcd.init(); //INICIANDO LCD I"C
lcd.backlight(); //RETROILUMINACIÓN I"C
lcd.clear(); //LIMPIAR LCD I2C

pinMode(2, INPUT); //PIN 2 COMO ENTRADA DE BOTÓN esto es para rellenado al poner en reposo el relay de vaciado o sea cuando termina de vaciar acuario
pinMode(3, OUTPUT); //PIN 10 COMO SALIDA A RELAY esto es para VACIAR POR HORA DE ALARMA EJEMPLO DOMINGO 10 Hs
pinMode(10, OUTPUT); //PIN 10 COMO SALIDA A RELAY esto es para rellenado al poner en reposo el relay de vaciado o sea cuando termina de vaciar acuario

}

void loop ()
{
DateTime fecha = rtc.now(); // Obtiene la fecha y hora del RTC
if ( fecha.hour() == 17 && fecha.minute() == 50 fecha now.dayOfWeek == 0 ){ //hora de alarma = 17,50
//if ( fecha now.dayOfWeek() == fecha.hour() == 17 fecha.minute() == 50 ){ //hora de alarma = 17,50
//if ( fecha.hour() == 17 && fecha.minute() == 50 ){ //hora de alarma = 17,50
if ( alarma == true ){ //true = verdadero
Serial.println( "Alarma" );
alarma = false; // desactiva alarma
}
}

Serial.print(rtc.getTemperature()); //Escribe la temperatura
Serial.println("*C");
DateTime now = rtc.now();
Serial.print(now.date(), DEC); //DIA
Serial.print('/');
Serial.print(now.month(), DEC);//MES
Serial.print('/');
Serial.print(now.year(), DEC); //AÑO
Serial.print(' ');
Serial.print(now.hour(), DEC);//HORA
Serial.print(':');
Serial.print(now.minute(), DEC);//MINUTOS
Serial.print(':');
Serial.print(now.second(), DEC);//SEGUNDOS
Serial.print(' ');
Serial.print(DiaSemana[now.dayOfWeek()]);// mow.dayOfweek=ahora dia de la semana lunes xx
Serial.println();

lcd.setCursor(0,0); // UBICACIÓN CURSOR
lcd.print(now.date(), DEC); //DIA
lcd.print("/");
lcd.print(now.month(), DEC);//MES
lcd.print("/");
lcd.print(now.year(), DEC);//AÑO
lcd.print(" ");
lcd.print(DiaSemana[now.dayOfWeek()]);

lcd.setCursor(0,1); // UBICACIÓN CURSOR
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second(), DEC);
lcd.print(" ");
lcd.print(rtc.getTemperature());
lcd.print("*C");

rtc.convertTemperature(); //convierte el registro de la temperatura

delay(700); // Tiempo en el que refresca la información
lcd.clear();
if ( fecha.hour() == 2 && fecha.minute() == 0 )
alarma == true; //reactiva alarma para la próxima vez

//++++++ esto es para rellenado al poner en reposo el relay de vaciado o sea cuando termina de baciar acuario ++++++

if (digitalRead(2) == LOW){ //EVALUO SI LA ENTRADA ESTA A NIVEL DECIA(ALTO HIGH) O (BAJO LOW)
digitalWrite(10,LOW); //ENCIENDO LED DECIA HIGH
}
else{
digitalWrite(10,HIGH); //APAGO LED DECIA LOW

}
}

Moderador
Comienza leyendo las normas te dejo link al final.

  1. No revivas hilos viejos, y menos para secuestrar (desviar la atención a tu problema).

  2. Si posteas código debe ir con etiquetas.

[Normas/url]
](Normas del FORO EN ESPAÑOL - Software - Arduino Forum)