Forum: Mikrocontroller und Digitale Elektronik ESP8266: Preferences Probleme - Daten werden NICHT geschrieben


von Johannes R. (johannes_r981)


Lesenswert?

Hallo Leute,

ich würde euer HIlfe benötigen zum Thema Einstellungen im ESP8266 Flash 
zu speichern. Ich nutze dazu die #include<Preferences.h> Libary und 
möchte beim Systemneustart eben überprüfen, ob bereits Einstellungen im 
Flash gespeichert sind oder nicht. Wenn Nein, sollen die Daten 
entsprechend über Factory Settings definiert geschrieben werden in das 
Program bzw. dann in den Flash um beim nächsten Systemneustart 
entsprechend verfügbar zu sein.

Nun habe ich aber das Problem, dass die Daten jedes mal zwar über den 
Sourcecode geschrieben werden aber nie erfolgreich gelesen werden... 
Komme einfach nicht drauf, was hier falsch ist. Habe entsprechend zwei 
Funktionen:
eine zum Lesen der Einstellungen und eine zum Schreiben:
1
void readPreferences(){
2
  preferences.begin("myApp", false);
3
  //Wifi Settings
4
  String SSID = preferences.getString("sta_ssid");
5
  String Password = preferences.getString("sta_password");
6
7
  //Project Specific Settings
8
  length = preferences.getInt("length");
9
  SingleMode = preferences.getBool("SingleMode");
10
  
11
  r = preferences.getInt("red");
12
  g = preferences.getInt("green");
13
  b = preferences.getInt("blue");
14
15
  if(SingleMode){
16
    step = 99;
17
  };
18
19
  brigthness = (int16_t)preferences.getInt("Brightness");
20
  preferences.end();
21
22
  Serial.println(brigthness);
23
  Serial.println(r);
24
 
25
 // Checking by default brightness Level "0" if Factory settings has to be defined
26
 // By Default -->> Flash is 0!
27
  if(brigthness == 0){
28
    Serial.println("No Preferences Found! Writing Factory Settings!");
29
    writeDefaultPrferences();
30
  }
31
32
  Serial.print("Settings:\tSingleColorMode: ");
33
  Serial.print(SingleMode ? "false" : "true");
34
  Serial.print("\tColor rgb: ");
35
  Serial.print(r);
36
  Serial.print(",");
37
  Serial.print(g);
38
  Serial.print(",");
39
  Serial.print(b);
40
  Serial.print("\tBrigthness: ");
41
  Serial.print(brigthness);
42
  Serial.print("\tLED counts: ");
43
  Serial.print(length);
44
  Serial.print("\n");
45
  Serial.print("WiFi SSID: ");
46
  Serial.print(SSID);
47
  Serial.print(" Password: ");
48
  Serial.print(Password);
49
  Serial.print("\n");
50
51
}
52
53
void writeDefaultPrferences(){
54
  preferences.clear();
55
  Serial.println(preferences.freeEntries());
56
  preferences.begin("myApp", false);
57
  preferences.putBool("SingleMode", DefaultSingelColor);
58
  preferences.putInt("red", DefaultRed);
59
  preferences.putInt("green", (uint8_t)DefaultGreen);
60
  preferences.putInt("blue", (uint8_t)DefaultBlue);
61
  preferences.putInt("Brightness", (int16_t)DefaultBrigthness);
62
  preferences.putUInt("length", (uint16_t)DefaultNUMPIXELS);
63
  Serial.println(preferences.freeEntries());
64
  preferences.end();
65
66
  length = DefaultNUMPIXELS;
67
68
  r = DefaultRed;
69
  g = (uint8_t)DefaultGreen;
70
  b = (uint8_t)DefaultBlue;
71
72
  SingleMode = DefaultSingelColor;
73
74
  if(DefaultSingelColor){
75
    step = 99;
76
  }
77
78
  brigthness = DefaultBrigthness;
79
  
80
  Serial.println("Factory Settings Added!");
81
};

Der OUtput in der Konsole sieht dann immer gleich aus - egal ob beim 
Laden, neustart usw:

0
0
No Preferences Found! Writing Factory Settings!
1000
1000
Factory Settings Added!
Settings:       SingleColorMode: true   Color rgb: 100,100,100 
Brigthness: 80  LED counts: 5

