ESP32 Daten und Einstellungen dauerhaft speichern - AZ-Delivery

Oft habt ihr schon bemerkt, dass Einstellungen, Variablen oder Eingaben nach einem Neustart des ESP32 nicht mehr vorhanden sind. Heute zeigen wir euch, wie ihr Variablen oder Einstellungen dauerhaft, einen Stromausfall oder Neustart überstehend, speichern könnt.

Bei Arduino gibt es einen EEPROM Speicher, wo solche Werte abgespeichert werden können. Solch einen Speicher besitzt ein ESP32 nicht. Bei ESP32 gibt es dafür einen Flash-Speicher (Ähnlich einer SSD/USB-Stick).

Um darauf zugreifen zu können verwenden wir Preferences, die in der ESP-Bibliothek mitgeliefert werden. Wenn ihr diese Bibliothek noch nicht auf euerem Rechner installiert habt, schaut euch dieses Ebook an: ESP32 Lora Modul mit OLED

Starten wir ein neues Arduino IDE Projekt und fügen diesen Code ein:

 

#include <Preferences.h>

Preferences preferences;                        

void setup() {
  Serial.begin(115200);
  Serial.println();

  preferences.begin("az", false);                         //Ordner az anlegen/verwenden

  //preferences.clear();                                  //Alle "Dateien" unter dem Ordner az löschen

  //preferences.remove("Start");                          //"Datei" Start löschen

  unsigned int counter = preferences.getUInt("Start", 0); //"Datei" Start auslesen und in Variable counter schreiben
                                                          //", 0" bedeutet, falls Start nicht existiert standardwert 0 übergeben

 counter++;                                               //Variable counter um 1 erhöhen

  Serial.printf("Anzahl Starts: %u\n", counter);          //Variable counter Seriell ausgeben

  preferences.putUInt("Start", counter);                  //Variable counter unter "Datei" Start speichern

  preferences.end();                                      //Preferences beenden

  Serial.println("Neustart in 10 Sekunden...");
  delay(10000);                                           //Wartezeit 10000ms = 10s

  ESP.restart();
}

void loop() {}

 

Was macht dieser Code?

Als erstes legen wir einen neuen Ordner an, bzw. verwenden diesen als aktuellen Ordner.

preferences.begin("az", false);  

Möchte man alle inhalte in dem Ordner az löschen, verwendet man:

preferences.clear();  

 

Ebenfalls kann man auch eine bestimmte Datei löschen:

preferences.remove("Start");  

 

Mit den Befehlen

preferences.putUInt

können Integer daten gespeichert werden und mit

preferences.getUInt

können gespeicherte Integer daten wieder ausgelesen werden.

Ausserdem gibt es folgende weitere Möglichkeiten (String, Long...) Datein zu speichern und auszulesen:

putChar
putUChar
putShort
putUShort
putInt
putUInt
putLong
putULong
putLong64
putULong64
putFloat
putDouble
putBool
putString
putString
putBytes
getChar
getUChar
getShort
getUShort
getInt
getUInt
getLong
getULong
getLong64
getULong64
getFloat
getDouble
getBool
getString
getString
getBytes

 

unsigned int counter = preferences.getUInt("Start", 0);

mit getUInt lesen wir die datei "Start" aus und schreiben diese in die Variable counter. Sollte die Datei "Start" nicht existieren wird ein Standardwert genommen, in diesem Fall eine 0. Der Standardwert wird hinter die Datei mit einem Komma angefügt.

Nach dem erhöhen und ausgeben der Variable, speichern wir die Variable counter in der datei Start :

preferences.putUInt("Start", counter);  

Nachdem wir alles gespeichert haben, schließen wir unseren Ordner az wieder, mit dem Befehl:

preferences.end();  

Nun starten wir den ESP32 neu und beginnnen wieder von vorne. Wir können nun auch die Stromversorgung trennen und wissen immer ganz genau wie oft der ESP gestartet wurde, denn dieser Wert wird nun beim einschalten ausgelesen und um eins erhöht wieder gespeichert.

Mit dieser Funktion können nun auch andere Werte gespeichert und verwendet werden, z.B. WLAN Zugangsdaten, Last Status... lasst euch etwas einfallen.

Viel Spass beim Experimentieren!

 

 

 

Esp-32Grundlagen software

7 Kommentare

Andreas Wolter

Andreas Wolter

@Georg: da Quellcode meistens schlechter lesbar ist, wenn lange Zeilen zu oft umgebrochen werden, werden die Zeilen nicht umgebrochen und daher Scrollbalken verwendet.
Ich empfehle, den kompletten Code in einen Editor Ihrer Wahl zu kopieren und auf dem gesamten Bildschirm anzuzeigen.
Die Codebeispiele sollen nur zur ersten Ansicht dienen. Ein vollständiges Review sollte jeder in seinem Editor durchführen.

Grüße,
Andreas Wolter
AZ-Delivery Blog

Georg

Georg

Eure Beiträge sind super und sehr hilfreich. Bedauerlicherweise ist es jedoch sehr umständlich diese zu lesen, da das Design der Webseite so schlecht ist wie die Blog-Artikel gut sind. Wieso muss ich auf einem normalen Bildschirm mit 1920 Pixeln Breite seitlich scrollen um den Quellcode des Beispiels lesen zu können, obwohl ein Großteil des Bildschirms ungenutzt ist? Leider scheint dieser Unsinn mittlerweile überall Standard zu sein… O_o

Markus

Markus

Danke für den guten Beitrag.
Kann ich eigentlich die Preferences und Spiffs in einem Sketch gleichzeitig nutzen. Oder gibt es da Probleme bei der Nutzung des NVS.

Brian

Brian

Ist es richtig, dass dieser Speicher beim ESP eine begrenzte Anzahl von Schreibzyclen hat? Wie hoch ist diese?

Noob-nerd

Noob-nerd

if (preferences.getUInt(“Start”, -1) == -1 ){
//gibt nichts
}

Peter Pi.

Peter Pi.

Danke! Mich würde interessieren, wie man erfährt, ob bei einem get ein Schlüssel überhaupt existiert.

Hoktaar

Hoktaar

Hi & Danke für diesen sehr guten Beitrag.

Geht das auch mit einem ESP8266 oder gibt es dort etwas ähnliches was so einfach ist?

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery