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)
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
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,
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.
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.
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:
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)
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.