La EEPROM es una memoria interna del microcontrolador ESP32 que permite mantener los datos en la memoria después de reiniciar la placa. Cuando se trabaja con microcontroladores, es interesante mantener los datos en la memoria, especialmente cuando la placa se apaga, se quiera o no, como en el caso de una pérdida de energía eléctrica.
Material
- Ordenador
- NodeMCU ESP32
- Cable USB A macho/micro B macho
Principio de funcionamiento
El microcontrolador ESP32 tiene una zona de memoria Flash con la que se puede interactuar como la EEPROM de un Arduino para mantener los datos en la memoria incluso después de apagar la placa. Una cosa importante a tener en cuenta es que la EEPROM tiene un tamaño y una vida útil limitados. Las celdas de memoria pueden leerse tantas veces como sea necesario, pero el número de ciclos de escritura está limitado a 100.000. Es aconsejable prestar atención al tamaño de los datos almacenados y a la frecuencia con la que se desea actualizarlos. La memoria EEPROM puede almacenar 512 valores de 0 a 255 o 128 direcciones IP o etiquetas RFID.
Si quieres registrar los datos de una flota de sensores en tiempo real para trazarlos, lo mejor es optar por un módulo de tarjeta SD para almacenar los datos.
Código con la biblioteca EEPROM
Para interactuar con la EEPROM del ESP32, podemos utilizar la librería EEPROM.h como para Arduino con dos diferencias. Antes de usar la función, debemos inicializar el tamaño de la memoria con begin() y la función update no existe pero la función write tiene la misma función que update. Es decir, un valor se modifica sólo si el valor es diferente al registrado.
- begin() para inicializar el tamaño de la memoria
- write(), que se adapta según el tipo de variable, para escribir
- read() para leer
- las funciones put() y get() pueden ser utilizadas de la misma manera
Otras funciones de la biblioteca pueden ser utilizadas dependiendo de su uso de la EEPROM.
//Libraries #include <EEPROM.h>//https://github.com/espressif/arduino-esp32/tree/master/libraries/EEPROM //Constants #define EEPROM_SIZE 12 void setup() { //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //Init EEPROM EEPROM.begin(EEPROM_SIZE); //Write data into eeprom int address = 0; int boardId = 18; EEPROM.write(address, boardId);//EEPROM.put(address, boardId); address += sizeof(boardId); //update address value float param = 26.5; EEPROM.writeFloat(address, param);//EEPROM.put(address, param); EEPROM.commit(); //Read data from eeprom address = 0; int readId; readId = EEPROM.read(address); //EEPROM.get(address,readId); Serial.print("Read Id = "); Serial.println(readId); address += sizeof(readId); //update address value float readParam; EEPROM.get(address, readParam); //readParam=EEPROM.readFloat(address); Serial.print("Read param = "); Serial.println(readParam); EEPROM.end(); } void loop() {}
Resultado
Los valores leídos corresponden a los valores almacenados. Puedes eliminar la parte de escritura y reiniciar el código para comprobar que los valores se mantienen bien en la memoria.
Bonificación: Uso de la biblioteca de preferencias
Una solución más reciente para la interfaz con EEPROM para el ESP32 es utilizar la biblioteca Preferences. La gran diferencia con la librería EEPROM es que en lugar de utilizar direcciones de memoria, utilizamos palabras clave para dirigir las variables. Las palabras clave deben tener como máximo 15 caracteres y deben ser únicas.
Las funciones que hay que conocer son:
- putInt (dependiendo del tipo de variable) para escribir la variable en la memoria
- getInt( dependiendo del tipo de variable) para leer la variable
#include <Preferences.h> //https://github.com/espressif/arduino-esp32/tree/master/libraries/Preferences Preferences preferences; void setup() { Serial.begin(115200); Serial.println(); Serial.println(F("Initialize System")); int boardId = 18; float param = 26.5; //init preference preferences.begin("myfile", false); //preferences.clear(); // remove all preferences in namespace myfile //preferences.remove("varname");// remove varname in the namespace preferences.putUInt("boardId", boardId); preferences.putFloat("param", param); unsigned int readId = preferences.getUInt("boardId", 0); // get boardId or if key doesn't exist set variable to 0 Serial.print("Read Id = "); Serial.println(readId); float readParam = preferences.getFloat("param", 0); // Serial.print("Read param = "); Serial.println(readParam); preferences.end(); } void loop() {}
Aplicaciones
- Mantener en la memoria el ssid y la contraseña de la red Wifi en un ESP32
Fuentes
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie