Is there a read and write function in EEPROM?

EEPROM en ESP32: Persistencia de Datos Esencial

06/08/2023

Valoración: 3.93 (15055 votos)

En el fascinante mundo de la electrónica y la programación de microcontroladores, uno de los desafíos recurrentes es la necesidad de que nuestros dispositivos 'recuerden' información. Imagina que configuras un sistema de iluminación inteligente con tu ESP32, ajustas el brillo, el color o el modo de animación, y de repente, se va la luz. ¿Qué sucede al regresar la energía? Lo más probable es que tu configuración se haya perdido, volviendo a los valores por defecto. Este es un problema común cuando se trabaja con variables que solo existen mientras el microcontrolador está alimentado. Para resolver esta limitación fundamental y permitir que tus proyectos sean verdaderamente autónomos e inteligentes, existe un tipo de memoria especial: la EEPROM. Aunque el ESP32 no cuenta con una EEPROM física como otros microcontroladores, la librería EEPROM para ESP32 ofrece una solución ingeniosa y robusta, emulando su comportamiento utilizando la memoria flash interna. En este artículo, desentrañaremos qué es la EEPROM, cómo funciona esta emulación en el ESP32, y cómo puedes utilizarla para que tus datos perduren en el tiempo, sin importar los reinicios o los cortes de energía.

What is EEPROM extension?
Extension of the standard Arduino EEPROM library. Extended for reading and writing basic types, structs, strings, arrays and more. Extension of the standard Arduino EEPROM library.

La persistencia de datos es crucial en innumerables aplicaciones, desde almacenar credenciales Wi-Fi hasta guardar el último estado de un sensor o las preferencias de un usuario. Sin una memoria no volátil como la EEPROM, cada vez que tu ESP32 se reinicie, perdería toda la información dinámica, obligándote a reconfigurar o a iniciar desde cero. Esto no solo es ineficiente, sino que limita drásticamente la funcionalidad y la autonomía de tus proyectos. Acompáñanos en este recorrido para dominar la librería EEPROM en ESP32 y desbloquear un nuevo nivel de capacidad en tus creaciones.

Índice de Contenido

¿Qué es la Memoria EEPROM y por qué es Vital para tus Proyectos?

La EEPROM, acrónimo de Electrically Erasable Programmable Read-Only Memory (Memoria de Solo Lectura Programable y Borrable Eléctricamente), es un tipo de memoria no volátil. Esto significa que los datos almacenados en ella persisten incluso cuando el dispositivo pierde la alimentación eléctrica. A diferencia de la memoria RAM (Random Access Memory), que es volátil y pierde su contenido al apagar el dispositivo, la EEPROM está diseñada específicamente para retener información de forma permanente.

En el contexto de microcontroladores como los de Arduino (ATmega328, ATmega2560), la EEPROM es una sección de memoria dedicada y físicamente separada dentro del chip. Su principal ventaja es la capacidad de escribir y borrar datos byte a byte, lo que la hace ideal para almacenar configuraciones, contadores o pequeños fragmentos de información que necesitan sobrevivir a los ciclos de encendido y apagado. Es como el 'disco duro' de tu microcontrolador, pero con una capacidad mucho más limitada.

¿Por qué la EEPROM es Crucial en tus Aplicaciones?

  • Configuraciones Permanentes: Permite guardar ajustes de usuario, parámetros de calibración o credenciales de red que no cambien frecuentemente.
  • Estados de Dispositivo: Un robot puede recordar su última posición, un sistema de riego su horario, o un termostato la temperatura deseada, incluso después de un fallo de energía.
  • Contadores: Ideal para almacenar el número de ciclos de un motor, el tiempo de funcionamiento de un dispositivo, o el número de veces que se ha activado una función.
  • Datos de Calibración: Los valores de calibración de sensores o actuadores pueden almacenarse para asegurar un rendimiento consistente.

La EEPROM en ESP32: Una Emulación Inteligente sobre Memoria Flash

Aquí es donde el ESP32 se diferencia significativamente de los microcontroladores Arduino tradicionales. A diferencia de los chips AVR (como el ATmega328 del Arduino UNO) que incluyen un bloque de memoria EEPROM dedicado y físico, el ESP32 (y su predecesor, el ESP8266) no cuenta con una EEPROM de hardware integrada. Esto se debe a que la arquitectura de estos microcontroladores está más orientada a aplicaciones que requieren mayor capacidad de almacenamiento y velocidad, como el almacenamiento de firmware y datos grandes en su memoria flash.

Para suplir esta ausencia, la comunidad de desarrollo de ESP32 ha creado una librería que emula el comportamiento de la EEPROM utilizando un sector de la memoria flash interna del chip. Esta emulación es transparente para el programador, ya que las funciones y la forma de interactuar con ella son muy similares a las de la EEPROM de los Arduino AVR.

Implicaciones de la Emulación en Flash

  • Vida Útil: Aunque la memoria flash es altamente duradera, tiene un número limitado de ciclos de escritura/borrado (típicamente entre 10,000 y 100,000 ciclos por sector). La librería de emulación está diseñada para distribuir las escrituras y minimizar el desgaste de un solo sector, pero es una consideración importante para aplicaciones que escriben constantemente en la EEPROM.
  • Gestión de la Memoria: La memoria flash se borra y escribe en bloques o sectores completos. La librería de emulación se encarga de gestionar esto internamente, pero es importante entender que una pequeña escritura podría implicar la reescritura de un sector completo de la flash.
  • Necesidad de commit(): Los datos escritos en la EEPROM emulada se almacenan inicialmente en un búfer en RAM. Para que estos cambios se guarden permanentemente en la memoria flash, es necesario llamar a la función EEPROM.commit(). Sin esta llamada, los datos se perderán al reiniciar o apagar el ESP32.

¿Cuántos Bytes Podemos Almacenar en la EEPROM del ESP32?

A diferencia de los microcontroladores AVR con capacidades de EEPROM fijas (ej. 1024 bytes para ATmega328), la EEPROM emulada en el ESP32 ofrece una flexibilidad interesante. La cantidad de memoria que puedes utilizar para la emulación es configurable al inicio de tu programa. Esto se hace mediante la función EEPROM.begin(size), donde size es el número de bytes que deseas reservar para tu EEPROM emulada.

El tamaño máximo que puedes reservar dependerá del espacio disponible en la memoria flash de tu ESP32 que no esté ocupado por el firmware, el sistema de archivos (SPIFFS/LittleFS) o otras particiones. Generalmente, puedes reservar desde unos pocos bytes hasta varios kilobytes (por ejemplo, 4KB, 8KB o más), lo que es considerablemente más que las EEPROM físicas de los Arduinos UNO o Mega.

Ejemplo de Capacidades Típicas (AVR vs. ESP32 Emulada)

Para ilustrar la diferencia, veamos una tabla comparativa:

MicrocontroladorTipo de EEPROMCapacidad TípicaCiclos de Escritura (Por Posición)Necesidad de commit()
ATmega328 (Arduino UNO)Hardware Dedicado1024 bytes100,000No (escritura directa)
ATmega2560 (Arduino Mega)Hardware Dedicado4096 bytes100,000No (escritura directa)
ESP32Emulada sobre FlashConfigurable (ej. 512B - 4KB+)~100,000 (por sector flash)Sí (EEPROM.commit())

Aunque los ciclos de escritura por 'posición' en la flash emulada son complejos de medir directamente debido a la gestión interna de la librería, la durabilidad de la flash es muy alta para la mayoría de los casos de uso.

Funciones Clave de la Librería EEPROM para ESP32

La librería EEPROM para ESP32 proporciona un conjunto de funciones intuitivas para interactuar con la memoria emulada. Es importante destacar la necesidad de inicializar la EEPROM y de 'comitar' los cambios para asegurar la persistencia.

1. Inicialización: EEPROM.begin(size)

Antes de poder leer o escribir en la EEPROM, debes inicializarla y especificar cuántos bytes deseas reservar para ella. Esta función debe llamarse una sola vez, generalmente en la función setup().

EEPROM.begin(size);
  • size: El número de bytes que se asignarán a la EEPROM emulada.

Importancia: Si no llamas a EEPROM.begin(), cualquier intento de leer o escribir en la EEPROM fallará o resultará en un comportamiento indefinido.

2. Escribir un Byte: EEPROM.write(address, value)

Esta función permite escribir un solo byte de datos en una dirección específica de la EEPROM.

EEPROM.write(address, value);
  • address: La posición de memoria (índice) donde se escribirá el dato, comenzando desde 0.
  • value: El dato de tipo byte (un número entre 0 y 255) que se quiere guardar.

Nota: Esta función no escribe directamente en la flash; almacena el valor en un búfer en RAM. Debes llamar a EEPROM.commit() para que los cambios se guarden permanentemente.

3. Leer un Byte: EEPROM.read(address)

Permite leer un solo byte de datos de una dirección específica de la EEPROM.

byte data = EEPROM.read(address);
  • address: La posición de memoria (índice) de donde se leerá el dato.

Retorna: El valor del tipo byte almacenado en la dirección especificada.

4. Escribir Cualquier Tipo de Dato: EEPROM.put(address, data)

Esta función es extremadamente útil porque permite escribir tipos de datos complejos como int, float, long, estructuras, o incluso cadenas de texto. La función calcula automáticamente cuántos bytes ocupa el dato y los escribe consecutivamente.

EEPROM.put(address, data);
  • address: La posición de memoria donde se comenzará a escribir el dato.
  • data: La variable que contiene el valor a guardar (puede ser de cualquier tipo).

Nota: Al igual que write(), los cambios se guardan en un búfer y requieren EEPROM.commit().

5. Leer Cualquier Tipo de Dato: EEPROM.get(address, data)

Complementaria a put(), esta función lee un tipo de dato complejo de la EEPROM y lo almacena en una variable.

EEPROM.get(address, data);
  • address: La posición de memoria desde donde se comenzará a leer el dato.
  • data: La variable donde se almacenará el valor leído. Su tipo debe coincidir con el tipo de dato que se guardó previamente.

6. Actualizar un Byte: EEPROM.update(address, value)

Esta función es una mejora de write(). Solo escribe el valor si es diferente al que ya está almacenado en esa dirección. Esto es útil para prolongar la vida útil de la EEPROM al evitar escrituras innecesarias.

What is the EEPROM space for Arduino & Genuino 101?
EEPROM.update(address, value);
  • address: La dirección de memoria que se pretende actualizar.
  • value: El valor que se quiere actualizar.

Nota: Los cambios se guardan en un búfer y requieren EEPROM.commit().

7. Guardar Cambios en Flash: EEPROM.commit()

Esta es la función más importante al trabajar con la EEPROM emulada en ESP32. Después de realizar una o varias operaciones de escritura (write(), put(), update()), debes llamar a EEPROM.commit() para que los datos se transfieran desde el búfer de RAM a la memoria flash, haciendo que los cambios sean permanentes.

EEPROM.commit();

Importancia Crítica: Si olvidas llamar a EEPROM.commit(), todos los datos que hayas 'escrito' se perderán en el próximo reinicio o corte de energía.

Cómo se Almacenan los Datos en una Memoria EEPROM Emulada

La EEPROM, ya sea física o emulada, está organizada en 'huecos' o posiciones de memoria, donde cada hueco puede almacenar un byte (8 bits, un número entre 0 y 255). Si quieres almacenar un tipo de dato que ocupa más de un byte (como un int que ocupa 2 bytes, o un float que ocupa 4 bytes), este dato se distribuirá automáticamente en varias posiciones consecutivas de la memoria.

