Offline
Full Member
Karma: 1
Posts: 206
|
 |
« on: October 15, 2012, 01:25:58 pm » |
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
|
|
|
|
« Last Edit: October 18, 2012, 11:35:39 am by Jossema106 »
|
Logged
|
|
|
|
|
Alicante
Offline
Sr. Member
Karma: 2
Posts: 386
|
 |
« Reply #1 on: October 15, 2012, 02:51:01 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 206
|
 |
« Reply #2 on: October 15, 2012, 03:30:38 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 13
Posts: 1239
Arduino rocks
|
 |
« Reply #3 on: October 15, 2012, 05:19:37 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #4 on: October 15, 2012, 05:23:01 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 206
|
 |
« Reply #5 on: October 17, 2012, 01:26:55 pm » |
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();
}
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 13
Posts: 1239
Arduino rocks
|
 |
« Reply #6 on: October 17, 2012, 03:29:52 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 206
|
 |
« Reply #7 on: October 17, 2012, 03:32:28 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Euskadi
Offline
God Member
Karma: 10
Posts: 594
Arduinotarrak
|
 |
« Reply #8 on: October 17, 2012, 10:07:48 pm » |
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()
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 206
|
 |
« Reply #9 on: October 18, 2012, 11:35:04 am » |
muchas gracias ya lo he solucionado.
|
|
|
|
|
Logged
|
|
|
|
|
|