La memoria EEPROM, cuyas siglas provienen de "Electrically Erasable Programmable Read-Only Memory" (ROM programable y borrable eléctricamente), representa un componente fundamental en el ámbito de la electrónica, especialmente en sistemas embebidos como los microcontroladores de Arduino. A diferencia de la memoria RAM, que pierde su contenido al interrumpirse el suministro eléctrico, la EEPROM ofrece la capacidad de almacenar datos de forma persistente, incluso tras apagados o reinicios del dispositivo. Esta característica la convierte en una solución ideal para guardar configuraciones, estados o cualquier tipo de información que deba perdurar en el tiempo.

Fundamentos de la EEPROM
La EEPROM se distingue por su naturaleza no volátil, lo que significa que retiene la información almacenada sin necesidad de energía continua. Su funcionamiento se basa en la capacidad de ser programada, borrada y reprogramada eléctricamente, un avance significativo respecto a tecnologías anteriores como la EPROM, que requerían exposición a luz ultravioleta para su borrado. Los dispositivos que emplean memoria EEPROM suelen comunicarse mediante protocolos estandarizados como I²C, SPI y Microwire, facilitando su integración en diversos sistemas electrónicos.
La memoria flash, una evolución de la EEPROM, fue desarrollada por el Dr. Fujio Masuoka mientras trabajaba para Toshiba en 1984, y presentada formalmente en 1984. Si bien la memoria flash es una forma avanzada de EEPROM, la EEPROM tradicional sigue siendo relevante por su simplicidad y aplicación en escenarios donde la persistencia de datos a pequeña escala es crucial.
La EEPROM en el Contexto de Arduino
Para los aficionados y desarrolladores que trabajan con plataformas como Arduino, la memoria EEPROM adquiere una relevancia particular. Cuando se declara una variable en un programa de Arduino, su ciclo de vida está intrínsecamente ligado a la alimentación del microcontrolador. Una vez que la alimentación se interrumpe, el valor de dicha variable se pierde. Para solventar este problema y asegurar que los datos almacenados sean accesibles para uso futuro, se recurre a la memoria EEPROM. Incluso cuando Arduino se reinicia o se apaga, la EEPROM mantiene sus valores guardados.
El microcontrolador ATmega328P, presente en placas populares como Arduino UNO y Nano, cuenta con una capacidad de 1.024 bytes (1 KB) de memoria EEPROM. La hoja de datos de este microcontrolador especifica que su memoria EEPROM soporta hasta 100.000 ciclos de lectura/escritura. Aunque esta cifra pueda parecer elevada, es importante comprender que la EEPROM no está diseñada para operaciones de escritura masiva y frecuente, como lo sería una memoria RAM. Su propósito es el almacenamiento duradero de datos, no su manipulación temporal y veloz.

Acceso y Manipulación de la EEPROM en Arduino
Para interactuar con la memoria EEPROM en el entorno de Arduino, se utiliza la librería EEPROM.h, que viene incluida por defecto con el IDE de Arduino. Esta librería proporciona funciones sencillas para leer y escribir datos en la memoria.
La estructura de la memoria EEPROM está dividida en "huecos", donde cada hueco representa un byte. Para guardar un dato, es necesario especificar tanto la posición de memoria (dirección) como el valor a almacenar. Es importante considerar que un dato puede ocupar más de una posición de memoria; por ejemplo, una cadena de texto dependerá de la cantidad de caracteres que la compongan.
Para ilustrar la gestión de la memoria, consideremos el escenario de guardar primero el número 25 y luego la palabra "Arduino". En este caso, la gestión de la memoria y la interpretación de los datos almacenados recaen en el desarrollador. Esto es especialmente relevante cuando se utilizan aplicaciones como Blynk para la comunicación bidireccional con Arduino, o cuando se necesita almacenar configuraciones personalizadas. Si, en un momento dado, la alimentación de Arduino se desconecta, los datos guardados en la EEPROM permanecerán intactos.
La librería EEPROM.h está optimizada para leer datos byte a byte o tipos de datos más complejos como int o float. No es necesario declarar un objeto de esta clase, ya que se comporta como una clase estática, similar a la clase Serial.
Funciones Clave de la Librería EEPROM
EEPROM.write(direccion, valor): Esta función escribe un byte en la posición de memoria especificada.direccion: Es la posición de la memoria EEPROM donde se escribirá el byte, comenzando desde 0.valor: Es el dato a escribir, un valor entero entre 0 y 255.
EEPROM.read(direccion): Lee un byte de la posición de memoria indicada.direccion: Es la dirección de memoria desde la cual se leerá el dato.
EEPROM.update(direccion, valor): Esta función es muy útil para optimizar el uso de los ciclos de escritura de la EEPROM. Solo actualiza el byte en la dirección especificada si el nuevo valor es diferente al valor actual.direccion: Es la dirección de memoria que se pretende actualizar.valor: Es el nuevo valor que se quiere actualizar.
EEPROM.put(direccion, valor): Permite escribir cualquier tipo de dato (no solo un byte) en la EEPROM. La librería se encarga de gestionar cuántos bytes ocupa el dato y dónde se almacenan.direccion: Es la posición de memoria de la EEPROM donde se quiere empezar a escribir, comenzando por cero.valor: Es el valor del tipo de dato que se quiere guardar.
EEPROM.get(direccion, valor): Lee cualquier tipo de dato almacenado en la EEPROM.direccion: Es la dirección de memoria donde se quiere empezar a leer el dato.valor: Es la variable del tipo de dato que se va a leer. En ella se almacenará el valor leído.
Arduino desde cero en Español - Capítulo 39 - EEPROM memoria incorporada No Volátil teoría/ práctica
Ejemplo Práctico: Control de Modos de Animación con EEPROM
Un ejemplo práctico de la aplicación de la memoria EEPROM en Arduino es el control de modos de animación para un LED. En este escenario, se utiliza la librería EEPROM.h para almacenar el modo de animación seleccionado, de modo que al apagar y volver a encender el dispositivo, este retome el último modo configurado.
El proceso implica:
- Incluir la librería: Se comienza añadiendo
#include <EEPROM.h>al principio del código. - Configurar el hardware: Se define el pin donde está conectado un pulsador y se configura como
INPUT_PULLUP. Este modo activa una resistencia interna, eliminando la necesidad de una resistencia externa física. - Lectura inicial del estado: Al iniciar el programa, se lee la posición de memoria de la EEPROM para obtener el dato guardado, que representa el modo de animación.
- Validación del dato: Se implementa una condicional
ifpara verificar si el valor leído se encuentra dentro de los rangos esperados (por ejemplo, entre 1 y 3 para los modos de animación). Esto asegura que el sistema comience en un estado conocido. - Detección de pulsaciones: Se lee el estado del pulsador. Se utiliza un tiempo de espera para mitigar el efecto rebote de los pulsadores, un fenómeno común que puede generar múltiples lecturas erróneas por una sola pulsación física.
- Actualización del modo y guardado en EEPROM: Cuando se detecta una pulsación válida del pulsador, se actualiza la variable que controla el modo de animación. Posteriormente, se utiliza
EEPROM.update()para guardar el nuevo modo en la memoria EEPROM, asegurando su persistencia. El uso deupdate()en lugar dewrite()es una optimización para no gastar ciclos de escritura innecesariamente si el valor no ha cambiado. - Visualización y prueba: Tras cargar el código, se puede observar en el monitor serie el modo de animación inicial. Al interactuar con el pulsador, se puede cambiar el modo y verificar que los cambios se aplican correctamente. Incluso al desconectar la alimentación y volver a encender el dispositivo, se constatará que el último modo configurado se mantiene.
Este ejemplo demuestra la sencillez y eficacia con la que se pueden almacenar datos permanentes en Arduino utilizando la memoria EEPROM, permitiendo crear dispositivos con comportamientos configurables y persistentes. La gestión de la memoria, aunque requiere una comprensión básica de las direcciones y los tipos de datos, es accesible gracias a las funciones proporcionadas por la librería EEPROM.h.