Go Down

Topic: reloj rtc [SOLUCIONADO] (Read 2116 times) previous topic - next topic

Jossema106

Oct 15, 2012, 08:25 pm Last Edit: Oct 18, 2012, 06:35 pm by Jossema106 Reason: 1
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
Proyecto:
http://duinoblog.blogspot.com.es/

PascuaL

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.

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.

Proyecto:
http://duinoblog.blogspot.com.es/

Sergegsx


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.

flico

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
Trabajando en ...

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

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

Jossema106

  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();

        }
Proyecto:
http://duinoblog.blogspot.com.es/

Sergegsx

has leido lo que te he puesto?

creo que no.

aqui esta tu problema...

Code: [Select]
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.

Jossema106

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
Proyecto:
http://duinoblog.blogspot.com.es/

curro92

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()




Jossema106

muchas gracias ya lo he solucionado.
Proyecto:
http://duinoblog.blogspot.com.es/

Go Up