TFTLCDCyg:
El DS3231 es el RTC más exacto que tenemos para arduino. Te recomiendo que uses una rutina que acceda directamente a los registros del RTC. La mejor que he visto está aquí
Úsala durante 24 hrs y verás que no hay forma alguna en la que ese reloj se retrase tanto, como le ocurre en tu proyecto.
Pues he conectado el DS3231 a un Arduino Mega (con el sketch que me indicas), y como se lo he quitado al circuito (dibujo de arriba) del proyecto, le he puesto al circuito del proyecto un Tiny RTC que tenía por ahí.
Los resultados:
1.- Arduino Mega y un DS3231, el sketch:
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val) {return( (val/10*16) + (val%10) );}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val) {return( (val/16*10) + (val%16) );}
void setup()
{
Wire.begin();
Serial.begin(115200);
// Tiempo inicial, luego una segunda vez volviendo a comentar:
//setDS3231time(00,34,01);//Segundos, Minutos, Hora
}
void setDS3231time(byte Segundos, byte Minutos, byte Hora)
{
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(Segundos)); // set seconds
Wire.write(decToBcd(Minutos)); // set minutes
Wire.write(decToBcd(Hora)); // set hours
Wire.endTransmission();
}
void readDS3231time(byte *Segundos,byte *Minutos,byte *Hora)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*Segundos = bcdToDec(Wire.read() & 0x7f);
*Minutos = bcdToDec(Wire.read());
*Hora = bcdToDec(Wire.read() & 0x3f);
}
void displayTime()
{
byte Segundos, Minutos, Hora;
// retrieve data from DS3231
readDS3231time(&Segundos, &Minutos, &Hora);
// send it to the serial monitor
if (Hora<10) { Serial.print("0"); }
Serial.print(Hora, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (Minutos<10) { Serial.print("0"); }
Serial.print(Minutos, DEC);
Serial.print(":");
if (Segundos<10) { Serial.print("0"); }
Serial.println(Segundos, DEC);
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
RESULTADO: En menos de 24 horas ha atrasado casi 2 minutos.
No sé que estaré haciendo mal, pero es bastante frustrante tener todo el circuito montado y que el reloj atrase tanto, y como he dicho al principio es el segundo DS3231, cambiado porque pensé que podía ser el RTC, a menos que los dos estén estropeados.
2.- El circuito completo con un Tiny RTC:
El sketch es el que puse como adjunto en el mensaje inicial.
RESULTADO:
En el mismo período de tiempo (menos de un día) atrasó 15 segundos.
CONCLUSION: considerando que el DS3231 es mucho más exacto que el Tiny RTC, si atrasa mucho más, el paso siguiente será comprar un nuevo DS3231, a menos que algún compañero descubra algo que estoy haciendo mal. >:( >:( >:( 