Por ejemplo, si utilizas EEPROM.put(0, myIntVariable), y myIntVariable es un int, ocupará la posición 0 y la posición 1. Si luego intentas almacenar otro dato en la posición 1 sin considerar el tamaño del int anterior, podrías sobrescribir parte de él. Por eso, es fundamental llevar un registro de las direcciones de memoria que utilizas para cada variable o dato, especialmente si manejas múltiples tipos de datos o estructuras.

Una buena práctica es definir constantes para las direcciones de inicio de cada bloque de datos que vas a almacenar, asegurándote de dejar suficiente espacio entre ellos. Por ejemplo:

const int DIRECCION_MODO = 0; // Ocupa 1 byte (para byte) o 2 bytes (para int) const int DIRECCION_TEMPERATURA = DIRECCION_MODO + sizeof(byte); // Se almacena después del modo const int DIRECCION_NOMBRE = DIRECCION_TEMPERATURA + sizeof(float); // Se almacena después de la temperatura // ... y así sucesivamente 

Aplicaciones donde es Útil Almacenar Información en la Memoria EEPROM

La persistencia de datos es un pilar fundamental para crear dispositivos verdaderamente inteligentes y autónomos. Aquí te presentamos algunos escenarios donde la EEPROM emulada en tu ESP32 brillará con luz propia:

  • Configuración de Dispositivos IoT: Almacena credenciales Wi-Fi (SSID y Contraseña), direcciones IP estáticas, puertos de servidor o claves API para servicios en la nube. Así, tu dispositivo se conectará automáticamente a la red sin necesidad de reconfiguración tras un reinicio.
  • Preferencias de Usuario: Guarda el último modo de operación (ej. modo día/noche), el nivel de brillo de una pantalla, el volumen de un altavoz o la configuración de un temporizador.
  • Contadores y Registros: Mantén un registro del número de activaciones de un relé, las horas de funcionamiento de un motor, o la cantidad de veces que se ha presionado un botón. Esto es útil para mantenimiento predictivo o estadísticas.
  • Estados de Sensores: Almacena el umbral de activación de un sensor, el valor de calibración de una celda de carga, o el último estado conocido de un interruptor para recuperarlo después de un corte de energía.
  • Sistemas de Seguridad: Guarda códigos PIN, estados de alarma (activada/desactivada) o configuraciones de sensores de movimiento.

Imagina un sistema de control de luces LED donde puedes seleccionar diferentes modos de animación (Navidad, Fundido, Estroboscópico). Si el ESP32 pierde la alimentación, sin EEPROM, al volver la energía, el sistema no recordaría el último modo seleccionado y volvería a un valor por defecto. Con la EEPROM, el último modo elegido por el usuario se recuperaría automáticamente, ofreciendo una experiencia de usuario fluida y sin interrupciones.

Ejemplo Práctico: Control de LEDs con Persistencia en ESP32 EEPROM

Vamos a adaptar el ejemplo clásico de control de LEDs con un pulsador para que el ESP32 recuerde el último modo de luz seleccionado, incluso después de un reinicio. Esto te permitirá ver la EEPROM en acción de manera sencilla pero efectiva.

Esquema Eléctrico

El circuito es muy similar al de Arduino UNO, ya que estamos usando pines digitales básicos. Necesitarás:

  • Un módulo ESP32 (ESP32 DevKitC o similar).
  • 3 LEDs (rojo, naranja, verde).
  • 3 resistencias de 220 ohmios (para los LEDs).
  • 1 pulsador.
  • Cables de conexión.
  • Una protoboard.

Conecta los LEDs a los pines digitales del ESP32 a través de sus resistencias, por ejemplo, a los pines 3, 4 y 5. Conecta el pulsador a otro pin digital, como el pin 2. Asegúrate de conectar el otro extremo del pulsador a GND. Utilizaremos la resistencia pull-up interna del ESP32 para el pulsador, lo que simplifica el cableado.

Código Completo para ESP32

