En este momento estás viendo Uso de la memoria EEPROM de Arduino

Uso de la memoria EEPROM de Arduino

La memoria EEPROM es la memoria persistente donde se almacenan datos que se desea que permanezcan guardados una vez apagado el microcontrolador para poderlos usar posteriormente en siguientes reinicios. En el caso del ATmega328P esta memoria tiene una capacidad de 1 KB, por lo que se puede entender como una tabla de 1024 posiciones de un byte cada una. Según Atmel, la EEPROM del ATmega328P es capaz de soportar 100.000 ciclos de lectura/escritura, por lo que debemos ser cuidadosos con su uso. Por ejemplo, no dejar la función de escritura en el loop() sin algún condicional que administre su uso.

La operación de escritura toma 3.3ms para ejecutarse por lo que debemos ser cautos en donde colocamos esa función. Una alternativa a la memoria EEPROM son las tarjetas SD, que también pueden ser leídas por Arduino.

Para poder acceder a la memoria EEPROM debemos usar la librería estándar EEPROM desde el IDE de Arduino, usando la ruta “Programa/Importar librería…EEPROM” lo cual nos insertara el include al inicio de nuestro programa (#include <EEPROM.h>).

Las funciones básicas disponibles en la librería son:

EEPROM.read()

Lee un byte de la celda especificada.  Las celdas que no han sido escritas previamente guardan un valor de 255.

Sintaxis

EEPROM.read(dirección)

Parámetro

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0).

Ejemplo 1 – Lectura de 1024 bytes de memoria EEPROM

#include <EEPROM.h>  //Incluye la librería para el manejo de la memoria EEPROM

byte valor;  //declara una variable para almacenar el valor de las posiciones de memoria

void setup(){
  Serial.begin(9600);         //inicializa el puerto serial
  for (int a=0;a<1024;a++){
    for(int b=0;b<10;b++){
      valor = EEPROM.read(a);  //lee una posición de memoria indicada por la variable a
      Serial.print(a);  //imprime la posición de memoria leída
      Serial.print(" ->");  //añade en una marca
      Serial.print("\t");  //añade en una línea una tabulación
      Serial.print(valor);  //imprime el valor de la posición de memoria a
      Serial.print("\t");  //añade en una línea una tabulación
      a++;  //incrementa la dirección
      if(a==1024) break;  //imprime hasta la dirección 1023
    }
    Serial.println();  //imprime un salto de línea
  }
}

void loop(){}

EEPROM.write()

Esta función escribe un byte en una celda especificada de la EEPROM. Tiene dos parámetros: el primero es el número de celda donde se escribirá el byte (existen 1024, empezando por la número 0); el segundo es el valor a escribir, el cual ha de ser un valor entero entre 0 y 255. No tiene valor de retorno.

Sintaxis

EEPROM.write(dirección,valor)

Parámetros

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0)..

valor: Es el valor a escribir en la memoria

Ejemplo 2 – Escribir un valor en toda la memoria

#include <EEPROM.h>     //Incluye la librería para el manejo de la memoria EEPROM

void setup(){
for (int i = 0; i < 255; i++) //está configurado para ejecutarse 255 veces el lazo
  EEPROM.write(i, i);  //escribe en la dirección de memoria  i el valor de i
}
void loop(){}

EEPROM.update()

Escribe un byte en la EEPROM. El valor es escrito solo si es diferente al valor que esta previamente almacenado en esa posición de memoria.

Sintaxis

EEPROM.update(dirección,valor)

Parámetros

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0).

valor: Es el valor a escribir en la memoria

EEPROM.put()

Y esta función escribe cualquier tipo de dato en la EEPROM. El valor es escrito solo si es diferente al valor que esta previamente almacenado en esa posición de memoria, lo cual la hace mucho mas versátil.

Sintaxis

EEPROM.put(dirección,valor)

Parámetros

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0).

valor: Es el valor a escribir en la memoria

Ejemplo 3 – Guarda una variable tipo float en la memoria EEPROM

#include <EEPROM.h>     //Incluye la librería para el manejo de la memoria EEPROM

void setup() {
  Serial.begin(9600);  //inicializa el puerto serial
  float f = 123.5;  //declaro una variable float
  int direccionInicio = 0;  //declaro una variable con la dirección de inicio
  EEPROM.put(direccionInicio, f);  //escribe la variable f en la dirección definida
  Serial.println("Escribe una variable tipo float");
 }
void loop(){}

EEPROM.get()

Y usaremos «get» para Leer cualquier tipo de dato en la EEPROM.

Sintaxis

EEPROM.get(dirección,variable)

Parámetros

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0).

variable: Es el nombre de la variable donde guardaremos el valor leído de la memoria

Ejemplo 4 – Leer una variable tipo float de la memoria EEPROM

#include <EEPROM.h>     //Incluye la librería para el manejo de la memoria EEPROM

void setup() {
  Serial.begin(9600);         //inicializa el puerto serial
  float f = 0;             //declaro una variable float y la inicializo en 0.
  int direccion = 0;          //declaro una variable con la dirección de inicio
  Serial.print( "Lee un float de la EEPROM: " );
  EEPROM.get( direccion, f );   //lee una variable float de la posición indicada de memoria
  Serial.println( f, 3 );                   //imprime el valor con 3 decimales
}

void loop() {}

EEPROM[]

Y finalmente esta función permite usar el identificador EEPROM[] como una matriz en la cual indicamos la dirección. Su sintaxis es

EEPROM[dirección]

Parámetros

direccion: el número de celda de la memoria (existen 1024, empezando por la número 0).

Ejemplo 5 – Uso de la función EEPROM[]

#include <EEPROM.h>

void setup(){
  unsigned char val;
  val = EEPROM[ 0 ];        //lee un valor de la dirección 0 de la EEPROM
  EEPROM[ 0 ] = val;        //escribe un valor en la dirección 0 de la EEPROM
  if(val == EEPROM[0]){
    //haz algo...
  }
}

void loop(){ }

Ejercicios

 Ejercicio 1: Verificar valores en EEPROM

Crear un programa que lea las posiciones de memoria EEPROM de la 0 a la 100 y cuente cuantas de ellas son diferentes de 255.

 Ejercicio 2: Escribir y leer la memoria

Para completar este ejercicio debemos crear un par de programas, uno que escriba los valores 2.5 y 56.2 en las posiciones de memoria 10 y 20 de la memoria EEPROM (después de escritos los valores en la memoria, probemos desconectar la placa por unos segundos), y luego otro programa los leerá y mostrara en el monitor serial. Para verificar que lo hicimos correctamente

Ejercicio 3: Guardar parámetros

Una puerta automática requiere que ajustemos al momento del montaje el tiempo preciso de cierre, y se guarde ese valor en memoria EEPROM para que funcione correctamente. Hagamos un programa que solicite ese valor por el puerto serial, y lo guarde en memoria EEPROM, el mismo programa leerá el valor de memoria y nos indicara que ha sido guardado correctamente. El tiempo de cierre de la puerta a configurar variara desde 4.5 a 10 segundos.

Y con los ejercicios hemos culminado la lección, espero te allá sido de provecho.

Y si aun no te has suscrito a nuestro boletín, suscríbete y te mantendré informado de  la últimas publicaciones y entregas especiales. Y si tienes alguna pregunta o comentario acerca del post no dudes en hacerla.

Deja una respuesta