Veréis, me he pillado un tinyRTC de estos de DX baratunos.
El caso es que he hecho varias pruebas (configurado varias veces) , y al final me pierde la hora con el paso del tiempo. Ayer por la tarde desconectaba Arduino y la hora seguía ahí, pero por ejemplo esta mañana ya se me ha resetado, no entiendo por que.
He probado con estos codigos:
(Conectando DS a pin2, Este codigo es algo más completo)
Otro que encontré por ahí (sin conectar a pin2): #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; void setup () { Wire.begin(); // Inicia el puerto I2C RTC.begin(); // Inicia la comunicación con el RTC RTC.adjust(DateTime(DATE, TIME)); // Establece la fecha y hora (Comentar una vez establecida la hora) Serial.begin(9600); // Establece la velocidad de datos del puerto serie } void loop () { }
La pila aparentemente funciona (Un led azul de alta luminosidad lo enciende vamos)
Saludos
Es un caso muy común con los DS1307, me esta pasando también con uno, creo que puede tratarse de problemas de alimentación desde los 5V y el switcheo para los 3V de la batería. Pero aun no consigo resolverlo. Si hallas algo publicalo a ver si nos sirve a todos.
El caso es esta mañana le he metido la hora. Y lo he dejado encendido conectado a una LCD y marcaba la hora. Lo he desconectado media hora y seguia bien. Incluso ahora me marca bien la hora. Creo que es porque no he tocado nada en la protoboard, y tendrá algun contacto sensible o corto, o cualquier historia.
Recuerdo que cuando se va la hora la traqueteaba mucho.
No tiene alarma ni tampoco el ds3231, lo bueno del ds3231 es que trae integrado un sensor de temperatura bastante bueno y con el cristal de compensación de temperatura no debes tener problemas.
igual usaba esos TinyRTC ds1307 la verdad son un dolor de cabeza se desprograma la hora cuando quiere y siempre esta desfasada por varios minutos.
Alguna vez vi que usaban la función millis para compensar el hora de un DS1307, me di valor para implementarla... pero tras usarla varios días, caí en la cuenta de que por tratar de corregir el fallo del reloj, hay que usar muchos comparadores, no solo del segundero, sino también de los minutos, hora y día.
No me quise esperar a ver a fin de mes, ni mucho menos a fin de año. En definitiva si pueden conseguir un DS3231, se evitarán dolores de cabeza. Con respecto a la alarma, se reduce a usar un comparador con la hora objetivo y activar un buzzer, e incluso algun led como señal visual
void Alarma1()
{
if (hTiny==Alarmah){
if (mTiny==Alarmam){
if (sTiny==Alarmas){
for (int KK=1; KK<=60; KK++){
FTImpl.PlaySound((((108 + 21) << 8) | 0x49)); //Campana
FTImpl.PlaySound((((108 + 21) << 8) | 0x49)); //Campana
FTImpl.PlaySound((((108 + 21) << 8) | 0x49)); //Campana
FC = 255; enciendeledFC();
Rojo1();
Menu8();
}
}
}
}
}
Otra ventaja es que las librerias que permiten activar el DS1307 sirven para hacer funcionar el DS3231.
Aun no la he comprobado, ya que pocas de estas librerias son compatibles con el arduino Due. Sin embargo compilé un ejemplo en el arduino Due y funciona.
Incluso accesa a los datos del sensor de temperatura. Habrá que revisarla a fondo para ver si es que en efecto se consiguen programar las dos alarmas del 3231.
Interrupciones para que!!
Que evento puede ser tan preciso en dias, hora, min, seg, milisegundo, microsegundo para requerir una interrupción para una alarma?
De todas formas es mi punto de vista, y tu puedes hacer lo que gustes.
Solo digo que con poner en algun punto de tu loop una consulta a la alarma 1 o 2 y accionar en consecuencia, o peor que puede ocurrir si no usas delay desde YA en todo el loop, es que tengas una demora de cuanto... digamos 1 mseg? (estoy suponiendo pero creo que mejor incluso).
No sé si digo una burrada, pero ¿tal vez se podría establecer largos periodos de sleep en el arduino, o incluso tener todo el montaje apagado y encender la alimentación del conjunto con la alarma?
Quiero decir, ¿no sería aplicable para ahorro de energía en sistemas que deban estar encendidos puntualmente?
Esta bien pero para eso el RTC cuando se produce el evento de alarma levanta un nivel en el pin alarma, que te dice eso Serafín?
Bueno si quieres usa ese pin para chequear de que alarma se trata, y lo configuras a una interrupción del arduino o para despertarlo del sleep.
He estado mirando las librerías RTC y ninguna tiene implementado el uso de la alarma.
Al menos las que yo tengo cargadas en mi librería y son 3 y las mas usadas.
Porque no usar Arduino TImeAlarm Library?
A mi me parece una belleza de librería y no me pongo a discutir porque si con nitrosito, tiene razón pero estan estas cosas tambien para usarlas.
Mira que simple nitrosito, configuras mas alarmas de las que tiene el RTC
#include <Time.h>
#include <TimeAlarms.h>
void setup()
{
Serial.begin(9600);
setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
// create the alarms
Alarm.alarmRepeat(8,30,0, MorningAlarm); // 8:30am every day
Alarm.alarmRepeat(17,45,0,EveningAlarm); // 5:45pm every day
Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday
Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds
Alarm.timerOnce(10, OnceOnly); // called once after 10 seconds
}
void loop(){
digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
}
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - turn lights off");
}
void EveningAlarm(){
Serial.println("Alarm: - turn lights on");
}
void WeeklyAlarm(){
Serial.println("Alarm: - its Monday Morning");
}
void ExplicitAlarm(){
Serial.println("Alarm: - this triggers only at the given date and time");
}
void Repeats(){
Serial.println("15 second timer");
}
void OnceOnly(){
Serial.println("This timer only triggers once");
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void printDigits(int digits)
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
Todo esto lo tendrías que hacer tu con código, pero ya esta hecho, entonces porque no usarlo y dejas la inquietud de lado.
Además y es solo un consejo, si tu aplicación requiere una hora mas o menos precisa el DS1307 no es buena elección. Se corre mucho por dia y ni hablar por mes.