ESP32 using NVS does not work

hennesf
Posts: 5
Joined: Mon Feb 10, 2025 4:02 pm

ESP32 using NVS does not work

Postby hennesf » Mon Feb 10, 2025 4:27 pm

Code: Select all

//ESP32_permanent_Speicher_schreiben.ino

#include <Preferences.h>

Preferences tab;  // Namensraum festlegen

int a;
int min12 = 555;
int min9 = 183;
int min6 = 520;
int min3 = 920;
int min1 = 720;  // Beispielwerte

void setup() {

  tab.begin("wert1", false);  //Ordner "wertX" für Luftdruckwerte anlegen, lesen und schreiben
  tab.begin("wert2", false);
  tab.begin("wert3", false);
  tab.begin("wert4", false);
  tab.begin("wert5", false);

  Serial.begin(115200);
  while (!Serial)
    ;
  delay(1000);
  Serial.println();
  Serial.println("Test nichtfluechtiger Speicher");
  Serial.println();

  Serial.println("Werte die gespeichert werden sollen");
  Serial.println();

  Serial.print(min12);
  Serial.print(" ");
  Serial.print(min9);
  Serial.print(" ");
  Serial.print(min6);
  Serial.print(" ");
  Serial.print(min3);  //Werte die gespeichert werden sollen
  Serial.print(" ");
  Serial.print(min1);
  Serial.print(" ");
  Serial.println();

  tab.putInt("wert1", min12);
  tab.putInt("wert2", min9);
  tab.putInt("wert3", min6);
  tab.putInt("wert4", min3);
  tab.putInt("wert5", min1);

  tab.end();
}


void loop() {
}


I tried writing to the NVS of an ESP32 using the code above in Arduino IDE Version 2.3.4. To check whether it worked i tried the following code:

Code: Select all

//ESP32_permanent_Speicher_lesen.ino

#include <Preferences.h>

Preferences tab;  // Namensraum festlegen

int min12 = 10;
int min9 = 20;
int min6 = 30;
int min3 = 40;
int min1 = 50;  //Beispielwerte

int min12r;
int min9r;
int min6r;
int min3r;
int min1r;  //zu lesende Werte

//--------------------------------------
void setup() {

  Serial.begin(115200);
  while (!Serial)
    ;
  delay(1000);

  tab.begin("wert1", true);  //Ordner "wert1" für Luftdruckwerte nur lesen
  tab.begin("wert2", false);
  tab.begin("wert3", false);
  tab.begin("wert4", false);
  tab.begin("wert5", false);

  Serial.println();
  Serial.println("Test nichtfluechtiger Speicher-lesen");
  Serial.println();
  Serial.println("Werte vor dem Lesen");
  Serial.println();

  Serial.print(min12);
  Serial.print(" ");
  Serial.print(min9);
  Serial.print(" ");
  Serial.print(min6);
  Serial.print(" ");
  Serial.print(min3);
  Serial.print(" ");
  Serial.print(min1);
  Serial.print(" ");

  Serial.println();
  Serial.println();
  Serial.println("Werte nach dem Lesen");
  Serial.println();

  Serial.println();

  tab.begin("wert1", true);  //Ordner "Tab" für Luftdruckwerte  lesen

  tab.getUInt("wert1", min1r);
  Serial.print(min1r);
  Serial.print(" ");

  tab.getUInt("wert2", min9r);
  Serial.print(min9r);
  Serial.print(" ");

  tab.getUInt("wert3", min6r);
  Serial.print(min6r);
  Serial.print(" ");

  tab.getUInt("wert4", min3r);
  Serial.print(min3r);
  Serial.print(" ");

  tab.getUInt("wert5", min1r);
  Serial.print(min1r);
  Serial.print(" ");
  Serial.println();
  Serial.println("erwartet wurde 555 183 520 920 720");

  Serial.println();
}

void loop() {
}
It did not work at all. The result of reading back was all Zero's.
What's wrong.
Thanks for your assistance

lbernstone
Posts: 916
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESP32 using NVS does not work

Postby lbernstone » Tue Feb 11, 2025 1:11 am

Does the example work for you?

hennesf
Posts: 5
Joined: Mon Feb 10, 2025 4:02 pm

Re: ESP32 using NVS does not work

Postby hennesf » Tue Feb 11, 2025 9:13 am

Hi there,
yes, it does.
I assume that my "writing-code; schreiben" works, but when flashing the "Read-code; lesen", the NVS Area gets erased by the flashing.
Could that be the possible reason?

Regards

hennesf
Posts: 5
Joined: Mon Feb 10, 2025 4:02 pm

Re: ESP32 using NVS does not work

Postby hennesf » Tue Feb 11, 2025 3:40 pm

It seems when flashing the esp with a new sketch (Arduino), the NVS gets overwritten.
So the code in my first post could not work.
Right now i combined writing and reading in one sketch and, hurray, it works. Here it is:

Code: Select all

```cpp
//ESP32_permanent_Speicher_schreiben_und_lesen.ino

#include <Preferences.h>

Preferences tab;  // Objektname tab festlegen

int min12 = 555;
int min9 = 16;
int min6 = 520;
int min3 = 999;
int min1 = 720;  // Beispielwerte zum Schreiben

int min12r, min9r, min6r, min3r, min1r;  // Variable für rückgelesene Werte

void setup() {

  tab.begin("druckwerte", false);  //namensraum "druckwerte" für Luftdruckwerte anlegen, zum lesen und schreiben, Namensraum öffnen

  tab.clear();  //löscht alle Werte im Namensraum "druckwerte"

  // oder einzelne Werte löschen

  tab.remove("wert1");
  tab.remove("wert2");
  tab.remove("wert3");
  tab.remove("wert4");
  tab.remove("wert5");  //löscht alle Werte einzeln

 //tab.remove("wert1"),("wert2"),("wert3"),("wert4"),("wert5");  //funktioniert NICHT

  tab.putInt("wert1", min12);  //key "wert1"  Value min12
  tab.putInt("wert2", min9);
  tab.putInt("wert3", min6);
  tab.putInt("wert4", min3);
  tab.putInt("wert5", min1);

  Serial.begin(115200);
  while (!Serial)
    ;
  delay(100);

  Serial.println();
  Serial.println("Test nichtfluechtiger Speicher");
  Serial.println();

  Serial.println("Werte die gespeichert werden sollen");
  Serial.println();

  Serial.print(min12);
  Serial.print(" ");
  Serial.print(min9);
  Serial.print(" ");
  Serial.print(min6);
  Serial.print(" ");
  Serial.print(min3);  //Werte die gespeichert werden sollen
  Serial.print(" ");
  Serial.print(min1);
  Serial.print(" ");
  Serial.println();

  tab.end();

  //=====================================================================================LESEN==============================

  tab.begin("druckwerte", true);  //namensraum "druckwerte" für Luftdruckwerte anlegen, Namensraum öffnen nur lesen

  min12r = tab.getInt("wert1", min12);
  min9r = tab.getInt("wert2", min9);
  min6r = tab.getInt("wert3", min6);
  min3r = tab.getInt("wert4", min3);
  min1r = tab.getInt("wert5", min1);

  Serial.println();
  Serial.println("Werte die gelesen wurden");
  Serial.println();

  Serial.print(min12r);
  Serial.print(" ");
  Serial.print(min9r);
  Serial.print(" ");
  Serial.print(min6r);
  Serial.print(" ");
  Serial.print(min3r);  //Werte die gelesen wurden
  Serial.print(" ");
  Serial.print(min1r);
  Serial.print(" ");
  Serial.println();



  // Restart ESP
  // ESP.restart();
}


void loop() {
}

```

lbernstone
Posts: 916
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESP32 using NVS does not work

Postby lbernstone » Wed Feb 12, 2025 3:11 am

Flashing new code only erases the nvs partition if you
a) Change the partition scheme
b) Have "Erase flash on upload" enabled
Flashing over OTA will never erase the nvs.

hennesf
Posts: 5
Joined: Mon Feb 10, 2025 4:02 pm

Re: ESP32 using NVS does not work

Postby hennesf » Wed Feb 12, 2025 10:25 am

Flash will be erased from 0x00001000 to 0x00007fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x000f7fff...

It seems, that is what happens?

hennesf
Posts: 5
Joined: Mon Feb 10, 2025 4:02 pm

Re: ESP32 using NVS does not work

Postby hennesf » Tue Feb 18, 2025 2:35 pm

Does that mean that the NVS Contents get overwritten?

Flash will be erased from 0x00001000 to 0x00007fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x000f7fff...

This is what my Arduino IDE announces.
What are the adresses of the NVS in delivery state; nothing changed by me?

Hope i got understood.

Regards


lbernstone
Posts: 916
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESP32 using NVS does not work

Postby lbernstone » Tue Feb 18, 2025 10:35 pm

Preferences::begin() opens a namespace. You call tab.begin() last on wert5. So, everything is going into namespace wert5. If you want to manage multiple namespaces, you need to open multiple Preferences objects.

Who is online

Users browsing this forum: No registered users and 74 guests