Imposible continuar la hora con RTC DS3231

Buenas tardes:

Soy un asiduo a este foro, en el que he aprendido mucho de Arduino, pero sigo siendo un novato.

Estoy intentando hacer un proyecto para mantener la temperatura del agua caliente, procedente de una placa solar térmica, cuando no lo esté por falta de sol, mediante una resistencia eléctrica dentro del tanque de agua.

Uno de los parámetros a tener especialmente en cuenta es la hora, puesto que tengo contratada doble tarifa y como es lógico quiero que se active solo durante el periodo de valle (la más barata).

El problema es que lo quiero controlar con un DS3231 y consigo la hora, con una gran precisión. Pero cuando se corta la tensión y se queda alimentado con su batería, al volver a restaurarla, la hora que tiene es la misma que tenía antes del corte. Yo supongo que debería seguir contando y la hora debería ser correcta, pero no consigo que sea así.

Ya he probado con varios módulos, varias librerías, varias configuraciones, varias pilas y buscado en estos foros y en Internet en general y no consigo encontrar nada que pueda solucionar esto.

Si alguien me pudiera dar alguna idea, se lo agradecería mucho.

Saludos.

Hola Aljarafe,

No sé si será el mismo problema pero en un montaje con un DS3231 siempre que lo alimentaba me volvia a la misma hora, no recuerdo muy bien la que era, pero creo que eran las 3:00.

Probé con pilas nuevas y seguia pasando.Probé el DS3231 solo en una protoboard, leyendo por el serial y funcionaba, por lo que debía haber algo en el montaje que hacía corto o algo parecido. Sólo lo desconecté todo y lo volví a conectar concienzudamente y hasta hoy funcionando sin problemas.

He llegado a estar 15 días sin conectar y no parece que se haya retrasado o adelantado mucho.

Saludos

Hi,
Yo tuve el mismo problema y es que el modulo tiene un problema el la forma que carga la bateria. Yo tuve que modificarlo para que trabajara bien. Adjunto un link con un esquematico. Debes de comparar los componentes del esquematico con los componentes del modulo que tu tienes. Si comparan entonces puedes hacerle modificacion siguiendo las instruciones del link. En el esquematico dice que la R6 es de 470K. Esa resistencia es demaciado alta para suplir la corriente de la bateria al chip 1307. Para mi si no necesitas la memoria deberias usar el DS1302 que es un modulo sencillo y es bien confiable.

https://granasat.ugr.es/2017/11/12/tiny-rtc-i2c-at24c32-ds1307-real-time-clock-module-board-for-arduino/

Hola, pepepotero:

Muchas gracias por tu rápido respuesta.

Todavía estoy en fase de protoboard, así que no me costará mucho trabajo desconectar y volver a conectar todo, porque, de momento, solo tengo conectado el DS3231 a una placa UNO y lo compruebo a través del monitor serie.

Pero no consigo nada. La fecha y hora que se le queda es justo la que tenía antes de desconectarle la corriente y cuando vuelvo a conectarla sigue, sin problemas, desde ese mismo punto. O sea, que si lo desconecto, por ejemplo, a las 18:00:00, cuando lo vuelvo a conectar al dia siguiente a las 9:: de la mañana, él sigue por las 18:00:01, cuando yo creo que debería tener las 9:00, ¿no es así?

#include "Arduino.h"
#include "Wire.h"
#include "uRTCLib.h"


// uRTCLib rtc;
uRTCLib rtc(0x68, 0x57);



unsigned int pos;

void setup() {
delay (2000);
	Serial.begin(9600);
	Serial.println("Serial OK");
	//  Max position: 32767

	#ifdef ARDUINO_ARCH_ESP8266
		Wire.begin(0, 2); // D3 and D4 on ESP8266
	#else
		Wire.begin();
	#endif


	#ifdef _VARIANT_ARDUINO_STM32_
		Serial.println("Board: STM32");
	#else
		Serial.println("Board: Other");
	#endif
#ifdef ARDUINO_ARCH_AVR
	int inttmp = 32123;
#else
	// too logng for AVR 16 bits!
	int inttmp = 24543557;
#endif
	float floattmp = 3.1416;
	char chartmp = 'A';

	// Testing template
	if (!rtc.eeprom_write(0, inttmp)) {
		Serial.println("Failed to store INT");
	} else {
		Serial.println("INT correctly stored");
	}
	if (!rtc.eeprom_write(4, floattmp)) {
		Serial.println("Failed to store FLOAT");
	} else {
		Serial.println("FLOAT correctly stored");
	}
	if (!rtc.eeprom_write(8, chartmp)) {
		Serial.println("Failed to store CHAR");
	} else {
		Serial.println("CHAR correctly stored");
	}

	//rtc.set(0, 38, 17, 4, 28, 3, 19);
	//  RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)


	inttmp = 0;
	floattmp = 0;
	chartmp = 0;



	Serial.print("int: ");
	rtc.eeprom_read(0, &inttmp);
	Serial.println(inttmp);
	Serial.print("float: ");
	rtc.eeprom_read(4, &floattmp);
	Serial.println((float) floattmp);
	Serial.print("char: ");
	rtc.eeprom_read(8, &chartmp);
	Serial.println(chartmp);
	Serial.println();


	for(pos = 9; pos < 1000; pos++) {
		rtc.eeprom_write(pos, (unsigned char) (pos % 256));
	}

	pos = 0;
}

void loop() {
	rtc.refresh();

	Serial.print("RTC DateTime: ");
	Serial.print(rtc.day());
	Serial.print('/');
	Serial.print(rtc.month());
	Serial.print('/');
	Serial.print(rtc.year());
	

	Serial.print(' ');

	Serial.print(rtc.hour());
	Serial.print(':');
	Serial.print(rtc.minute());
	Serial.print(':');
	Serial.print(rtc.second());

	Serial.print(" DOW: ");
	Serial.print(rtc.dayOfWeek());

	Serial.print(" - Temp: ");
	Serial.print(rtc.temp());

	Serial.print(" ---- ");
	Serial.print(pos);
	Serial.print(": ");
	Serial.print(rtc.eeprom_read(pos));

	Serial.println();

	pos++;
	pos %= 1000;
	delay(1000);

Ahora, después de probar con otros códigos, lo estoy haciendo con este que es un ejemplo de la libreria de Adafruit uRTCLib.h, porque imaginaba que como lo escribía en la eeprom, lo guardaría, pero ya veo que estaba equivocado, porque sigue comportándose como los otros anteriores.

Saludos.

Hola, tauro0221:

Muchas gracias por tu respuesta. Voy a comprobar lo que me dices y te cuento cómo me ha ido.

Saludos.

Edito: Veo que el enlace se refiere al DS1302 y no sé si será igual con respecto a circuito.

Hi,
Por eso te sugeri que mires los componentes en el modulo para ver si coinsiden con el esquematico. Adjunto foto para que verifique si es el mismo modulo.

Nadie lo mencionó aun pero el problema puede ser que los equipos suelen venir con una bateria CR2032 de 3V cuando debe llevar una LIR2032 que es la versión recargable.

En mi caso la solución fue esa.

Buenos días:

Pues os comento que he resuelto el problema y era tan sencillo que me da rabia no haber caído antes y haberos molestado, pero por fin lo he averigüado y os lo comento por si a alguno le pasa (que lo veo difícil).

En esta línea de código:

rtc.set(0, 38, 17, 4, 28, 3, 19);
// RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)

como podéis ver se introducen los valores de inicialización.

Mi problema era que yo cargaba el programa, posteriormente comentarizaba esta linea para que no me la cargase la próxima vez pero, no la subía a la placa nuevamente, por lo que al resetearse después del corte de corriente, como el programa cargado sí tenía la línea sin comentarizar, pues me volvía a poner esa hora.

Es un error de principiante, ya os decía que soy novato, pero de todas formas os quiero agradecer vuestra ayuda y ponerlo aquí por si se da el improbable caso de que a alguien le ocurra también.

Espero seguir avanzando y algún día poder compartir mi proyecto ya funcionando.

Gracias a todos y saludos.