ESP32 Pre­fe­ren­ces - Daten in den Flash-Spei­cher schrei­ben und lesen

Lese­zeit: 4 Minu­ten

Ein­füh­rung

Der ESP32 kann einen Teil sei­nes Flash-Spei­chers für die per­ma­nen­te Spei­che­rung von Daten ver­wen­den. Die gespei­cher­ten Daten blei­ben auch nach der Tren­nung von der Strom­zu­fuhr oder nach einem Reset erhal­ten. Der NVS (Non-vola­ti­le sto­rage = nicht flüch­ti­ger Spei­cher) kann alle Typen von ➨Varia­blen schrei­ben und lesen. 

Ein per­ma­nen­ter Spei­cher ist hilf­reich um die Daten des hei­mi­schen WLANs dau­er­haft abzu­spei­chern, oft ver­wen­de­te Varia­blen ver­füg­bar zu machen oder den letz­ten Zustand einer Hard­ware­kom­po­nen­te zu merken.

Die Biblio­thek erwar­tet die Defi­ni­ti­on eines Namens­rau­mes. Die­ser kann für ver­schie­de­ne Zwe­cke unter­schied­lich sein. put spei­chert einen Schlüs­sel und den dazu­ge­hö­ri­gen Wert, get liest bei­des aus dem Spei­cher. Bei jeder put- und get-Ope­ra­ti­on muss die­ses Schlüs­sel-Wert-Paar ange­ge­ben werden.

Funk­tio­nen der Biblio­thek Preferences

Schlüs­sel­wortPara­me­terAkti­on
begin(Namensraum, rea­don­ly);rea­don­ly = true -> nur lesen
rea­don­ly = fal­se -> lesen und schreiben
Pre­fe­ren­ces starten
end();aktu­el­len Namens­raum schließen
clear();
alle Schlüs­sel-Wert-Paa­re des aktu­el­len Namens­raums löschen
remove(Schlüssel);ein Schlüs­sel-Wert-Paar löschen
putInt(Schlüssel, Wert) ;
putUInt(Schlüssel, Wert);

Varia­blen vom Typ int und unsi­gned int schreiben
putBool(Schlüssel, Wert);Varia­ble vom Typ bool schreiben
putString(Schlüssel, Zei­chen­ket­te);Varia­ble vom Typ String schreiben
getInt(Schlüssel, Wert) ;
getUInt(Schlüssel, Wert);
Varia­blen vom Typ int und unsi­gned int lesen
getFloat(Schlüssel, Wert) ;
getDouble(Schlüssel, Wert);
Varia­blen vom Typ float und dou­ble lesen
getBool(Schlüssel, Wert);Varia­ble vom Typ bool lesen
getString(Schlüssel, Zei­chen­ket­te);Varia­ble vom Typ String lesen

Varia­ble spei­chern und lesen

Das Pro­gramm legt ver­schie­de­ne Varia­ble (int, bool und String) an und schreibt sie in den Spei­cher. Die int-Varia­ble wird jeweils um 1 erhöht, die bool­sche-Varia­ble ver­än­dert jeweils ihren Zustand von true zu fal­se und der String wird wech­sel­wei­se in Groß­buch­sta­ben und in Klein­buch­sta­ben dargestellt.

#include "Preferences.h"

// Namensraum festlegen
Preferences Daten;

// verschiedene Variable
String Passwort = "geheimesPasswort";
String LEDStatus;
int Zaehler = 0;
bool LED = false;

// Pause zwischen der Darstellung im Seriellen Monitor
int Wartezeit = 5000;

void setup() 
{
  Serial.begin(9600);
  delay(1000);

  /*
    Preferences starten:
    Namensraum festlegen 
    readonly: true -> nur lesen, false -> lesen und schreiben
  */
  Daten.begin("Werte", false);

  // Namensraum leeren
  Daten.clear();
}

void loop() 
{
  // Werte Daten
    /*
    Wertepaar:
    Name des Schlüssel, Wert (Standard = 0)
  */
  Daten.putUInt("Zaehler", Zaehler);
  Daten.putString("Passwort", Passwort);
  Daten.putBool("StatusLED", LED);
  Serial.println("------------------------------");

  Serial.println("Nächste Werte in " + String(Wartezeit / 1000) + " Sekunden");

  // Werte holen
  Zaehler = Daten.getUInt("Zaehler", 0);
  Passwort = Daten.getString("Passwort", "");
  LEDStatus = Daten.getBool("StatusLED", 0);

  // Werte anzeigen
  Serial.println("Zähler: " + String(Zaehler));
  Serial.println("Passwort: " + Passwort);
  Serial.println("Status der LED: " + String(LED));

  delay(Wartezeit);

  // Zaehler um 1 erhöhen
  // Status von LED "umkehren"
  // aus true wird false, aus false wird true
  Zaehler++;
  LED = !LED;
  
  // wenn LED = true Passwort in Großbuchstaben umwandeln
  // wenn LED = false Passwort in Kleinbuchstaben umwandeln
  if (LED) Passwort.toUpperCase();
  else Passwort.toLowerCase();
}

WLAN-Ein­stel­lun­gen speichern

Auch die WLAN-Ein­stel­lun­gen kön­nen im Spei­cher abge­legt wer­den, damit wird die Anga­be der Daten im Kopf des Pro­gramms über­flüs­sig. Zunächst müs­sen die Daten geschrie­ben wer­den. Das Pro­gramm muss nur ein­mal hoch­ge­la­den werden.

Daten schrei­ben

#include "Preferences.h"

// Namensraum der Preferences festlegen
Preferences Speichern;

// WiFi-Daten
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

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

  /*
    Preferences starten:
    Namensraum festlegen 
    readonly: true -> nur lesen, false -> lesen und schreiben
  */
  Speichern.begin("WiFi_Daten", false);

  // Speicher leeren
  Speichern.clear();

  // putString -> Daten schreiben
  Speichern.putString("RouterSSID", Router);
  Speichern.putString("Passwort", Passwort);

  // getString -> Daten lesen und anzeigen
  Serial.println("Router SSID: " + Speichern.getString("RouterSSID", Router));
  Serial.println("Passwort: " + Speichern.getString("Passwort", Passwort));
  Speichern.end();
}

void loop() 
{
  // bleibt leer, Programm läuft nur einmal
}

Daten lesen und WiFi-Ver­bin­dung aufbauen

#include "WiFi.h"
#include "Preferences.h"

// Name der Preferences festlegen
Preferences Daten;

String Router;
String Passwort;

void setup() 
{
  Serial.begin(9600);
  delay(1000);

  /*
    Preferences starten:
    Name festlegen 
    true -> nur lesen
  */
  Daten.begin("WiFi_Daten", true);

  // Daten lesen und den Strings zuordnen
  Router = Daten.getString("RouterSSID", Router);
  Passwort = Daten.getString("Passwort", Passwort);

  // WiFi starten
  WiFi.begin(Router, Passwort);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  // Verbindung im Seriellen Monitor anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(Router);
  Serial.print("IP über DHCP: ");
  Serial.println(WiFi.localIP());
}

void loop() 
{
  // bleibt leer, Programm läuft nur einmal
}

Quel­len: Espres­sif API Preferences


Letzte Aktualisierung: 3. Okt 2024 @ 10:56