ESP8266: Preferences Probleme - Daten werden NICHT geschrieben

OP #7473481
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.

OP #7473929
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

OP #7475147
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

OP #7475987
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

OP #7479304
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?

OP #7480770
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?

OP #7480776
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---

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren