EEPROM Arduino ejemplos

La memoria EEPROM no volátil del Arduino permite almacenar datos importantes durante la ejecución del programa, como los parámetros del sistema, incluso cuando se apaga la alimentación o se reinicia el microcontrolador, ya que no es volátil. ¿Cómo escribir en una memoria eeprom? Veamos cómo trabajar con EEPROM con ejemplos de escritura y lectura de diferentes tipos de datos utilizando los comandos de la librería EEPROM.h.

Para esta actividad necesitaremos:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • librería EEPROM.h

Programar memoria EEPROM con Arduino

La EEPROM (memoria de sólo lectura programable y borrable eléctricamente) de Arduino es una memoria permanente que puede conservar los datos escritos en ella durante décadas tras un corte de corriente. La EEPROM puede reescribirse varios cientos de miles de veces a una temperatura de al menos 24°C y no puede leerse. La capacidad de la memoria EEPROM no volátil del microcontrolador Arduino es la siguiente:

ATmega168 (placa Arduino Nano) – 512 bytes;
ATmega328 (placa Arduino Uno, placa Arduino Nano) – 1 Kbyte;
ATmega1280, ATmega2560 (placa Arduino Mega) – 4 Kbytes.

Un byte de escritura en memoria EEPROM tarda unos 3,3µs y un byte de lectura tarda unos 0,4µs (microsegundos). Cada byte (celda) en la EEPROM de microcontrolador Arduino tiene un valor por defecto de 255 (es decir, nunca se escribe en una celda). Tenga en cuenta que si los datos ocupan más de un byte de espacio (por ejemplo, un número superior a 255), se dividen en varias celdas. Es importante tenerlo en cuenta a la hora de escribir.

Comandos de librería EEPROM.h Arduino

Función

Descripción

read()
EEPROM.read(address)
Lee un byte de la posición de memoria que indica su parámetro. De fábrica, todas las posiciones de memoria tienen escrito el valor 255.
write()
EEPROM.write(address, value)
Esta función escribe un byte en la posición indicada de la EEPROM. Tiene dos parámetros: el primero es la dirección de memoria (de 0 a 1023) donde se escribirá el byte; el segundo es el valor que se va a escribir en la EEPROM, que debe ser un valor entero entre 0 y 255.
update()
EEPROM.update(address, value)
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.
get()
EEPROM.get(address, data)
Permite leer cualquier tipo de dato en la EEPROM.
put()
EEPROM.put(address, data)
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, por lo que es mucho más versátil.
EEPROM[]
EEPROM[address]
Este operador permite usar el identificador EEPROM[] como una matriz en la cual indicamos la dirección.

Programa para escribir EEPROM Arduino (write)

#include "EEPROM.h"
int address;
byte value;

void setup() {
   Serial.begin(9600);
   Serial.println(EEPROM.length());
   EEPROM.write(0,100);
   delay(3000);

   while (address < EEPROM.length()) {
      value = EEPROM.read(address);
      Serial.print("Address: ");
      Serial.print(String(address));
      Serial.print(", value: ");
      Serial.println(String(value));
      address++;
      delay(100);
   }
}
void loop() {
 
}

Explicación sketch para Arduino escribir EEPROM (write):

  1. la función EEPROM.write() sobrescribe los datos en la celda con dirección 0 cada vez, lo que reduce el ciclo de vida de la memoria, mejor usar EEPROM.update()

Programa para limpiar EEPROM Arduino (update)

#include "EEPROM.h"

void setup() {
   Serial.begin(9600);

   EEPROM.update(0,100);
   delay(2000);

   Serial.println(EEPROM.read(0));
   Serial.println(EEPROM[0]);
   }
}
void loop() {
 
}

Explicación sketch para Arduino limpiar EEPROM (update):

  1. las funciones de escritura/lectura/actualización sólo permiten el tipo de datos byte y no pueden utilizarse para float o int. Para ello, utilice las funciones put/get.

Programa para leer EEPROM Arduino (read)

#include "EEPROM.h"
int address;
byte value;

void setup() {
   Serial.begin(9600);
   Serial.println(EEPROM.length());
   delay(3000);

   while (address < EEPROM.length()) {
      value = EEPROM.read(address);
      Serial.print("Address: ");
      Serial.print(String(address));
      Serial.print(", value: ");
      Serial.println(String(value));
      address++;
      delay(100);
   }
}
void loop() {
 
}

Explicación sketch para Arduino leer EEPROM (read):

  1. la función EEPROM.length() indica el número total de celdas de la memoria. Si estás trabajando con un Nano ATmega168, el bucle terminará en 512 celdas;
  2. si no se ha utilizado la memoria, todos los valores de las celdas serán 255.

Ejemplos de uso de la EEPROM de Arduino

En primer lugar, considere la posibilidad de escribir un número mayor que 255 en la EEPROM del Arduino, por ejemplo el número 999. Cuando se escribe en la EEPROM, el número 999 se dividirá en un multiplicador (byte alto) y un número que falta (byte bajo), ocupando dos posiciones de memoria no volátil (es decir, 999 = 3×256 + 231). Para mostrar el número almacenado en el monitor, será necesario «ensamblarlo» utilizando word().

Programa Arduino para escribir int, float en EEPROM

#include "EEPROM.h"

int num = 999;
byte hi  = highByte(num);
byte low = lowByte(num);

void setup() {
  Serial.begin(9600);

   EEPROM.update(1, hi);
   EEPROM.update(2, low);

  delay(1000);

  byte val1 = EEPROM.read(1);
  byte val2 = EEPROM.read(2);

  Serial.println("highByte - "+String(val1));
  Serial.println("lowByte  - "+String(val2));

  int NUM = word(hi, low);
  Serial.println("int num  - "+String(NUM));
}

void loop() {
 
}

Explicación sketch para Arduino EEPROM escribir int, float:

  1. el principal problema de almacenar números grandes (int, float) es no sobrescribir accidentalmente la celda correcta con nueva información. Para ello se tiene en cuenta el tamaño de los datos a almacenar mediante las funciones EEPROM.put() y EEPROM.get()

Conclusión. Para borrar la memoria EEPROM no volátil del Arduino Nano y volver a la configuración de fábrica, todas las celdas de memoria deben sobrescribirse con el número 255. Para ello se puede utilizar un bucle for o while. Anteriormente mostramos un ejemplo sencillo de un programa de borrado de EEPROM de Arduino. Si tienes alguna pregunta sobre Arduino EEPROM, por favor déjala en los comentarios de este artículo.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *