Como usar la memoria EEPROM de Arduino

Como usar la memoria EEPROM de Arduino

Como usar la memoria EEPROM de Arduino



¿Sabes que tu Arduino tiene una memoria no volátil? Es decir, tiene una memoria EEPROM, la cual no se borra ni pierden sus datos cuando dejamos de alimentar a nuestro Arduino. En el post de hoy, aprenderemos a menejar esta memoria, escribir en ella, leer de ella...
Por lo general la memoria EEPROM está muy desaprovechada por los que usamos Arduino, no se si será por miedo a utilizarla o por desconocimiento, lo que está claro es que tendríamos que cambiar esto, ya que en pocas lineas en nuestro programa podemos tener un recurso muy útil.
Utilizar la EEPROM es realmente fácil y es muy aconsejable para recuperar la configuraciones de nuestro Arduino, tales como calibraciones de sensores (una vez calibrado un sensor no es necesario volver a hacerlo puesto que los limites están guardados en la EEPROM), contadores de tiempo de uso, de modo que cuando Arduino deje de estar alimentado no pierda la cuenta de tiempo de funcionamiento...etc.

Capacidad de la EEPROM de Arduino.

La mayoria de los modelos de Arduino, tienen un 1KB disponible de EEPROM, puesto que la mayoria de los Arduinos estan basados en el mismo microcontrolador, el AtMega328. Una excepción es el Arduino Mega, este tiene una capacidad de 4KB para la EEPROM.

Practica.

Materiales necesarios.

arduino leantec -Arduino UNO
protoboard leantec -Protoboard 400 contactos.
potenciometro leantec -Potenciómetro
cables leantec -Cables





Programar la EEPROM.


Antes de progrmarla, saber que tenemos disponibles 1000 huecos de memoria EEPROM, es decir de 0 a 999; en cada uno de estós huecos podemos almacenar un número no más grande de 255. Esto es importante a la hora de almacenar datos recogidos en las entradas analógicas de Arduino, ya que estás pueden llegar a 1023.

El primer paso para programar la EEPROM es incluir la librería:

#include <EEPROM.h>

Esta librería está en el IDE de Arduino por defecto, por lo que no tendremos que agregarla ni descargarla.

Vamos a ver las dos funciones principales de está librería:

Esta primera función nos escribe en la memoria. Donde el primer dato que ponemos es el hueco o dirección de memoria que usaremos y el segundo el dato que queremos guardar.
  
EEPROM.write(Direccion, contador);//Guardamos el valor en la dirección de la EEPROM elegida
Y por último esta otra función nos ayuda a leer la memoria. Aquí solo tenemos que poner la dirección del hueco que queremos leer y utilizar.

contador = EEPROM.read(Direccion);//Guardamos en la variable contador el valor almacenado en la dirección elegida.
 

Programa completo.

Este programa almacena el valor registrado por un sensor en la EEPROM y lo rescata aunque dejemos de alimentar nuestro Arduino. 
Tambien el programa es un contador el cual guarda el último valor de este contador aunque dejemos de alimentar nuestro Arduino.
#include <EEPROM.h>//Se incluye la librería EEPROM

int SensorPin = A0;//Declaramos el pin analógico que usaremos más delante. 
int Direccion = 0;//Declaramos una variable donde guardamos la dirección de la memoria que usaremos. En este caso 0.
int contador=0;//Declaramos una variable para guardar los valores de la EEPROM más adelante en el programa.
int ValorSensor=0;//Declaramos una variable para guardar los valores de la EEPROM más adelante en el programa.
int UltimoValorSensor=0;//Aqui guardaremos el ultimo valor guardado en la EEPROM antes de que Arduino se apague.
 
