Guardar Fecha en la EEPROM

Estimados Amigos, hace unas cuantas horas que estoy leyendo por toda la internet y no puedo encontrar cómo hacer lo siguiente, deseo guardar una fecha en la EEPROM, que sería una fecha inicial de un proceso, así si el arduino se queda sin energía podría a través de una resta con la fecha actual saber en que día del proceso se apago y de esta manera continuar con el mismo.

Estuve probando ejemplos, pero en donde convierten el Int a Byte nunca ponen el skecht completo y no lo puedo deducir,

Por ejemplo Día_Inicial = 10/09/2017 (se guarda en la EEPROM)

Supongamos que hoy se paga el Arduino

Se enciende el Arduino lee la EEPROM, recupera la fecha Día_Inicial (10/09/2017)

Total_Días = Hoy - Dia_Inicial

Muchisimas Gracias.

1 Like

Eeprom.get y EEPROM.put resuelven tu problema con almacenar y recuperar las fechas

Te he creado una ejemplo que almacena la hora en EEPROM cuando presionas un boton conectado al pin 2.
Mientras muestra en el arranque el valor de la hora guardada y

#include <Time.h>               // https://www.pjrc.com/teensy/td_libs_Time.html
#include <TimeLib.h>
#include <EEPROM.h>
#define pinBoton  2
bool estado, estadoAnt = true;

time_t t;

time_t tmConvert_t(byte hh, byte mm, byte ss, byte DD, byte MM, int YYYY) {
  
  setTime(hh,mm,ss,DD,MM,YYYY); // fijo la hora interna
  tmElements_t tmSet;
  tmSet.Year = YYYY - 1970;
  tmSet.Month = MM;
  tmSet.Day = DD;
  tmSet.Hour = hh;
  tmSet.Minute = mm;
  tmSet.Second = ss;
  return makeTime(tmSet); 
}

void print_t(time_t temp) {
  char buffer[30];

  sprintf(buffer, "%02d:%02d:%02d %02d/%02d/%02d", hour(temp), minute(temp), second(temp), day(temp), month(temp), year(temp));
  Serial.println(buffer);
}

void setup()   {   

  pinMode(pinBoton, INPUT_PULLUP);
  int eeAddress = 0; //EEPROM address to start reading from
  
  Serial.begin(115200);
  while (!Serial) {
  ; // wait for serial port to connect. Needed for Leonardo only
  }

  EEPROM.get( eeAddress, t ); 
  Serial.println("Leido de la EEPROM");
  print_t(t);  // imprimo lo leido de a EEPROM


  time_t s_tm = tmConvert_t(13,05,00,14,11,2017);
  
  Serial.println("Hora fijada");
  print_t(s_tm);

}

void loop()  {   

    time_t t = now();

 
    bool estado = digitalRead(pinBoton);

    if (!estado && estadoAnt) {
        int eeAddress = 0;   //Location we want the data to be put.
        //One simple call, with the address first and the object second.
        EEPROM.put(eeAddress, t);
        Serial.println();
        Serial.println("Hora guardada.");
        print_t(t);
    }
    estadoAnt = estado;
    print_t(t);
    delay(1000);     
}

Debería ser una guia mas que suficiente con que comenzar

1 Like

Hola Surbyte, muchas gracias por el ejemplo, voy a practicar hoy cuando tenga un poco de tiempo, tengo que ver como hacer este ejemplo tomando la hora de un Reloj DS3231, cualquier cosa que se me complica vuelvo a molestar,

Una pregunta, disculpa mi ignorancia, supongo que la hora y el fecha esta en la variable t,

si quisiera mostrar sólo la fecha con un ----- Serial.println,

sin la funcion ----- void print_t(time_t temp)

Cómo tendria que hacerlo?

Muchismas Gracaias

Trabaja un poquito!!

Con esta rutina imprimes todo, con modificarla tienes lo que preguntas. busca como funciona sprintf y comprenderas que relación existe entre cada %02d y la variable.

void print_t(time_t temp) {
  char buffer[30];

  sprintf(buffer, "%02d:%02d:%02d %02d/%02d/%02d", hour(temp), minute(temp), second(temp), day(temp), month(temp), year(temp));
  Serial.println(buffer);
}

Compra un libro, aprende ejercita y luego continua, sino te será muy dificil preguntar todo. No lo tomes a mal, es un consejo para tu crecimiento como programador.

Seguire tu consejo, muchas gracias.

Un abrazo

hola, yo tengo un dispositivo que utiliza un modulo adicional (reloj tiempo real), aun esta en pruebas pero lo diseñe para que guarde 30 fechas diferentes:

void EEPROM_write  (void)						        
 {											
    uint16_t year;							        
    uint8_t month;
    char    day;
    uint8_t hour;
    uint8_t minu; 
    uint8_t sec;
    uint16_t Address;								
    EEPROM.get(451, Address);

    if (Address == 450)
    	{
    		Address=0;
    	}

   	DateTime now = rtc.now();						    
    
    year  = now.year();
    month = now.month();
    day   = daysOfTheWeek[now.dayOfTheWeek()];
    hour  = now.hour();
    minu  = now.minute();
    sec   =	now.second();

    EEPROM.put( Address    , year );
    EEPROM.put( Address + 3, month);
    EEPROM.put( Address + 5, day  );
    EEPROM.put( Address + 7, hour );
    EEPROM.put( Address + 9, minu );
    EEPROM.put( Address + 11, sec );
    EEPROM.put( Address + 13, contador_a );
    EEPROM.put( Address + 16, contador_b );
    EEPROM.put( Address + 19, contador_c );
    EEPROM.put( Address + 22, contador_d );

    Address = Address + 25;
    EEPROM.put( 451, Address);
}

un problema con el que me he encontrado es el valor inicial de Address, pues si te fijas una de las primeras cosas que hace la funcion es cargar el valor de Address de la memoria eeprom, si se carga el programa en el arduino y se ejecuta el codigo por primera vez que valor tendra Address cuando se aceda a esta funcion, cabe anotar que esa posicion de la eeprom solo es modificada por esta funcion (posicion 451, y la funcion EEPROM_WRITE)

No entiendo como tu comentario sebas3124 está relacionado con el anterior o es una nueva consulta?

sebas3124:
si se carga el programa en el arduino y se ejecuta el codigo por primera vez que valor tendra Address cuando se aceda a esta funcion

Ya que Address es de tipo uint16_t, hay dos posibles primeros valores dependiendo de cómo dejaron los bits de la EEPROM al momento de la fabricación del microcontrolador:

Si todos los bits están en cero, pues retornará 0 la primera vez.
Si todos los bits están en uno, pues retornará 65535 la primera vez.