Go Down

Topic: Guardar Fecha en la EEPROM (Read 106 times) previous topic - next topic

larbos

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.

surbyte

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

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

larbos

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


surbyte

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.

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


larbos

Seguire tu consejo, muchas gracias.

Un abrazo

Go Up