Introducción
Poder almacenar datos en el ESP32 sin necesidad de una tarjeta SD es muy útil para no perder el rastro de estados y variables cuando se produce un fallo de alimentación o un reinicio no deseado del microcontrolador.
El microcontrolador ESP32 tiene un espacio de memoria específico diseñado para este fin. El almacenamiento no volátil (NVS) conserva los datos a través de reinicios y eventos de pérdida de energía del sistema (utilizando una parte del NVS).
Con este método se pueden almacenar más de 2 KBytes de datos. Es importante tener en cuenta que la memoria flash NVS está pensada principalmente para almacenar pequeñas cantidades de datos de configuración, como credenciales WiFi o ajustes específicos de la aplicación.
Requisitos
Programación
El código que se mostrará es:
#include <Preferences.h>
Preferences p;
Preferences q;
void setup() {
Serial.begin(115200);
p.begin("test-1", false);
q.begin("test-2", false);
unsigned int counter1 = p.getUInt("counter", 0);
unsigned int counter2 = q.getUInt("counter", 0);
counter1 = counter1 + 1;
counter2 = counter2 + 2;
Serial.printf("Current counter1 value: %u\n", counter1);
Serial.printf("Current counter2 value: %u\n", counter2);
p.putUInt("counter", counter1);
q.putUInt("counter", counter2);
p.end();
q.end();
Serial.println("Restarting");
ESP.restart();
}
void loop() {}
Desglose
Desglosemos el código:
#include <Preferences.h>
Preferences p;
Preferences q;
En primer lugar, incluimos la biblioteca Preferences que se utilizará para leer y escribir en el NVS y se definen los objetos p y q.
p.begin("test-1", false);
q.begin("test-2", false);
Aquí abrimos p y q con los namespaces "test-1" y "test-2" respectivamente con permisos de Lectura/Escritura. Si sólo queremos Lectura, entonces el segundo parámetro debe ser verdadero:
p.begin("test-1", true);
Cada espacio de nombres tiene sus propios valores clave, por lo que repetir la clave "contador" en ambos espacios de nombres no cambiará nada.
unsigned int counter1 = p.getUInt("counter", 0);
unsigned int counter2 = q.getUInt("counter", 0);
La función getUInt(nombre_clave, valor_por_defecto) devuelve el valor de la clave especificada. Si la clave no existe, devuelve el valor_por_defecto (en este caso, 0).
counter1 = counter1 + 1;
counter2 = counter2 + 2;
Serial.printf("Current counter1 value: %u\n", counter1);
Serial.printf("Current counter2 value: %u\n", counter2);
Aquí, las variables contador1 (del espacio de nombres "test-1") y contador2 (del espacio de nombres "test-2") se incrementan y luego se imprimen en el puerto serie.
p.putUInt("counter", counter1);
q.putUInt("counter", counter2);
Luego guardamos las variables en su respectiva clave y espacio de nombres usando la función putUInt.
p.end();
q.end();
Serial.println("Restarting");
ESP.restart();
Por último, cerramos ambos namespaces y realizamos un reset en la placa ESP32.
Después de unos cuantos reinicios, verás algo como esto:
Como era de esperar, el contador1 se incrementa en 1, mientras que el contador2 se incrementa en 2 cada vez que se reinicia.
Funciones adicionales
La siguiente función puede utilizarse para eliminar el espacio de nombres deseado:
p.clear();
Si sólo deseas eliminar un par clave-valor, utilizarás:
p.remove(key);
Encuentra la API de la biblioteca de preferencias aquí >>
Para borrar completamente la memoria flash NVS, ejecute el siguiente código:
#include <nvs_flash.h>void setup() {nvs_flash_erase(); // Erase the NVS partitionnvs_flash_init(); // Initialize the NVS partitionwhile(true);}void loop() {}
Conclusión
El NVS del microcontrolador ESP32 es una forma útil de almacenar datos sin una tarjeta SD. Puede mantener datos importantes incluso cuando se pierde la alimentación o se reinicia. Puede almacenar más de 2 KBytes de datos, lo que es suficiente para los datos de configuración como los ajustes WiFi.
La biblioteca de Preferencias y sus funciones permiten a los usuarios acceder y modificar datos en diferentes partes del NVS. Los usuarios también pueden eliminar o borrar datos según sea necesario. El uso del NVS en el ESP32 mejora la fiabilidad y la persistencia de los datos, lo que hace que las aplicaciones sean más estables y consistentes incluso en situaciones difíciles.
Cómo guardar datos en la memoria ESP32 NVS de forma permanente