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.
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...
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:
#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***********************