Cómo guardar datos en la memoria ESP32 NVS de forma permanente

Descubre los fundamentos del uso de NVS con ESP32
26 de junio de 2023 por
Cómo guardar datos en la memoria ESP32 NVS de forma permanente
Boot & Work Corp. S.L., Bernat Brunet Pedra

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.

ESP32 PLC de Industrial Shields

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 partition
    nvs_flash_init();     // Initialize the NVS partition
    while(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.

ESP32 PLC de Industrial Shields


Buscar en nuestro blog

Cómo guardar datos en la memoria ESP32 NVS de forma permanente
Boot & Work Corp. S.L., Bernat Brunet Pedra 26 de junio de 2023
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>