El RTC DS3231 atrasa 1 minuto al día

Pues después de terminar el controlador de iluminación del acuario, he terminado de programar el controlador del resto de mecanismos automatizados del mismo acuario.
Pero el reloj atrasa bastante, como un minuto al día, inicialmente pensé que era un RTC estropeado y lo cambié por uno nuevo, pero igual.
He medido el voltaje de entrada del RTC, 5v.
He combiado la librería que utilizaba la “DS3231.h” por la “RTClib.h” y lo mismo, sigue atrasando.
Pongo el sketch completo en archivo adjunto porque es bastante grande y excede el tamaño para un mensaje.
Pongo de forma resumida el programa en relación al control de tiempo:

#include "RTClib.h"
#include <TimeLib.h>

RTC_DS3231 rtc;

byte Hora, Minutos, Segundos;

void setup()
{
    //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//Descomentar para poner la hora del compilador
    MenuPrincipal();
}

void MenuPrincipal()
{
    while(1)
        {
            ActualizaElReloj();
            DibujaRelojDigital();
        }
}

void ActualizaElReloj()
{
      DateTime now = rtc.now();
      Hora = now.hour();
      Minutos = now.minute();
      Segundos = now.second();
      Serial.print(Hora);       Serial.print(':');
      Serial.print(Minutos);    Serial.print(':');
      Serial.println(Segundos);
}

Prueba_Controlador_Acuario.ino (19.8 KB)

Pues entiendo que el problema no es software, sino hardware, porque en tu código no se modifica la hora en ningún punto, y el RTC debería funcionar y mantener la hora independientemente del arduino. Creo que sería interesante que pongas foto o esquema de tu montaje a ver qué opinan los entendidos. Por descartar ¿Has probado el arduino y el RTC solos con algún programa sencillo?

Se agradece el esfuerzo por la existencia de librerías como Timelib y otras similares. Pero no sacan todo el potencial del DS3231

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.

Sube una foto de los componentes que estás usando y el sketch completo, acá hay ojos expertos que a laprimera darán con algún posible fallo

noter:
¿Has probado el arduino y el RTC solos con algún programa sencillo?

Hece un par de semanas terminé la parte de iluminación del acuario utilizando otro RTC y no atrasa, es cierto que el sketch es diferente.

El sketch completo lo he puesto como archivo adjunto en el mensaje original, el esquema de los circuitos es el siguiente:

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. >:( >:( >:( :confused:

Bueno sabemos que estos módulos económicos no siempre cumplen con lo que prometen. Insisto el DS3231 es el reloj mas estable y preciso que podemos tener en arduino; pero no por ello estamos exentos de que que alguno que otro haga de las suyas.

El módulo ZS-042, requiere de una batería de litio recargable LIR-2032, no se puede usar una batería normal CR2032, hay que modificar el circuito para desactivar los circuitos de recarga de la batería LIR, al no hacer esto, en casos extremos la batería CR2032 puede explotar.

Otra buena opción es conseguir un DS3231 con batería soldada, como este:

No cuenta con EEPROM, sin embargo la batería que tiene soldada es recargable, el circuito es minimalista. Para asegurar que des con un módulo en condiciones, te sugiero comprar por lo menos 4 de ellos en un solo pedido, ya que nuevamente no estamos exentos de alguna falla.

PD: voy a hacer un test con alguno de los DS3231 con EEPROM que tengo por allí guardados para ver cómo se comporta durante un día de trabajo. No tengo los dispositivos que tienes instalados, pero me llamó la atención que tienes por allí una rutina para activar un reloj manual.

TFTLCDCyg:
El módulo ZS-042, requiere de una batería de litio recargable LIR-2032, no se puede usar una batería normal CR2032, hay que modificar el circuito para desactivar los circuitos de recarga de la batería LIR, al no hacer esto, en casos extremos la batería CR2032 puede explotar.

Pues los módulos que atrasan (ya he probado 3) son esos que comentas, ZS-042 con una batería de botón de LI-ION recargable.

TFTLCDCyg:
Otra buena opción es conseguir un DS3231 con batería soldada, como este:

No se vé la imagen.

TFTLCDCyg:
PD: voy a hacer un test con alguno de los DS3231 con EEPROM que tengo por allí guardados para ver cómo se comporta durante un día de trabajo. No tengo los dispositivos que tienes instalados, pero me llamó la atención que tienes por allí una rutina para activar un reloj manual.

Ok.
Lo del reloj manual lo he hecho para poder testar el funcionamiento de los programas, en el caso de la pantalla de leds con efecto amanecer - anochecer para observar en unos segundos esos efectos (con un pulsador para activar y desactivar ese efecto), y en el proyecto que comento ahora (valorar si funcionan todos los mecanismos temporizados) con una variable booleana recompilando el programa.

PD: El circuito del proyecto, ahora con el Tiny RTC ha variado dos segundos en 3 días, por lo cual considero que a menos que esos módulos con batería recargable lleven la alternativa de un cableado diferente (en esos pines 32K y SQW) están defectuosos.
Ya le he escrito al chino que me los vendió a ver que me contesta.