Go Down

Topic: Resta de fechas (Read 4260 times) previous topic - next topic

barkalez

#15
May 14, 2012, 11:48 pm Last Edit: May 14, 2012, 11:51 pm by barkalez Reason: 1
Joeeee me siento que tiro un muro y me doy con otro, así todo el rato, veamos a ver:

En el siguiente codigo lo que pretendo es que si en la dirección 0 de la EEPROM pues que me escriba la fecha actual que lee del reloj con una función que ahora no tiene importancia.

Pues resulta que le asigno a una variable ese valor de la EEPROM y a sabiendas que es 0, aún así no me graba la fecha actual.

Code: [Select]
void setup() {
 
 Wire.begin();
 Serial.begin(57600);
 zero=0x00;
 int direccion = 0;
 long Vesihayfecha = EEPROM.read(direccion);
 
 getDateDs1307();
 if (Vesihayfecha = 0)
{
     getDateDs1307();
     EEPROM.write(direccion, year);
     direccion = direccion + 1;
     EEPROM.write(direccion, month);
     direccion = direccion + 1;
     EEPROM.write(direccion, dayOfMonth);
     direccion = 0;  
}
 
 
 
 
 
}


Luego para cerciorarme que en la posición 0 hay algo escrito, con otro programa escribo un 12 y luego lo leo y efectivamente lee 12 porque me lo imprime...
Code: [Select]
int direccion = 0;
 long Vesihayfecha = EEPROM.read(direccion);

Pero cuando se lo asigno a esa variable y la imprimo me imprime 0 en vez de 12.

El código entero por si sirve de algo:

Code: [Select]
#include <EEPROM.h>
#include "Wire.h"                        //Incluye la libería "Wire.h"
#define DS1307_I2C_ADDRESS 0x68          // DS1307_I2C_ADDRESS le damos el valor 0x68 para iniciar comunicación I2C con DS1307

                  //_______________________________________________________
                  // Código para compatibilizar versiones del IDE Arduino
                  //_______________________________________________________               
                 #if defined(ARDUINO) && ARDUINO >= 100   // Arduino v1.0 and newer
                 #define I2C_WRITE Wire.write
                 #define I2C_READ Wire.read
                 #else      // Arduino Prior to v1.0
                    #define I2C_WRITE Wire.send
                    #define I2C_READ Wire.receive
                 #endif

                  //_______________________________________________________
                  // Variables globales
                  //_______________________________________________________
        int Vesihayfecha;         
        int command = 0;       // This is the command char, in ascii form, sent from the serial port     
        int i;
        long previousMillis = 0;        // will store last time Temp was updated
        byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
        byte test;
        byte zero;
        char  *Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        char  *Mon[] = {"","01","02","03","04","05","06","07","08","09","10","11","12"};

                  //_______________________________________________________
                  // Convierte decimal a Binario BCD
                  //_______________________________________________________
                  byte decToBcd(byte val)
                       {
                         return ( (val/10*16) + (val%10) );
                       }

                  //_______________________________________________________
                  // Convierte Binario BCD a Decimal
                  //_______________________________________________________                 
                  byte bcdToDec(byte val)
                       {
                         return ( (val/16*10) + (val%16) );
                       }



                  //_____________________________________________________________
                  // Es la función getDateDs1307 que solo lee la hora y la fecha
                  //______________________________________________________________
                    void getDateDs1307()
                                {
                                 // Coloca el cursor en el registro 0
                                 Wire.beginTransmission(DS1307_I2C_ADDRESS);
                                   I2C_WRITE(zero);
                                   Wire.endTransmission();
                                   Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
                                 // A few of these need masks because certain bits are control bits
                                     second     = bcdToDec(I2C_READ() & 0x7f);
                                     minute     = bcdToDec(I2C_READ());
                                     hour       = bcdToDec(I2C_READ() & 0x3f);  // Need to change this if 12 hour am/pm
                                     dayOfWeek  = bcdToDec(I2C_READ());
                                     dayOfMonth = bcdToDec(I2C_READ());
                                     month      = bcdToDec(I2C_READ());
                                     year       = bcdToDec(I2C_READ());                                         
                                }


                  //______________________________________________________________________________
                  // Tabla que contiene los días que han pasado desde principio de año en cada mes
                  //_______________________________________________________________________________
                  //(1 de Enero -> 0 días, 1 de Febrero -> 31 días, ...)
                  //     Ejemplo:
                  //              10/05/2012 --> ConvierteFechaEnNumero(2012,05,10) --> devuelve 4513 (=12*365+12/4+120+10)
                  //              31/12/2011 --> ConvierteFechaEnNumero(2011,12,31) --> devuelve 4382(=11*365+11/4+334+31)
                  //              10/05/2012 - 31/12/2011 = 4513 - 4382 = 131 días
                    int tablaMes[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
                   
                    long ConvierteFechaEnNumero( int anio, int mes, int diademes)
                         {
                            long dia;
                            dia = (anio)*365 + (anio)/4 + tablaMes[mes-1] + diademes;
                            if(((anio)%4==0) && (mes<3)) // Es bisiesto y no hemos pasado 29/02
                            dia--;
                            return dia;
                         }
                 
                         

void setup() {
 
  Wire.begin();
  Serial.begin(57600);
  zero=0x00;
  int direccion = 0;
  long Vesihayfecha = EEPROM.read(direccion);
 
  getDateDs1307();
  if (Vesihayfecha = 0)
{
      getDateDs1307();
      EEPROM.write(direccion, year);
      direccion = direccion + 1;
      EEPROM.write(direccion, month);
      direccion = direccion + 1;
      EEPROM.write(direccion, dayOfMonth);
      direccion = 0; 
}
 
 
 
 
 
}

void loop() {   
     
      getDateDs1307();
      Serial.println(" ");
      delay(1000);
      Serial.println(year);
      delay(1000);
      Serial.println(month);
      delay(1000);
      Serial.println(dayOfMonth);           
      delay(1000);
     
     
     
      long FechaActual;
      FechaActual = ConvierteFechaEnNumero( year,month,dayOfMonth); // Prueba de la función ConvierteFechaEnNumero()
      Serial.println("FechaActual");
      Serial.println(FechaActual);
      delay(1000);
     
      long FechaGuardada;
      long direccion;
     
      long AnioGuardado = EEPROM.read(0);
         Serial.print(direccion);
         delay(1000);
         Serial.print("\t");
         delay(1000);
         Serial.print(AnioGuardado, DEC);
         delay(1000);
         Serial.println();
         direccion = direccion + 1;
      long MesGuardado  = EEPROM.read(direccion);
         Serial.print(direccion);
         delay(1000);
         Serial.print("\t");
         delay(1000);
         Serial.print(MesGuardado, DEC);
         delay(1000);
         Serial.println(); 
         direccion = direccion + 1;
      long DiaGuardado  =EEPROM.read(direccion);
         Serial.print(direccion);
         delay(1000);
         Serial.print("\t");
         delay(1000);
         Serial.print(DiaGuardado, DEC);
         delay(1000);
         Serial.println();
         delay(1000);
         direccion = 0;
   
     
      FechaGuardada = ConvierteFechaEnNumero( AnioGuardado,MesGuardado,DiaGuardado); // Prueba de la función ConvierteFechaEnNumero()
      Serial.println("FechaGuardada");
      Serial.println(FechaGuardada);
      delay(1000);
     
     
      long Resultado;
      Resultado = FechaActual - FechaGuardada;
      Serial.println("Resultado");     
      Serial.println(Resultado);
     
   
    }
//*****************************************************The End***********************


barkalez

Ya lo he solucionado...

Code: [Select]
void setup() {
 
  Wire.begin();
  Serial.begin(57600);
  zero=0x00;
  int direccion = 0;
  long Vesihayfecha = EEPROM.read(direccion);
 
  getDateDs1307();
  if (Vesihayfecha < 12)
{
      getDateDs1307();
      EEPROM.write(direccion, year);
      direccion = direccion + 1;
      EEPROM.write(direccion, month);
      direccion = direccion + 1;
      EEPROM.write(direccion, dayOfMonth);
      direccion = 0; 
}
 
 
 
 
 
}



Es el valor que daba la eeprom a la variable que lo recogía... no puede ser = a 0,  he puesto que fuera menor  que 12 y funciona.

Un saludo

jorgepl

El problema no lo tenias ahí, sino en la condición del if:
Code: [Select]
  if (Vesihayfecha = 0)


Lo tienes que cambiar por:
Code: [Select]
  if (Vesihayfecha == 0)


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy