Programación para el control de un relé de una puerta

Buenas noches foro!

Soy nuevo en el mundo de Arduino aunque no en el mundo de la programación. El caso es que estoy realizando un proyecto para el control de dos puertas correderas para que estas se abran a una hora exacta y se cierren a otra. Para ello necesito un RTC, lo estoy llevando a cabo con un DS1307. Digamos que mi arduino mandaría una señal al motor de la puerta, que detectaría como un "ábrete" o "ciérrate".

He realizado este pequeño código, pero mi duda va acerca de si funcionaría ante un fallo de alimentación. Tengo entendido que la hora de los RTC, ante dicho fallo, regresa a la de la compilación del sketch. ¿Qué posible solución se le puede dar?

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

void setup() {
pinMode(13,OUTPUT);  //Seleccionamos el pin de salida del relé
Serial.begin (57600);
Wire.begin();
RTC.begin();

   if (! RTC.begin ()) {
     Serial.println ("No se pudo encontrar el RTC");
   }

   if (! RTC.isrunning ()) {
     Serial.println ("¡RTC NO se está ejecutando!");
    
   } else {
  
     // siguiente línea establece el RTC a la fecha y hora en que se compiló este sketch
     rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__)));
    
}

void loop() {
 DateTime now = RTC.now();
 if(now.hour() == 07 && now.minute() == 00) //A esta hora es a la que abro la puerta (07:00h)
  {
  digitalWrite(13,HIGH);
  }
 else if(now.hour() == 07 && now.minute() == 01) //El impulso dura 1 minuto
  {
  digitalWrite(13,LOW);
  }
 delay(3000);

 if(now.hour() == 19 && now.minute() == 00) //A esta hora es a la que cierro la puerta (19:00h)
  {
  digitalWrite(13,HIGH);
  }
 else if(now.hour() == 19 && now.minute() == 01) //El impulso dura 1 minuto
  {
  digitalWrite(13,LOW);
  }
 delay(3000);
}

Muchas gracias de antemano!

No, si la pila del RTC está en condiciones el mismo sigue funcionando, justamente para eso es la pila.
La solución para que no recargue la fecha y hora de compilación es tan simple como comentar esta línea

rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__))); 

La idea es que esa línea solo se ejecute una vez para poner el RTC en hora, entonces cargas el código, dejas que se ejecute, comentas la línea y vuelves a subir el código al arduino entonces ya no la resetea.

Saludos

Totalmente de acuerdo con @anon90500195 pero esa linea no compila. deberia ser:

RTC.adjust (DateTime (F (__DATE__), F (__TIME__))); 

Ojo a las mayusculas y a los espacios de mas y te falta el parentesis de cierre del setup, (no he mirado nada mas , puede haber algun que otro errorcillo).
Saludos.

Y otro detalle, en la línea

Serial.println ("¡RTC NO se está ejecutando!"); 

el caracter apertura de exclamación y la a acentuada van a provocar que se impriman caracteres "raros" en la consola.
Arduino usa el set de caracteres ASCII "imprimibles" (o sea hasta el 127) y los caracteres latinos pertenecen al set "extendido" (del 128 al 255).

En resumen, no uses caracteres acentuados, diéresis ni eñe, tampoco apertura de exclamación ni de interrogación (por nombrar los más comunes).

Saludos

Muchas gracias por las respuestas!

Haré lo que dices @anon90500195, así me evito los problemas que puedan surgir en caso de fallo por reset. Con respecto a la línea que mencionaba @gonpezzi, la verdad que hice el código rápido anoche y se me pasó la variable RTC, no rtc jeje.

Mi última duda (ya por rizar el rizo), sería el caso de los cambios de horario verano - invierno y años bisiestos. Habría que volver a poner en hora al RTC o el propio reloj los tiene pre-programados?

Saludos!

El horario verano invierno no, lo tendras que hacer con codigo. Los años bisiestos si hasta el 2100.

Como te dijo @gonpezzi , no, el RTC no tiene programado el DST, pero vas a encontrar (Google mediante) métodos para calcularlo o bien puedes usar esta librería

Saludos

Lo primero que voy a aportarte es que el RTC que has elegido es de los peores disponibles. Tiene un gran corrimiento en minutos por día. Ya lo comprobarás.
Te aconsejo el DS3231 que es mas preciso.

Muchas gracias por sus aportes. La elección del 1307 ha sido porque lo encontré por la web. Al no tener mucha experiencia, vi que este había sido muy utilizado y lo decidí usar. Para el caso del 3231, la programación para ese RTC sería similar a la del 1307?

Si, simplemente cambia

RTC_DS1307 RTC;

por

RTC_DS3231 RTC;

El 3231 además tiene 2 alarmas que te podrían ser muy útiles.

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.