void setup()
{
  Serial.begin(9600);//Iniciamos el puerto serie.
  Serial.println("inicio");//Imprimimos inicio para saber con el monitor serial donde empieza nuestro programa.
  contador = EEPROM.read(Direccion);//Guardamos en la variable contador el valor almacenado en la dirección elegida.
  UltimoValorSensor = EEPROM.read(Direccion+1);//Guardamos en la variable UltimoValorSensor.
 
void loop()
{  
  ValorSensor = analogRead(SensorPin);//Leemos el valor en el pin analógico y lo guardamos en ValorSensor.  
  ValorSensor = ValorSensor/4;//Dividimos este valor entre 4. Esto lo hacemos porque no podemos almacenar más de 255.
  //---------------------------------------------------------------------------------------
  //En esta primera parte imprimiremos los valores del sensor registrados 
  //y el ultimo almacenado antes de apagar Arduino
  //---------------------------------------------------------------------------------------
  Serial.print("En la direccion ");//Imprimimos(En la direccion) 
  Serial.print(Direccion+1);//Imprimimos la variable Dirección+1.
  Serial.print(" esta almacenado el ultimo valor del senor: ");//Imprimimos(esta almacenado el ultimo valor de senor)  
  Serial.println(UltimoValorSensor);////Imprimimos la variable UltimoValorSensor 
  Serial.print("El valor actual es:");//Imprimimos las palabras (El valor actual es:)
  Serial.println(ValorSensor);////Imprimimos la variable ValorSensor 
  Serial.println("-------------------------------------------------");//Imprimimos lineas.
  //--------------------------------------------------------------------------------------
  //En esta segunda parte imprimimos los valores del contador. 
  //Apagando y volviendo a encender Arduino, podemos comprobar que el contador
  // continua su cuenta en el último numero que se quedó
  //--------------------------------------------------------------------------------------
  Serial.print("En la direccion ");//Imprimimos (En la direccion) 
  Serial.print(Direccion);//Imprimimos la variable Dirección.
  Serial.print(" esta almacenado el valor: ");//Imprimimos (esta almacenado el valor:)
  Serial.print(contador);////Imprimimos la variable contador 
  Serial.println(" del contador");//Imprimimos (del contador)
  delay(2000);//Esperamos 2 segundos
  //El siguiente bucle comprueba que contador sea igual a 255 y si es igual carga en valor un 0
  //Esto lo hacemos porque en una dirección de momoria EEPROM no podemos almacenar un valor por encima de 255.
  if(contador==255){
  contador=0;}
  
  contador++;//Sumamos uno a la variable contador
  
  EEPROM.write(Direccion, contador);//Guardamos el valor en la dirección de la EEPROM elegida
  EEPROM.write(Direccion+1, ValorSensor);//Guardamos el valor en la dirección de la EEPROM elegida
}

Resultados

Para probar el funcionamiento del programa en nuestro caso usamos un potenciometro de 10K conectado a nuestro Arduino.

potenciometro leantec

Arrancamos el monitor serial y comprobamos cual es el último valor guardado del sensor y tambien comprobamos como el contador aumenta su valor cada dos segundos.

eeprom leantec

En la siguiente captura del monitor serial podemos comprobar como, despues de dejar de alimentar Arduino y volver a alimentarlo, el último valor del sensor se mantiene como el antes mientras que el valor actual a cambiado al mover el cursor del potenciometro.
Mientras tanto el contador sigue contando desde el último valor antes de desconectar Arduino.

eeprom leantec

Ahora, en la siguiente imagen, vemos que el valor actual anterior a pasado a ser el último valor almacenado. Esto ocurrio al desconectar Arduino de la alimentación.
Mientras el contador sigue contando sin resetearse.

eeprom leantec

Esto es todo en nuestro post de memoria EEPROM en Arduino. Esta capacidad nos habre las puertas de interesantes proyectos en los que necesitemos almacenar algunos datos, aunque nuestro Arduino deje de estar alimentado.

4 Comments

    • Avatar
      Leyre
      oct 13, 2015

      Hola, muchas gracias por enseñar con sus tutoriles, me ha insiprado a pensar en arduino y a una idea-duda. Si modificaramos la direccion, por encenderhoras =0 y encenderminutos=1, luego apagararhoras=3 y apagarminutos=4 Cambiar valorsensor por incremeto=0 y decrimento=0 estos en pwm. se podria hacer modificando el codigo que almacenando esos datos en la eeprom y con un rtc, mañana los repitiera pero en lugar de a la misma hora, 20 minutos antes el encendido y 40 minutos mas tarde el apagado. Muchas gracias

    • Avatar
      Yo
      nov 26, 2016

      Nos habre las puertas????

    • Avatar
      guto
      dic 29, 2016

      hola, que hay sobre la vida útil de la eeprom, tengo entendido que solo acepta 100000 de escritura o borrado antes de morir

    • Avatar
      Fernando
      dic 20, 2018

      Gracias por tu enseñanzas genial me a funcionado en un arduino nano ,Ahora voy a por un esp8266 saludos fernando

Leave a Reply

* Name:
* E-mail: (Not Published)
   Website: (Site url withhttp://)
* Comment:
Type Code

Blog Search

Recent Articles

Latest Comments

Accept Este sitio web hace uso de cookies