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.