Pages: [1]   Go Down
Author Topic: reloj rtc [SOLUCIONADO]  (Read 1939 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Edison Member
*
Karma: 17
Posts: 1414
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

  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 Offline
Edison Member
*
Karma: 17
Posts: 1414
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

has leido lo que te he puesto?

creo que no.

aqui esta tu problema...

Code:
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

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 16
Posts: 739
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Full Member
***
Karma: 1
Posts: 208
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

muchas gracias ya lo he solucionado.
Logged


Pages: [1]   Go Up
Jump to: