Error 165/165/165 165:165:85 al usar el modulo de reloj I2C DS3231

Tengo dudas si tengo un problema de software o de hardware pero he decidido exponer mi duda aquí. Si el moderador considera que no es el subforo adecuado, puede cambiarlo.

He comprado el I2C Tiny DS3231 AT24C32 Precision Tiempo real modulo de reloj para Arduino. He utilizado un microcontrolador ARDUINO REV UNO 3 para intentar hacer funcionar el módulo de reloj I2C Tiny DS3231 AT24C32 sin mucho exito.

Las especificaciones técnicas aparecen reseñadas en este link: http://www.naylampmechatronics.com/modulos/107-modulo-i2c-rtc-ds3231-at24c32.html

Del link anterior, destaco esta información:

La tensión de funcionamiento del modulo oscila entre 3.3V - 5V
La batería puede mantener al RTC funcionando por 10 años.
Puede ser usado en cascada con otro dispositivo I2C, la dirección del AT24C32 puede ser modificada (por defecto es 0x57). Algo que he comprobado personalmente que es asi.

La conexión de los pines del modulo de reloj a Arduino REV UNO 3 son las siguientes:

SCL - A5
SDA - A4
VCC - 5V
GND - GND

Este módulo de reloj tiene una pila CR 2032 que suministra una tension de 3V. He medido la tensión de la pila con el polímetro y arroja un resultado de 3,42V, deduzco que la pila no esta gastada. Esta tension de funcionamiento esta el rango deá los valores correctos.

La tension de voltaje que suministra ARDUINO REV UNO después de ser medida con un polímetro entre el pin (+) 5V y el pin GND (-) es de 5,12 V.
La tension de voltaje que suministra ARDUINO REV UNO después de ser medida con un polímetro entre el pin (+) 3,3V y al pin GND (-) es de 3,37 V.

He quitado la pila CR 2032 al modulo de reloj DS2331 antes de conectar a la fuente de alimentacion a la placa Arduino REV UNO. Lo que no me queda claro, es si es mejor conectar el modulo DS3231 al pin 3,3V o al 5V. En el caso del pin 5V está un poco por encima del rango de funcionamiento del modulo.

He utilizado código publicado en esta web Reloj y calendario en Arduino con los RTC DS1307 y DS3231

Tanto si conectas el módulo DS3231 al pin 3,3V como al pin 5V y me aparece un mensaje de error:

2165/165/165 (Lunes) 165:165:85
2165/165/165 (Lunes) 165:165:85
2165/165/165 (Lunes) 165:165:85
2165/165/165 (Lunes) 165:165:85
2165/165/165 (Lunes) 165:165:85

Este código te permite obtener la fecha y hora del módulo. Previamente, he instalado la librería RTClib.h. La librería Wire.h venía por defecto:

#include <Wire.h>
#include "RTClib.h"
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   // Si se ha perdido la corriente, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora de compilacion
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En el ejemplo, 21 de Enero de 2016 a las 03:00:00
      // rtc.adjust(DateTime(2016, 1, 21, 3, 0, 0));
   }
}
 
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
 
   delay(3000);
}

Buscando por Internet, me he dado cuenta de que no soy el único que ha tenido este problema. Todo lo contrario, son muchos. Algunos hablan de poner resistencias pull up de 4,7 Kohm. Otros dicen que la causa se debe a una mala mala conexion o un sobre voltaje en el arduino y aconsejan revisar esto. Otros dicen que el problema es que tenían cruzados los cables de SCL con el de SDA pero eso tampoco lo veo en mi caso.

Edito He usado otros cables protoboard para los pines SCL y SDA y sigue el mismo problema. ¿Alguna idea?

¿Aún reajustando fecha y hora aparece así?
O los registros se dañaron, o la conexión está mal como para que la conversión BCD a binario haga que todo retorne 165. Si el dispositivo no responde por algún motivo, el microcontrolador recupera solo 255 en cada intento de lectura.

Gracias por contestar. Si te refieres a la conexion de los cables protoboards con los pines, no creo que sea el problema. He cambiado los cables y nada.

En este hilo https://forum.arduino.cc/index.php?topic=431098.0

El moderador dice que hay reportes de que la batería puede estar en corto y da ese error. y dice que alguien desoldó el battery holder y lo volvió a soldar y el problema se solucionó. y recomendaría que se desconecte todo, y simplemente luego de retirar la batería, repase la soldadura de los contactos del receptáculo de batería.

Tambień, Un usuario pide a otro que haga un Scanner del I2C y compruebe la dirección del dispositivo, a él le pasaba que por defecto tenía la 0x68 y el suyo estaba direccionado en la 0x50, cambiando eso funcionó.
Un usuario dice que el error “165” viene dado porque no hay comunicación I2C, aunque por lo que comentas de que antes te funcionaba el fallo seguramente estará en la pila.

¿SAbes como cambiar la direccion del dispositivo? ¿Hay algún código para eso?

No lo hay. El dispositivo tiene una sola dirección.
Usa el Scanner I2C para determinar la dirección de tu Reloj.

Luego puedes usar Wire.Status() para ver si todo esta bien. También leí ese post.

Ten cuidado con la bateria. Lei que no debe superar la tensión esperable porque d elo contrario falla por sobrevoltage. Yo tuve un problema similar. Segui el consejo de alguien que hablaba de cortar una pista porque el esquema suele estar pensado para alimentar una LIR recargable y vienen con una standard que obvio no es lo mismo. La cuestion es que corte la pista y se comportó mejor pero no bien.
Es un RTC de precisión y tengo atrasos y adelantos raros. Me canso y reemplace todo por un ESP8266-01 que usa NTP para la parte del reloj y listo. Asunto terminado.

Obviamente mi experiencia te servirá a medias.

Gracias por contestar.

¿Lo de cortar la pista tienes algún link que me pueda orientar? ¿Hay que desoldar previamente?

Conectar el módulo reloj a Arduino conectado a su vez a un puerto USB de un PC y configurar dicho modulo con la batería puesta es peligroso por el problema de sobretensión que puede estropear el modulo y hacerlo inservible b]Por descuido inicial, he conectado el módulo sin quitarle la pila al principio y lo he conectado a Arduino que era alimentado a través del puerto usb de mi PC, a ver si va a ser de eso.[/b]

Para configurarlo, tiene que tener la bateria puesta y conectar solo los pines SDA y SCL a Arduino. ¿Puede configurarse el módulo de reloj sin pila conectándolo al pin 3,3V de Arduino?

Dices que las pilas de Litio no son las idóneas. La pila de Litio CR 2032 no es la idónea para este caso, las mejores son las recargables

Lo de la precisión no me importa demasiado, lo quiero para un sistema de riego y da igual que sean 5 minutos más o 5 minutos menos de la hora. Con que riegue por la noche y se apague de día es suficiente.

Se debe configurar

surbyte:
No lo hay. El dispositivo tiene una sola dirección.
Usa el Scanner I2C para determinar la dirección de tu Reloj.

Luego puedes usar Wire.Status() para ver si todo esta bien. También leí ese post.

Ten cuidado con la bateria. Lei que no debe superar la tensión esperable porque d elo contrario falla por sobrevoltage. Yo tuve un problema similar. Segui el consejo de alguien que hablaba de cortar una pista porque el esquema suele estar pensado para alimentar una LIR recargable y vienen con una standard que obvio no es lo mismo. La cuestion es que corte la pista y se comportó mejor pero no bien.
Es un RTC de precisión y tengo atrasos y adelantos raros. Me canso y reemplace todo por un ESP8266-01 que usa NTP para la parte del reloj y listo. Asunto terminado.

Obviamente mi experiencia te servirá a medias.

Debería encontrar el comentario, no tengo tiempo ahora pero ya me voy a acordar de algo para hacerlo.
Se paciente.