Guardando datos en Arduino utilizando la memoria EEPROM

16
21183

Los que han utilizado Arduino se habrán dado cuenta que cuando se reinicia el micro controlador utilizando el botón «reset» o bien, encendiendo y apagando el Arduino, el programa que esté colocado la memoria se reiniciará y no será posible utilizar cualquier dato que se haya tenido antes del reinicio. Si se tiene por ejemplo los datos de un sensor, todo lo que se haya leído se perderá en el reinicio.

Se dice que la memoria de Arduino, donde se almacena el código es una memoria volátil, cuyo contenido se borra cuando se interrumpe el flujo eléctrico. Sin embargo, Arduino al igual que muchos otros micro controladores posee una memoria no volátil, con un espacio de almacenamiento más reducido que la memoria volátil, pero aún así muy útil para nuestros propósitos.

Me estoy refiriendo a la memoria EEPROM (Electrically Erasable Programmable Read-Only Memory, o ROM programable y borrada eléctricamente).

Casi todos los modelos de Arduino tienen una EEPROM disponible, con diferentes capacidades dependiendo del modelo.

Image La información que se guarde en la memoria EEPROM podrá ser recuperada aún después de reiniciarse el micro controlador. Para lograr esto Arduino incluye la librería EEPROM que viene junto con Arduino IDE en el paquete que se descarga directamente desde la página oficial de Arduino. Consta básicamente de dos métodos:

  • read()
  • write()

Con el método read() se lee los valores que se hayan guardado en determinada posición de memoria, mientras que con el método write() se guarda la información en las posiciones de memoria. Las posiciones de memoria son el equivalentes a «casillas» donde se guarda la información. La cantidad de «casillas» disponibles depende del modelo. La cantidad de bytes equivale a la cantidad de casillas, por lo que un modelo de 512 bytes tendrá disponibles 512 «casillas» disponibles para guardar datos. Para escribir datos se utiliza: write(posición, valor) Ejemplo:

Para leer los datos se utiliza: read(posición) Ejemplo:

Espero que la información suministrada sea de utilidad. Saludos.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

16 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
Juan del angel
Juan del angel
3 years ago

En la línea…….. If ( mins 255)….era mins <= 255… Además me faltaron las llaves principales del void loop { },,,,, y seguramente tiene algunos errores de sintaxis ,pero lo escribí sin copy paste a manera de idea,y teniendo años sin manejar "ide"…… También la variable mins bien podria ser cambiada por una tipo unsigned long o una double ya que estaría cachando valores de los minutos,y la int maneja números de hasta 32 767,,(alcanzaría para unos 20 o 22 días,continuos de conteo,, solamente).. y ya poniéndonos más exigentes la variable "grabo" debe ser tipo byte ya que solo tomara… Read more »

Juan del angel
Juan del angel
3 years ago

Estás manejando led1 como entrada ,por que preguntas «if»,(osea; si led1 está recibiendo voltaje o no lo está recibiendo,hago tal cosa)..deberías manejar led1 como salida»output»,sí quieres grabar el tiempo de encendido de tu luminaria es por que no sabes cuántas hrs durara encendida, Ya que Supongo no enciendes la luminaria con 1 botón. https://www.electronicamain.com/un-sensor-de-luz-arduino-mediante-ldr/ Ejem; lees en pin A0,determinado voltaje que cae,en la ldr o en la resist.,te dará 1 valor entre 0 y 1024,en el monitor serial,por ejem,si está leyendo 2.5volts,te leera 512, y así proporcionalmente.ya depende en qué valor te bases tu. Eso, Si estás,alimentando por vcc los… Read more »

Jesús Eduardo
Jesús Eduardo
4 years ago

Saludos, disculpen si es tarde la respuesta pero la EEPROM de arduino al escribir un dato, este queda registrado sin posibilidad de borrarlo, solo reescribir la posición de memoria que almacena el dato, si esta vacía e intentas escribir un dato en alguna salida, pues no hará absolutamente nada, si la salida estaba en HIGH permanecerá así y viceversa.

Jesús Eduardo
Jesús Eduardo
5 years ago

Saludos desde Venezuela, hice unas pruebas con un simulador de arduino para no cargar tantas veces el programa al micro y no acortar tanto la vida util del mismo. El objetivo es que al encender o apagar una salida, yo pueda guardar ese dato en la EEPROM pero al hacerlo siempre me queda en uno el ultimo estado. El motivo es que con arduino tengo un controlador de luminarias horario y con variables no puedo hacerlo por razones mas que obvias, con esto quiero controlar el hecho de que al llegar la noche (hora de encendido) si se interrumpe el… Read more »

Antony García González
Antony García González
5 years ago
Reply to  Jesús Eduardo

Puedes utilizar una memoria más grande, como una microSD o una EEPROM externa

Juan del angel
Juan del angel
3 years ago
Reply to  Jesús Eduardo

Añade dentro de tu mismo proyecto el proyecto de reloj de tiempo real con respaldo con una batería, o 1 pequeño no-break,para tu ardui,,por si hay apagón de luz o reseteo de la tarjeta,,.O al estarlo alimentando con eliminador,de la pared,pues le pones un capacitor de buen faradiaje, paralelo a gnd y vcc de arduino,y al desactivarse la polarización de un relevador,le mandas voltaje de otra fuente como 1 pila,por ejemplo……obviamente el Arduino lo estás alimentando en el normalmente abierto pero al desactivar la bobina ahora el Arduino se alimente por el normalmente cerrado,de una batería,al irse la luz el… Read more »

Antony García González
Antony García González
6 years ago

Puedes usar módulos microSD o SD. Hay modelos de Arduino que los traen integrados

Antony García González
Antony García González
6 years ago

Agrega registros del estado del proceso a la memoria EEPROM

Antony García González
Antony García González
6 years ago

No estoy seguro. Debe ser 0 o 255. Lo ideal es escribir las posiciones vacías en 0 antes de empezar a usar la EEPROM

rodrigo avila
rodrigo avila
6 years ago

este es mi programa:
if(led1==HIGH){
long t0=millis();
}
if(led1==LOW){
long t1=millis();
tiempoleds=t1-t0
EEPROM.write(1,tiempoleds);
}

como le hago para que sea un ciclo y que cada que se prenda y se apague durante el dia ese led , me guarde los tiempos en la variable tiempoleds?

Lalo León
Lalo León
6 years ago

Hola que tal, antes que nada te felicito por tu profesionalismo y gran entusiasmo en el mundo de los microcontroladores ya que gracias a este espacio me haz salvado de grandes problemas… bueno mira quiero manejar numeros negativos con arduino usando la EEPROM, entonces quisiera saber que me recomiendas hacer para solucionar este problema ya que el momento de escribir por ejemplo -1 en algun espacio de memoria lo guarda con el valor 254, por lo que utiliza complemento a 2 para guardarlo peor para leerlo no lo lee como -1, sino como 254. EL problema está al leer el… Read more »

PanamaHitek
6 years ago
Reply to  Lalo León

Coloca el código que estas ejecutando, necesito saber el tipo de variable que estas usando.

Jorge
Jorge
9 years ago

Muestras una gran profesionalidad y una pedagogía excelente para explicar tus proyectos. Muchas gracias, me estoy iniciando en Arduino y tu página es muy buena, te seguiré en Facebook, saludos desde España.

PanamaHitek
6 years ago
Reply to  Jorge

Gracias.

Asís M.
Asís M.
9 years ago

Gracias por el tiempo que dedicas a estos asuntos.
Me gusta seguir tus publicaciones.

antonygarciagonzalez
9 years ago
Reply to  Asís M.

Gracias por los comentarios