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);
}
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.
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.
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).
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?
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
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?