reloj rtc [SOLUCIONADO]

Hola de nuevo!

Hay algo que se me escapa o no lo he entendido bien, vamos a ver:

El modulo rtc sirve como reloj es decir pones la hora desde código y la mantiene pero si hay un corte de luz vuelve a coger esa hora no la mantiene, es decir la pila no entra en funcionamiento, esto es asi o estoy haciendo algo mal?

Gracias

El rtc es un chip que mediante la pila mantiene unas "pautas". No guarda la hora en si, sino un tipo de información que es descodificada(por llamarlo así) por Arduino. Si hay un corte de luz mantiene estas pautas, para que cuando Arduino vuelva a tener suministro, pueda volver a leerlas.
Es una explicación un poco superficial, si no lo entiendes seguro que hay alguien por aquí que la clava.
Un saludo.

Lo entiedo perfectamente pero segun la conexion y el ejemplo que he encontrado no funciona, es decir, cada vez que hay un corte de luz empieza por la hora que puse en el codigo.

Jossema106:
Lo entiedo perfectamente pero segun la conexion y el ejemplo que he encontrado no funciona, es decir, cada vez que hay un corte de luz empieza por la hora que puse en el codigo.

es posible que la bateria no este funcionando bien.

ahora que pienso, creo que lo que ocurre, es que estas utilizando una linea de codigo para establecer la hora. cuando se corta la luz el arduino se reinicia y vuelve a ejecutar esa linea de codigo y vuelvo a situar la hora a la misma que la ultima vez.
carga el programa, comprueba que la hora esta bien. luego vuelve a cargar el programa pero elimina la linea de codigo del setup() que fija la hora del RTC.

Para que nos aclaremos deberías de poner el código y asi poder ver lo que puede pasar. Me imagino que estas usando un DS1307

Una vez que pones en hora el RTC hay que comentar el getDateDs1307

Os dejo el código a ver si podemos sacar algo en claro

// 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) );
}

// Stops the DS1307, but it has the side effect of setting seconds to 0
// Probably only want to use this for testing
/void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}
/

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month,byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

void setup(){

Serial.begin(9600);
Wire.begin();

//PONER RTC EN HORA
second = 00;
minute = 5;
hour = 19;
dayOfWeek = 1;
dayOfMonth = 15;
month = 10;
year = 12;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

}

void rtc_prueba(){//activa el led en el second 3 y muestra en serial los datos
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.println(year, DEC);

}

void loop(){

//RTC
rtc_prueba();

}

has leido lo que te he puesto?

creo que no.

aqui esta tu problema...

void setup(){
             
               Serial.begin(9600);
              Wire.begin();
              
              
              //PONER RTC EN HORA
              second = 00;
              minute = 5;
              hour = 19;
              dayOfWeek = 1;
              dayOfMonth = 15;
              month = 10;
              year = 12;
              setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
              
          }

busca la linea que sobra. lee mi ultimo post.

Ya lo he leido, pero no me ha dado tiempo a probarlo porque he estado mirando una lib especifica de rtc pero creo que voy a utilizar lo tuyo.

Gracias

Hola,
te está ocurriendo lo mismo que a Bill Murray en aquela peli "Atrapado en el tiempo", en el Día de la Marmota, tu arduino siempre se despierta a la misma hora, del mismo día del mismo mes del mismo año.
Y seguirá así, mientras a la hora de despertarse (setupearse) le digas setDateDs1307()

muchas gracias ya lo he solucionado.