Intressant ist, was mir aufgefallen ist, dass preferences.freeEntries() 
trotz Schreiben immer 1000 liefert - was ja auf genügend Speicher bzw. 
freie Addressen hinweisen würde. Auch das Hinzufügen/Weglassen von 
preferences.clear() ändert absolut gar nichts an dem 
Laufzeitverhalten...

Vielleicht sieht hier jemand einen Fehler und kann mir helfen.

Danke und LG.

von Harald K. (kirnbichler)


Lesenswert?

Welche Bedeutung hat der zweite Parameter von "preferences.begin"?

von Thomas W. (Gast)


Lesenswert?

Harald K. schrieb:
> Welche Bedeutung hat der zweite Parameter von "preferences.begin"?

false: bedeutet R/W-Zugriff

Gruesse

Th.

von Johannes R. (johannes_r981)


Lesenswert?

Guten Morgen,

Thomas W. schrieb:
> false: bedeutet R/W-Zugriff

Ja Richtig, und true würde bedeuten "ReadOnly" - wobei ich diese 
Paramter aber auch schon versucht habe umzustellen. Bei der Funktion 
readPreferences() macht es theoretisch keinen Unterschied ob hier 
gelesen/geschrieben oder nur geschrieben wird. Aber funktioniert beides 
nicht.

LG

von Julian L. (rommudoh)


Lesenswert?

Benutzt du auch eine passende Partitionierung?

Was liefert preferences.clear() zurück?

von Johannes R. (johannes_r981)


Lesenswert?

Julian L. schrieb:
> Benutzt du auch eine passende Partitionierung?
>
> Was liefert preferences.clear() zurück?

Ich stehe gerade etwas auf den Schlauch was du mit Partitionierung 
meinst...
Generell habe ich über PLatformIO die Build Settings was den Speicher 
betrifft folgendend definiert:
1
board_build.filesystem = littlefs
2
board_build.ldscript = eagle.flash.1m64.ld
3
board_build.flash_mode = dout

Bzgl. den preferences.clear() werde ich mal versuchen die Funktion im 
Serial.print auszugeben und kann dann die Antwort posten.

LG

von Johannes R. (johannes_r981)


Lesenswert?

Julian L. schrieb:
> Was liefert preferences.clear() zurück?

Liefert "true" bzw. 1 zurück.

von Johannes R. (johannes_r981)


Lesenswert?

Ich habe jetzt nochmal zurückgerudert und das example aus der Libary 
geladen. Der Counter liefer IMMER den Wert 1 zurück egal wie oft ich neu 
starte:
1
/*
2
 Startup counter example with Preferences library.
3
4
 This simple example demonstrates using the Preferences library to store
5
 how many times the device has booted.
6
*/
7
8
#include <Preferences.h>
9
10
Preferences preferences;
11
12
void setup() {
13
  Serial.begin(115200);
14
  Serial.println();
15
  Serial.println();
16
17
  // Open Preferences with my-app namespace. Each application module, library, etc
18
  // has to use a namespace name to prevent key name collisions. We will open storage in
19
  // RW-mode (second parameter has to be false).
20
  // Note: Namespace name is limited to 15 chars.
21
  preferences.begin("my-app", false);
22
23
  // Remove all preferences under the opened namespace
24
  //preferences.clear();
25
26
  // Or remove the counter key only
27
  //preferences.remove("counter");
28
29
  // Get the counter value, if the key does not exist, return a default value of 0
30
  // Note: Key name is limited to 15 chars.
31
  unsigned int counter = preferences.getUInt("counter", 0);
32
33
  // Increase counter by 1
34
  counter++;
35
36
  // Print the counter to Serial Monitor
37
  Serial.printf("Current counter value: %u\n", counter);
38
39
  // Store the counter to the Preferences
40
  preferences.putUInt("counter", counter);
41
42
  // Close the Preferences
43
  preferences.end();
44
45
  Serial.println("You can restart the device now.");
46
}
47
48
void loop() {}

Current counter value: 1
You can restart the device now.

mfg

von Johannes R. (johannes_r981)


Lesenswert?

Hi Leute,

ich konnte heute noch etwas rausfinden, was beim Thema vielleicht 
Hilfreich ist - aber komme trozdem nach wie vor nicht weiter:

Wenn ich das Program selbst hochlade in PlatformIO mittels "Upload", 
dann funktionieren die Preferences read/write Funktionen Wunderbar wenn 
ich ZUVOR "Erase Flash" durchgeführt habe.
Das Problem kommt nachdem ich den zugehörigen Webserver mittels "Upload 
FileSystem Image" hochlade. Dann Funktioniert zwar der Webserver wieder 
Einwandfrei - aber die Preferences dafür nicht mehr!

Kennt dieses Verhalten jemand?

Wie gesagt: Die Partitionierungssettings habe ich wie folgt gewählt:
board_build.ldscript = eagle.flash.1m64.ld
Die Webserver Daten "brauchen" Lokal am PC 36kB und die 
Speicherauslastung aus PlatformIO gibt:

RAM:   [=====     ]  52.8% (used 43280 bytes from 81920 bytes)
Flash: [======    ]  57.7% (used 552917 bytes from 958448 bytes)

Sollte eigentlich alles im Grünen Bereich sein....
Muss ich vielleicht für die preferences.h noch einen eigenen 
Speicherbereich mittels ldscript definieren?

mfg

von Johannes R. (johannes_r981)


Lesenswert?

Habe das ganze nochmal am Wochenende auf einen ESP12-F raufgespielt mit 
einer Anpassung im LDScript auf board_build.ldscript = 
eagle.flash.2m512.ld dann funktioniert das ganze auch wunderbar mit 
Webserver UND den besagten preferences im nvs Speicherbereich.

Wenn ich das ganze wieder mit den original ldscript = 
eagle.flash.1m64.ld betreibe - bekomme ich wieder das besagte verhalten, 
dass die parameter nach Systemanlauf nicht gelesen werden bzw. zum Start 
hin nicht geschrieben werden.

Hat keiner eine Idee was bzw. wie ich hier weiter vorgehen kann um das 
ans laufen zu bekommen?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Vielleicht hier...
"mapping defined by hardware and sketch"
Gibts als Menüpunkt unter Tools

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html

von Johannes R. (johannes_r981)


Lesenswert?

Arduino F. schrieb:
> Vielleicht hier...
> "mapping defined by hardware and sketch"
> Gibts als Menüpunkt unter Tools
>
> https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html

Danke dir für den Input.
Ich habe jetzt einfach in der platformio.ini file mal das bit versucht 
zu setzen/rücksetzen - beides lieferte mir das gleiche ergebnis.

Hat eventuell jemand eine Idee wie ich das weiter debuggen kann?

von Johannes R. (johannes_r981)


Lesenswert?

Hab jetzt mal den Debug_Core aktiviert und folgende Informationen 
gesammelt. Kann man da etwas rauslesen?

Funktioniert:
---Boot---

[LittleFS] mounted!

LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/sta_ssid` openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/sta_password` openMode=0 accessMode=1 err=-2
lfs_file_close: fd=0x3fff36f0
lfs_file_close: fd=0x3fff36f0
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/SingleMode` openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36e0 path=`/nvs/myApp/red` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 path=`/nvs/myApp/green` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36e0 path=`/nvs/myApp/blue` 
openMode=0 accessMode=1 err=-2
lfs_file_close: fd=0x3fff36f0
lfs_file_close: fd=0x3fff36f0
Settings:       SingleColorMode: true   Color rgb: 0,0,0 
Brigthness: 80  LED counts: 5
WiFi SSID: nfN Password: nfN
---END-SETUP---

Funktioniert nicht:
---Boot---

[LittleFS] mounted!

LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/sta_ssid` openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/sta_password` openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 path=`/nvs/myApp/length` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 
path=`/nvs/myApp/SingleMode` openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36e0 path=`/nvs/myApp/red` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 path=`/nvs/myApp/green` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36e0 path=`/nvs/myApp/blue` 
openMode=0 accessMode=1 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff36f0 path=`/nvs/myApp/bright` 
openMode=0 accessMode=1 err=-2
Settings:       SingleColorMode: true   Color rgb: 0,0,0 
Brigthness: 0   LED counts: 0
WiFi SSID: nfN Password: nfN
[Prefs] not Found! Load Factory Settings!
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff39b0 path=`/nvs/myApp/length` 
openMode=5 accessMode=2 err=-2
LittleFSDirImpl::openFile: rc=-2 fd=0x3fff39b0 path=`/nvs/myApp/bright` 
openMode=5 accessMode=2 err=-2
[Prefs] Factory Settings!
Settings:       SingleColorMode: true   Color rgb: 100,100,100 
Brigthness: 80  LED counts: 5
WiFi SSID: nfN Password: nfN
---END-SETUP---

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.