04/05/2024
En el entorno de la programación de microcontroladores Arduino, la necesidad de almacenar datos de forma persistente, incluso después de apagar el dispositivo, es frecuente. Aquí es donde entra en juego la EEPROM (Electrically Erasable Programmable Read-Only Memory), una memoria no volátil integrada en la mayoría de las placas Arduino. Este artículo profundiza en el uso de la librería EEPROM en Arduino, explicando su funcionamiento, aplicaciones y ejemplos prácticos.
¿Qué es la EEPROM?
La EEPROM es un tipo de memoria que permite almacenar datos de forma permanente, a diferencia de las variables RAM que se pierden al reiniciar el Arduino. A diferencia de la memoria flash, la EEPROM permite la escritura y borrado de datos individualmente, aunque con un número limitado de ciclos de escritura.
EEPROM en Arduino: Características y limitaciones
La capacidad de la EEPROM varía según el microcontrolador utilizado en la placa Arduino. A continuación, se muestra una tabla comparativa:
| Microcontrolador | Capacidad EEPROM |
|---|---|
| ATmega328 (Arduino Uno, Nano, Mini) | 1024 bytes |
| ATmega168 (Arduino Nano) | 512 bytes |
| ATmega2560 (Arduino Mega) | 4096 bytes |
Tener en cuenta que cada posición de la EEPROM almacena un byte (8 bits), lo que limita el tipo de datos que se pueden guardar. Para almacenar datos más complejos, se requiere un manejo adecuado de la estructura de datos.
Una limitación crucial de la EEPROM es su ciclo de vida finito. Cada posición de memoria tiene un número limitado de ciclos de escritura/borrado (usualmente alrededor de 100,000). Las lecturas, en cambio, no afectan su vida útil. Por ello, es fundamental utilizar las funciones de la librería de forma eficiente.
Librería EEPROM: Funciones principales
La librería EEPROM proporciona las funciones necesarias para interactuar con la memoria EEPROM del Arduino. Para utilizarla, se debe incluirla en el código con la directiva:
#include <EEPROM.h>Las funciones más importantes son:
- EEPROM.write(address, value); : Escribe un byte (
value) en una dirección específica (address) de la EEPROM. - EEPROM.read(address); : Lee un byte de la EEPROM desde la dirección especificada (
address). - EEPROM.update(address, value); : Escribe un byte solo si el valor actual en la dirección especificada es diferente al nuevo valor. Esto ayuda a extender la vida útil de la EEPROM al minimizar los ciclos de escritura.
Ejemplos prácticos de uso de la librería EEPROM
Ejemplo 1: Almacenar y recuperar un número entero
Este ejemplo muestra cómo almacenar un entero en la EEPROM y recuperarlo posteriormente:
#include <EEPROM.h>void setup() { Serial.begin(9600); int myInt = 1234; EEPROM.write(0, myInt); //Escribe el entero en la dirección 0 Serial.println("Entero escrito en EEPROM");}void loop() { int myInt = EEPROM.read(0); //Lee el entero de la dirección 0 Serial.print("Entero leido de EEPROM: "); Serial.println(myInt); delay(5000);}Ejemplo 2: Recordar el estado de un LED
Este ejemplo clásico ilustra cómo utilizar la EEPROM para recordar el estado de un LED entre reinicios del Arduino:
#include <EEPROM.h>const int ledPin = 13;const int buttonPin = 2;void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); Serial.begin(9600); // Recupera el estado del LED desde la EEPROM int previousState = EEPROM.read(0); digitalWrite(ledPin, previousState);}void loop() { if (digitalRead(buttonPin) == LOW) { int currentState = digitalRead(ledPin); digitalWrite(ledPin, !currentState); // Cambia el estado del LED EEPROM.write(0, !currentState); // Guarda el nuevo estado en la EEPROM delay(200); }}Consideraciones adicionales para optimizar el uso de la EEPROM
- Minimizar las escrituras: Como se mencionó antes, la EEPROM tiene un número limitado de ciclos de escritura. Evite escribir datos innecesariamente. Utilice la función
EEPROM.update()para evitar escrituras redundantes. - Manejo de errores: Implemente mecanismos de manejo de errores para verificar si la lectura o escritura en la EEPROM fue exitosa.
- Estrategias de almacenamiento: Para almacenar datos complejos, considere el uso de estructuras de datos compactas y eficientes para minimizar el espacio ocupado en la EEPROM.
- Wear leveling: Para aplicaciones con altas tasas de escritura, considere implementar técnicas de wear leveling para distribuir las escrituras de forma uniforme y extender la vida útil de la EEPROM.
Consultas habituales sobre la librería EEPROM en Arduino
A continuación, se responden algunas consultas habituales sobre la librería EEPROM:
- ¿Puedo almacenar datos de tipo float o string en la EEPROM? No directamente. La EEPROM solo almacena bytes. Para almacenar datos de tipo
floatoString, es necesario convertirlos a bytes mediante funciones comomemcpy()o manipulación manual de bytes. - ¿Qué pasa si intento escribir en una dirección de memoria fuera del rango de la EEPROM? Esto podría causar errores impredecibles en el funcionamiento del Arduino. Siempre verifique que las direcciones de memoria utilizadas estén dentro del rango válido.
- ¿Cómo puedo borrar la EEPROM? No existe una función para borrar completamente la EEPROM. Para hacerlo, se debe escribir un valor en cada una de sus posiciones.
La librería EEPROM proporciona una herramienta fundamental para almacenar datos de forma persistente en las placas Arduino. Su correcta utilización, teniendo en cuenta sus limitaciones y optimizando las estrategias de escritura, permite desarrollar proyectos robustos y confiables.
Si quieres conocer otros artículos parecidos a Librería eeprom en arduino para almacenamiento de datos persistente puedes visitar la categoría Libros y Librerías.
