U hebt vaak gemerkt dat instellingen, variabelen of ingangen niet meer bestaan na het opnieuw opstarten van de ESP32. Vandaag laten we u zien hoe u variabelen of instellingen permanent opslaan, waarbij een stroomstoring wordt afgenomen of opnieuw worden opgestart.
Bij Arduino is er een EEPROM geheugen waar dergelijke waarden kunnen worden opgeslagen. Een ESP32 heeft niet zo'n geheugen. EsP32 heeft een flashgeheugen (vergelijkbaar met een SSD/USB-stick).
Om toegang te krijgen, gebruiken we voorkeuren die zijn opgenomen in de ESP-bibliotheek. Als u deze bibliotheek nog niet op uw computer hebt geïnstalleerd, raadpleegt u dit e-book: ESP32 Lora module met OLED
Laten we beginnen met een nieuw Arduino IDE-project en voeg deze code in:
#include <Voorkeuren.H> Voorkeuren Voorkeuren; Void Setup() { Seriële.Beginnen(115200); Seriële.println(); Voorkeuren.Beginnen("AZ", Valse); Map az maken/gebruiken voorkeuren.duidelijk(); Alle "bestanden" onder de az-map verwijderen voorkeuren.verwijderen("Start"); Start 'Bestand' Verwijderen Unsigned Int Teller = Voorkeuren.getUInt getUInt("Begin", 0); "Bestand" Start lezen en schrijven in variabele teller " 0": als start niet bestaat om standaardwaarde 0 door te geven Teller++; Variabele teller met 1 verhogen Seriële.Printf("Aantal starts: %u'n", Teller); Variabele teller Seriële uitvoer Voorkeuren.putUInt("Begin", Teller); Variabele teller opslaan onder 'Bestand' starten Voorkeuren.Einde(); Voorkeuren beëindigen Seriële.println("Herstart in 10 seconden..."); Vertraging(10000); Wachttijd 10000ms = 10s Ihb.Opnieuw starten(); } Void Lus() {}
Wat doet deze code?
Eerst maken we een nieuwe map of gebruiken we deze als de huidige map.
Voorkeuren.Beginnen("AZ", Valse);
Als u alle inhoud in de map az wilt verwijderen, gebruikt u:
Voorkeuren.Duidelijk();
U ook een specifiek bestand verwijderen:
Voorkeuren.Verwijderen("Begin");
Met de opdrachten
Voorkeuren.putUInt
integer-gegevens kunnen worden opgeslagen en
Voorkeuren.getUInt getUInt
opgeslagen gehele gegevens kunnen opnieuw worden uitgelezen.
Daarnaast zijn er de volgende extra mogelijkheden (String, Long...) Bestanden opslaan en lezen:
putChar putChar putUChar putShort putUShort putInt putUInt putLong putULong putLong64 putULong64 putFloat putDouble putBool putBool putString putString putBytes |
Getchar (Getchar) getUChar (getUChar) getShort getUShort getInt getUInt getUInt getLong getULong getULong getLong64 getULong64 Getfloat Getdouble getBool (getBool) Getstring Getstring Ontvangbytes |
Unsigned Int Teller = Voorkeuren.getUInt getUInt("Begin", 0);
met getUInt lezen we het bestand "Start" en schrijven het in de variabele teller. Als het bestand 'Start' niet bestaat, wordt een standaardwaarde genomen, in dit geval een 0. De standaardwaarde wordt na het bestand met een komma toegevoegd.
Nadat we de variabele hebben verhoogd en uitgevoerd, slaan we de variabele teller op in het begin van het bestand:
Voorkeuren.putUInt("Begin", Teller);
Nadat we alles hebben opgeslagen, sluiten we onze map az weer, met het commando:
Voorkeuren.Einde();
Nu herstarten we de ESP32 en beginnen we opnieuw vanaf het begin. We kunnen nu ook de voeding loskoppelen en weten altijd precies hoe vaak de ESP is gestart, omdat deze waarde nu wordt uitgelezen wanneer ingeschakeld en opnieuw opgeslagen met een verhoogd.
Met deze functie kunnen nu ook andere waarden worden opgeslagen en gebruikt, bijvoorbeeld WLAN-toegangsgegevens, laadstatus... laat iets in me opkomen.
Veel plezier experimenteren!
7 Reacties
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
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
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
Ist es richtig, dass dieser Speicher beim ESP eine begrenzte Anzahl von Schreibzyclen hat? Wie hoch ist diese?
Noob-nerd
if (preferences.getUInt(“Start”, -1) == -1 ){
//gibt nichts
}
Peter Pi.
Danke! Mich würde interessieren, wie man erfährt, ob bei einem get ein Schlüssel überhaupt existiert.
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?