Este código demostrará cómo leer un valor inicial desde la EEPROM, actualizarlo cuando el pulsador sea presionado, y luego guardar ese nuevo valor permanentemente con EEPROM.commit().

#include <EEPROM.h> // Definición de pines para los LEDs const byte ledRojo = 16; // Pin GPIO 16 (ejemplo para ESP32) const byte ledNaranja = 17; // Pin GPIO 17 const byte ledVerde = 18; // Pin GPIO 18 // Definición de pin para el pulsador const byte pulsador = 19; // Pin GPIO 19 // Variable para almacenar el modo de animación (1:Rojo, 2:Naranja, 3:Verde) byte modoAnimacion = 0; // Posición de memoria EEPROM donde guardaremos el modo const int posicionMemoria = 0; // Tamaño de la EEPROM emulada (suficiente para 1 byte, pero podemos reservar más) const int EEPROM_SIZE = 512; void setup() { Serial.begin(115200); // Velocidad de baudios común para ESP32 // Inicializar la EEPROM con el tamaño deseado if (!EEPROM.begin(EEPROM_SIZE)) { Serial.println("Fallo al inicializar EEPROM. Reiniciando..."); delay(1000); ESP.restart(); // Reinicia el ESP32 si falla la inicialización } else { Serial.println("EEPROM inicializada correctamente."); } // Configuración de pines pinMode(ledRojo, OUTPUT); pinMode(ledNaranja, OUTPUT); pinMode(ledVerde, OUTPUT); pinMode(pulsador, INPUT_PULLUP); // Activa la resistencia pull-up interna // Leer el modo de animación guardado en la EEPROM modoAnimacion = EEPROM.read(posicionMemoria); Serial.print("Modo Animacion cargado desde EEPROM: "); Serial.println(modoAnimacion); // Validar el valor leído. Si no es válido (ej. primera vez o corrupción), // establecer un valor por defecto y guardarlo. if (modoAnimacion < 1 || modoAnimacion > 3) { modoAnimacion = 1; // Modo por defecto: LED Rojo EEPROM.write(posicionMemoria, modoAnimacion); EEPROM.commit(); // Guardar el valor por defecto en la flash Serial.println("Valor EEPROM inválido o primera ejecución. Modo por defecto (1) guardado."); } } void loop() { // Leer el estado del pulsador // INPUT_PULLUP hace que el pin sea HIGH por defecto y LOW cuando se pulsa boolean pulsado = digitalRead(pulsador); delay(200); // Pequeño retardo para evitar rebotes del pulsador // Si el pulsador ha sido presionado (estado LOW) if (!pulsado) { modoAnimacion++; // Incrementar el modo if (modoAnimacion > 3) { // Si excede el máximo, volver al inicio modoAnimacion = 1; } Serial.print("Nuevo Modo Animacion: "); Serial.println(modoAnimacion); // Apagar todos los LEDs antes de encender el nuevo digitalWrite(ledRojo, LOW); digitalWrite(ledNaranja, LOW); digitalWrite(ledVerde, LOW); // Encender el LED correspondiente al modo actual if (modoAnimacion == 1) { digitalWrite(ledRojo, HIGH); } else if (modoAnimacion == 2) { digitalWrite(ledNaranja, HIGH); } else if (modoAnimacion == 3) { digitalWrite(ledVerde, HIGH); } // Guardar el nuevo modo en la EEPROM EEPROM.write(posicionMemoria, modoAnimacion); EEPROM.commit(); // ¡IMPORTANTE! Guardar los cambios en la memoria flash Serial.println("Modo de animación guardado en EEPROM."); } } 

Análisis del Código

1. Librería y Variables

#include <EEPROM.h> // ... (otras definiciones de pines y variables) const int EEPROM_SIZE = 512; // Definimos el tamaño de la EEPROM emulada 

Se incluye la librería EEPROM.h. Es fundamental definir un tamaño para la EEPROM emulada (EEPROM_SIZE), que se usará en la inicialización. Los pines de los LEDs y el pulsador se definen como constantes.

2. Función setup()

void setup() { Serial.begin(115200); if (!EEPROM.begin(EEPROM_SIZE)) { Serial.println("Fallo al inicializar EEPROM. Reiniciando..."); delay(1000); ESP.restart(); } else { Serial.println("EEPROM inicializada correctamente."); } // ... (configuración de pines) // Leer el valor guardado modoAnimacion = EEPROM.read(posicionMemoria); Serial.print("Modo Animacion cargado desde EEPROM: "); Serial.println(modoAnimacion); // Validación y valor por defecto if (modoAnimacion < 1 || modoAnimacion > 3) { modoAnimacion = 1; EEPROM.write(posicionMemoria, modoAnimacion); EEPROM.commit(); // Guardar el valor por defecto Serial.println("Valor EEPROM inválido o primera ejecución. Modo por defecto (1) guardado."); } } 

La primera acción en setup() después de iniciar el monitor serie es llamar a EEPROM.begin(EEPROM_SIZE). Esto reserva el espacio en la flash para la EEPROM emulada. Si esta inicialización falla (lo cual es raro, pero posible), el ESP32 se reinicia. Luego, se configuran los pines y, crucialmente, se lee el valor del modoAnimacion desde la posicionMemoria de la EEPROM. Se incluye una validación para asegurar que el valor leído esté dentro del rango esperado (1 a 3). Si no es así (por ejemplo, en la primera ejecución del código o si el valor está corrupto), se asigna el modo 1 como por defecto y se guarda inmediatamente en la EEPROM con EEPROM.commit().

3. Función loop()

void loop() { boolean pulsado = digitalRead(pulsador); delay(200); if (!pulsado) { // Si el pulsador está presionado (LOW) modoAnimacion++; if (modoAnimacion > 3) { modoAnimacion = 1; } // ... (control de LEDs) // Guardar el nuevo modo en la EEPROM EEPROM.write(posicionMemoria, modoAnimacion); EEPROM.commit(); // ¡FUNDAMENTAL! Serial.println("Modo de animación guardado en EEPROM."); } } 

En el bucle principal, se lee el estado del pulsador. Cuando se detecta una pulsación (!pulsado, ya que usamos INPUT_PULLUP), se incrementa el modoAnimacion y se resetea si excede el límite. Después de actualizar el estado de los LEDs según el nuevo modo, se llama a EEPROM.write(posicionMemoria, modoAnimacion) para almacenar el nuevo valor en el búfer de la EEPROM. Inmediatamente después, se invoca EEPROM.commit(). Esta llamada es la que escribe los datos del búfer a la memoria flash, asegurando que el nuevo modo se conserve incluso si el ESP32 se reinicia o se apaga.

Prueba del Ejemplo Práctico

1. Sube el código a tu ESP32. 2. Abre el monitor serie (a 115200 baudios). Verás un mensaje indicando el modo de animación cargado. En la primera ejecución, será 0 y luego se establecerá en 1 (Rojo) por defecto. 3. Pulsa el botón. El LED cambiará (Rojo -> Naranja -> Verde -> Rojo, etc.). Cada vez que cambie, el nuevo modo se guardará en la EEPROM. 4. Ahora, reinicia tu ESP32 (usa el botón 'EN' o 'RST' en la placa, o desconecta y vuelve a conectar la alimentación). 5. Observa el monitor serie y el LED. Deberías ver que el ESP32 carga el último modo que seleccionaste antes del reinicio, y el LED correspondiente se encenderá. ¡La persistencia de datos ha funcionado!

Preguntas Frecuentes sobre la EEPROM en ESP32

¿Cuál es la diferencia principal entre la EEPROM de Arduino (AVR) y la de ESP32?

La principal diferencia es que los microcontroladores AVR tienen una EEPROM dedicada de hardware, mientras que el ESP32 no. La librería EEPROM para ESP32 emula el comportamiento de la EEPROM utilizando un sector de la memoria flash interna del chip. Esto implica que, en ESP32, necesitas inicializar la EEPROM con EEPROM.begin(size) y, lo más importante, llamar a EEPROM.commit() después de cada escritura para que los datos se guarden permanentemente en la flash.

¿Es la librería EEPROM.h la misma para ambos (AVR y ESP32)?

Sí, el archivo de cabecera es el mismo (<EEPROM.h>), y muchas de las funciones principales como read(), write(), get(), put() y update() tienen la misma sintaxis. Sin embargo, la implementación subyacente es diferente, y las funciones EEPROM.begin(size) y EEPROM.commit() son específicas y obligatorias para el ESP32 (y ESP8266) debido a su arquitectura basada en flash.

¿Cuántos ciclos de escritura soporta la EEPROM del ESP32?

Dado que la EEPROM en ESP32 es una emulación sobre memoria flash, su vida útil está ligada a la durabilidad de la flash. Las memorias flash NAND (comunes en ESP32) suelen soportar entre 10,000 y 100,000 ciclos de escritura/borrado por sector. La librería de emulación está diseñada para distribuir las escrituras y minimizar el desgaste de un solo sector, pero si tu aplicación escribe constantemente en la misma posición, podrías alcanzar ese límite con el tiempo. Para la mayoría de los proyectos, esta durabilidad es más que suficiente.

¿Qué pasa si no uso EEPROM.commit() después de escribir?

Si no llamas a EEPROM.commit(), los datos que has escrito permanecerán solo en un búfer temporal en la RAM. Al reiniciar el ESP32 o al desconectarlo de la alimentación, esos datos se perderán y no se habrán guardado permanentemente en la memoria flash. Es un paso crucial para asegurar la persistencia.

¿Cómo puedo 'borrar' toda la EEPROM en ESP32?

No hay una función directa EEPROM.clear(). Para 'borrar' la EEPROM emulada, puedes sobrescribir todas las posiciones con un valor conocido (por ejemplo, 0xFF o 0x00). Un enfoque común es un bucle que recorra todas las direcciones y escriba un valor por defecto. Por ejemplo:

for (int i = 0; i < EEPROM_SIZE; i++) { EEPROM.write(i, 0); // Escribir 0 en cada byte } EEPROM.commit(); // Guardar los cambios 

También puedes simplemente 'formatear' la partición de la EEPROM si estás usando el sistema de archivos de flash (como LittleFS o SPIFFS) y no tienes otros datos en esa partición, pero el método de sobrescritura es más directo para la emulación de EEPROM.

Conclusión

La librería EEPROM para ESP32 es una herramienta indispensable en el arsenal de cualquier desarrollador de proyectos con este potente microcontrolador. Aunque su funcionamiento subyacente difiere de la EEPROM física presente en otras plataformas como Arduino AVR, la abstracción que ofrece la librería simplifica enormemente la tarea de almacenar datos de forma no volátil. Hemos explorado cómo la emulación sobre la memoria flash, junto con las funciones esenciales como EEPROM.begin() y EEPROM.commit(), te permiten crear aplicaciones más robustas, inteligentes y autónomas.

Desde la persistencia de configuraciones de red hasta el recuerdo de estados de dispositivos o contadores vitales, la capacidad de guardar información a través de reinicios y cortes de energía abre un sinfín de posibilidades para tus creaciones. Dominar el uso de la EEPROM te permitirá llevar tus proyectos de IoT, automatización y control a un nivel superior, asegurando que tus dispositivos no solo funcionen, sino que también 'recuerden' y se adapten de forma inteligente a su entorno. ¡Anímate a implementar la EEPROM en tus próximos desarrollos y observa cómo tus ideas cobran una nueva dimensión de inteligencia!

Si quieres conocer otros artículos parecidos a EEPROM en ESP32: Persistencia de Datos Esencial puedes visitar la categoría Librerías.

Subir