ich benötige für den ESP32 eine Backup-Funktion bei einem Stromausfall etc. Dafür sollen einige Variablen gespeichert werden.
Ich habe schon etwas mit der EEPROM lib rumexperiemtiert. Konnte aber final noch nicht wirklich bewirken, das meine gespeicherten Werte wieder zum Vorschein kommen. Augenscheinlich ja, aber nach dem nächsten Flashen oder Neustart sind die Werte auf einmal anders.
#include <EEPROM.h>
#define EEPROM_SIZE 128
int posopen = 999;
int posnull = 999;
int posclose = 999;
int poscurrent = 999;
int EEPROMposopen;
int EEPROMposclose;
void setup() {
//----------------------------------Serielle Schnittstelle|START
Serial.begin(115200);
//----------------------------------Serielle Schnittstelle|ENDE
EEPROM.begin(EEPROM_SIZE);
if (!EEPROM.begin(EEPROM_SIZE)) // size in Byte
{
Serial.println("failed to initialise EEPROM"); delay(1000000);
}
EEPROM.get(1, EEPROMposopen);
EEPROM.get(2, EEPROMposclose);
if(EEPROMposopen == posopen)
{
Serial.println("OK");
}
else
{
Serial.println("EEPROM value difference");
Serial.print("EEPROMposopen:");
Serial.println(EEPROMposopen);
Serial.print("posopen:");
Serial.println(posopen);
delay(2000);
Serial.println("Store Again ");
EEPROM.put(1, posopen);
delay(2000);
EEPROM.get(1, EEPROMposopen);
Serial.println("EEPROMposopen:");
Serial.println(EEPROMposopen);
Serial.print("posopen:");
Serial.println(posopen);
Serial.println("------------------------------------------");
}
if(EEPROMposclose == posclose)
{
Serial.println("OK");
}
else
{
Serial.println("EEPROM value difference");
Serial.print("EEPROMposclose:");
Serial.println(EEPROMposclose);
Serial.print("posclose:");
Serial.println(posclose);
delay(2000);
Serial.println("Store again");
EEPROM.put(2, posclose);
delay(2000);
EEPROM.get(2, EEPROMposclose);
Serial.print("EEPROMposclose:");
Serial.println(EEPROMposclose);
Serial.print("posclose:");
Serial.println(posclose);
Serial.println("------------------------------------------");
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Der ESP32 hat kein EEPROM, aber ein eigenes Dateisystem SPIFFS, wo Du eine Parameterdatei ablegen kannst. Siehe in den Beispielen der IDE \libraries\SPIFFS\
@noiasca hat es schon geschrieben; die preferences lib hilft hier weiter. Habe mal aus einem längeren Programm die grundsätzlichen Routinen zusammengedampft, um ein Beispiel zu liefern:
Das kurriose ist, das es Tutorials gibt wo ein ESP32 mit der EEPROM Variante trotzdem daten speichert. Das SPIFFS wäre nach meiner Recherche bereits auch auf dem absteigenden Ast, weil hier wieder die Schreibzyklen im ungünstigsten Fall das Leben des ESP32 verkürzen.
Auf jeden Fall danke für die Beispiele. Hat sich jemand schon mit Alternativen z.B. LittleFS beschäftigt bzw. damit Erfahrung?
LIttleFS ist "nur" eine andere Art der Datenspeicherung als Flash-Filesystem, als SPIFFS. Beim ESP8266 ist SPIFFS schon deprecated.
EEPROM auf den ESP ist auch nur eine Emulation, die Daten landen auch im Flash. Der Nachfolger sind Prefrences. Alles liegt in Flash und ist dessen Beschränkung der Schreibzyklen unterworfen. Die meisten neueren Technologien unterstützen Wear-Leveling.
Hier ein Programm dass ich zum Demo-Programm heruntergekürzt habe.
Daher die nicht so ganz passenden Variablennamen.
Man kann aber trotzdem erkennen wie Daten schreiben / Daten lesen funktioniert.
Man muss vor dem Sketch-Upload als Partitionsschema ein Schema mit SPIFFS einstellen
Gott was ist das ein riesen Aufwand um zwei Variablen zu speichern... Was das angeht hängt die Technik da irgendwie hinterher....
Danke für den Demo Code. Ich weiß nicht genau ob ich davon alles verstehe.
Also ich verstehe so ungefähr das anscheined eine Textdatei Zeile für Zeile geschrieben wird und dann wieder eingelesen. Wobei ich mich frage, wenn ich einen integer ablegen will. wird er als String gespeichert und beim Laden wieder in einen Integer automatisch umkonvertiert? Oder wie läuft das ab? In diesem Beispiel werden z.B. ja nur Strings gespeichert.
Unterschied zwischen writeData und writeDefaultData? Eigentlich nicht relevant oder?
createSafeStrings(var,zeichenanzahl?) oder was sind die 256 und 64?
Gibt es von mir in Post 5 auch schon ... Allerdings etwas länger, da auch aus einem größeren Zusammenhang herausgeschnitten und mit ein paar zusätzlichen Beispielen "verziert" ... ;-