Correo: [email protected] - Teléfono: +56979962128

En este tutorial te explicamos qué es la EEPROM de Arduino y para qué sirve. También te enseñaremos a escribir y leer desde la EEPROM y a crear un proyecto de ejemplo para poner en práctica los conceptos aprendidos.

Introducción

Cuando se define y utiliza una variable, los datos generados dentro de un sketch solo existen mientras Arduino esté encendido. Si se reinicia o se apaga Arduino, los datos almacenados desaparecen.

Si necesitas conservar los datos almacenados para su uso futuro, debe utilizar la memoria EEPROM incluida en el microcontrolador de tu Arduino. Esta permite almacenar los datos de la variable incluso cuando se reinicia o se apaga el Arduino.

¿Qué es EEPROM?

El microcontrolador de la placa Arduino (ATMEGA328 en el caso de Arduino UNO, que se muestra en la figura siguiente) tiene EEPROM (memoria de solo lectura programable y borrable eléctricamente). Se trata de un pequeño espacio que puede almacenar variables del tamaño de bytes. Las variables almacenadas en la EEPROM se mantienen allí, incluso cuando reinicias o apagas el Arduino. En pocas palabras, la EEPROM es un almacenamiento persistente similar a un disco duro en las computadoras.
     
Atmega328
La EEPROM se puede leer, borrar y reescribir electrónicamente. En Arduino, puedes leer y escribir desde la EEPROM fácilmente usando la librería EEPROM.
 

¿Cuántos bytes puedes almacenar?

 
Cada posición EEPROM puede guardar un byte, lo que significa que solo puede almacenar números de 8 bits, que incluyen valores enteros entre 0 y 255. Los bytes que se pueden almacenar en la EEPROM dependen de los microcontroladores de las placas Arduino. Observa la siguiente tabla:
Microcontroller EEPROM
ATmega328 (Arduino Uno, Nano, Mini) 1024 bytes
ATmega168 (Arduino Nano) 512 bytes
ATmega2560 (Arduino Mega) 4096 bytes
Sin embargo, si necesitas almacenar más datos, puede utilizar una EEPROM externa.
 

¿Cual es la vida útil de la EEPROM de un Arduino?

La EEPROM tiene una vida útil limitada. En Arduino, la EEPROM está especificada para manejar 100 000 ciclos de escritura/borrado para cada posición. Sin embargo, las lecturas son ilimitadas. Esto significa que puedes leer de la EEPROM tantas veces como quieras sin comprometer su expectativa de vida.
 

Aplicaciones en proyectos Arduino – Recordar último estado

La EEPROM es útil en proyectos de Arduino que necesitan conservar datos incluso cuando el Arduino se reinicia o cuando se corta la energía. Es especialmente útil para recordar el último estado de una variable o recordar cuántas veces se activó un aparato.
Por ejemplo, imaginemos el siguiente escenario:
  • Estás controlando una lámpara con tu Arduino y la lámpara está encendida;
  • El Arduino pierde energía de repente;
  • Cuando se restablece la energía, la lámpara permanece apagada; no conserva el último cambio
No quieres que esto suceda. Quieres que Arduino recuerde lo que estaba sucediendo antes de perder energía y vuelva al último estado.
La siguiente figura muestra lo que vamos a ejemplificar:
 
Led state without eeprom
 
Para solucionar este problema, puede guardar el estado de la lámpara en la EEPROM y agregar una condición a su sketch para verificar inicialmente si el estado de la lámpara corresponde al estado previamente guardado en la EEPROM. Lo ejemplificaremos con un ejemplo más adelante en esta publicación

Leer y escribir

Puede leer y escribir fácilmente en la EEPROM utilizando la librería EEPROM.

Para incluir la biblioteca EEPROM:

#include <EEPROM.h>
 

Escribir

Para escribir datos en la EEPROM, utiliza la función EEPROM.write que toma dos argumentos. El primero es la ubicación o dirección de la EEPROM donde queremos guardar los datos y el segundo es el valor que queremos guardar:
EEPROM.write(address, value);
Por ejemplo, para escribir 9 en la dirección 0, tendrás:
EEPROM.write(0, 9);
 

Leer

Para leer un byte de la EEPROM, se utiliza la función EEPROM.read(address). Esta función toma la dirección del byte que tiene un argumento.

EEPROM.read(address);
Por ejemplo, para leer el byte almacenado previamente en la dirección 0.:
EEPROM.read(0);
Esto devolvería 9 , que es el valor almacenado en esa ubicación.
 

Actualizar un valor

La función EEPROM.update es particularmente útil. Solo escribe en la EEPROM si el valor escrito es diferente del que ya está guardado. Como la EEPROM tiene una expectativa de vida limitada debido a los ciclos de escritura/borrado limitados, se recomienda utilizar EEPROM.update() en lugar de la EEPROM.write() para alargar la vida útil.
EEPROM.update(address, value);

En este momento, tenemos un 9 almacenado en la dirección 0. Entonces, si llamamos:

EEPROM.update(0, 9);
 
No volverá a escribir en la EEPROM, ya que el valor guardado actualmente es el mismo que queremos escribir.
 

Ejemplo: La EEPROM de Arduino recuerda el estado del LED almacenado

En este ejemplo, le mostraremos cómo hacer que Arduino recuerde el estado del LED almacenado, incluso cuando reiniciamos el Arduino o se corta la energía.

La siguiente figura muestra lo que vamos a ejemplificar: Led state eeprom

Piezas necesarias

Aquí están las piezas necesarias para este proyecto.
  • Arduino UNO : lea los mejores kits de inicio de Arduino
  • 1x LED
  • 1 resistencia de 220 Ω
  • 1x pulsador
  • 1 resistencia de 1 kΩ
  • 1x placa de pruebas
  • Cables puente
 

El Sketch

Aquí se muestra el esquema del circuito para este proyecto. Se trata simplemente de un pulsador que encenderá y apagará un LED.   EEPROM debounce schematics bb
   

Código

Copia el siguiente código en el IDE de Arduino y cárgalo en tu placa Arduino. Asegúrate de que tienes la placa y el puerto COM correctos seleccionados.
/*
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/

#include <EEPROM.h>

const int buttonPin = 8; // pushbutton pin
const int ledPin = 4; // LED pin

int ledState; // variable to hold the led state
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin


// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers

void setup() {
// set input and output
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

// set initial LED state
digitalWrite(ledPin, ledState);

// initialize serial monitor
Serial.begin (9600);

//check stored LED state on EEPROM using function defined at the end of the code
checkLedState();
}

void loop() {
// read the state of the switch into a local variable
int reading = digitalRead(buttonPin);

if(reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}

if((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:

// if the button state has changed:
if(reading != buttonState) {
buttonState = reading;

// only toggle the LED if the new button state is HIGH
if(buttonState == HIGH) {
ledState = !ledState;
}
}
}

// set the LED state
digitalWrite(ledPin, ledState);
// save the current LED state in the EEPROM
EEPROM.update(0, ledState);
// save the reading. Next time through the loop,
// it'll be the lastButtonState
lastButtonState = reading;
}

// Prints and upates the LED state
// when the Arduino board restarts or powers up
void checkLedState() {
Serial.println("LED status after restart: ");
ledState = EEPROM.read(0);
if(ledState == 1) {
Serial.println ("ON");
digitalWrite(ledPin, HIGH);
}
if(ledState == 0) {
Serial.println ("OFF");
digitalWrite(ledPin, LOW);
}
}
 

Código

Este es un código antirrebote que cambia el estado del LED cada vez que presionas el botón. Pero este código tiene algo especial: recuerda el estado del LED guardado, incluso después de reiniciar o encender el Arduino. Básicamente, guardamos el estado actual del LED en el estado led variable y guárdela en la EEPROM con la siguiente línea:
EEPROM.update(0,ledState);
  Al comienzo del código en el setup(), comprobamos el ledstate el LED en la EEPROM y lo apagamos o encendemos según ese estado cuando reiniciamos el programa. Lo hacemos con una función que hemos creado al final del código,

checkLedState()

void checkLedState() {
Serial.println("LED status after restart: ");
ledState = EEPROM.read(0);
if (ledState == 1) {
Serial.println ("ON");
digitalWrite(ledPin, HIGH);
} 
if (ledState == 0) {
Serial.println ("OFF");
digitalWrite(ledPin, LOW);
}
}

Terminando

  En esta publicación, aprendiste sobre la EEPROM de Arduino y para qué sirve. Creaste un boceto de Arduino que recuerda el último estado del LED incluso después de reiniciar el Arduino. Este es solo un ejemplo sencillo para que entiendas cómo se usa la EEPROM. La idea es que apliques los conceptos aprendidos en este tutorial a tus propios proyectos.  

DEMOSTRACIÓN

 
   

Preguntas frecuentes

¿Qué es la EEPROM de Arduino?

Es una memoria que conserva los datos aunque el Arduino se apague o se reinicie. Las variables normales de un sketch solo existen mientras la placa está encendida; la EEPROM permite guardar información de forma permanente.

¿Cuántos bytes puedo guardar en la EEPROM de un Arduino UNO?

La capacidad es limitada y depende del modelo de placa. El tutorial detalla cuántos bytes ofrece cada una, un dato importante porque se agota rápido si se guardan estructuras grandes.

¿Cuánto dura la EEPROM de un Arduino?

Tiene una vida útil limitada en número de escrituras, no de lecturas. Por eso conviene escribir solo cuando el dato cambia realmente, y no en cada vuelta del bucle.

¿Para qué sirve la EEPROM en un proyecto real?

Un uso típico es recordar el último estado: que el proyecto vuelva a encender con la misma configuración que tenía antes de apagarse, sin que el usuario tenga que ajustarla de nuevo.

¿Cómo se escribe y se lee en la EEPROM?

Con las funciones de escritura y lectura de la librería EEPROM, indicando la dirección de memoria y el valor. El tutorial recorre ambas operaciones y las pone en práctica en un proyecto de ejemplo.

Aprende esto en un curso

Si prefieres verlo en vivo y con alguien que resuelva tus dudas, estos cursos presenciales de MCI Educación cubren el tema de este tutorial: