Arduino EEPROM

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.

Etiquetas: , , ,

8 Comments

  • KEVIN OSPINO SILGADO dice:

    buenas tardes, tengo una memoria eprom, especificamente la 27c160 y quisiera saber como puedo leer y escribir datos con fecha y hora. muchas gracoas

  • Juan Luis dice:

    Hola, tengo entendido que el número de veces que se puede grabar datos en la EEPROM está limitado físicamente. Si lo hacemos como en el ejemplo que proponéis se escribirá cada 2 segundos un dato en la memoria EEPROM del Arduino. Bueno supongo que como ejemplo vale, en la práctica se haría de otra forma para preservar este recurso y no quedarte sin placa en un santiamén.

    • Jhon Arandia dice:

      hola Juan Luis, no se si podes ayudarme, tengo que hacer un programa el cual me cuente el ingreso de personas a un determinado lugar, el flujo de personas es de 1000 por dia, y debo mantener guardado este dato en la EEprom actualizandose constantemente cada vez que alguien entra, porque podria ocurrir el caso que mi arduino se apague por mal manejo de otras personas y tengo el temor que mi arduino empiece el contador a Cero. que consejo me podrías dar?

  • Estimado, y cuanta es la vida util de la memoria eeprom?

    • Juan Luis dice:

      Pues en el foro de Arduino comentan que 100000 operaciones de grabación o borrado. Osea 55.5 horas si dejas funcionando el sketch del ejemplo. En dos días Arduino fundido.

  • Fernando dice:

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

    saludos fernando

  • guto dice:

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

  • Leyre dice:

    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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *