Wie kann ich ein Array aus Structs in EEPROM speichern?

Ein einzelnes Struct in EEPROM zu schreiben und lesen funktioniert, aber wenn ich dann ein Arary aus Structs speichern will bekomme ich alles falsche Werte zurück.

Wie speicherst/liest Du es denn? Setze Deinen Sketch bitte in Codetags (</> oben links im Forumseditor).

Gruß Tommy

Hab noch vergessen zu sagen, dass es ein ESP8266 Board ist.
Die zu speichernden Daten sind in einem JSON String, welchen ich dann parse. Dies funktioniert schon. Das struct “SETTINGS” wird nur einmal in den EEPROM geschrieben und gelesen was auch schon funktioniert.

#include <ArduinoJson.h>
#include <EEPROM.h>

struct SETTINGS
{
  byte CONFIG;
  float DAY_TEMPERATURE;
  float NIGHT_TEMPERATURE;
};

struct SCHEDULE
{
  word TIME_START;
  word TIME_STOP;
  bool MONDAY;
  bool TUESDAY;
  bool WEDNESDAY;
  bool THURSDAY;
  bool FRIDAY;
  bool SATURDAY;
  bool SUNDAY;
};

void setup()
{
  Serial.begin(115200);
  WRITE();
  READ();
}

void loop()
{

}

void WRITE()
{
      int ADDRESS = 0;
      
      Serial.println(JSON);

      DynamicJsonBuffer BUFFER;
      JsonObject& root = BUFFER.parseObject(JSON);

      SETTINGS SETTINGS_STRUCT = {root["CONFIG"], root["DAY_TEMPERATURE"], root["NIGHT_TEMPERATURE"]};
      
      Serial.println(SETTINGS_STRUCT.CONFIG);
      Serial.println(SETTINGS_STRUCT.DAY_TEMPERATURE);
      Serial.println(SETTINGS_STRUCT.NIGHT_TEMPERATURE);
      
      EEPROM.begin(sizeof(SETTINGS));
      EEPROM.put(ADDRESS, SETTINGS_STRUCT);
      EEPROM.commit();
      ADDRESS += sizeof(SETTINGS);
      
      SCHEDULE SCHEDULE_STRUCT[root["SCHEDULE"].size()];
      for(int COUNTER = 0; COUNTER < root["SCHEDULE"].size(); COUNTER++)
      {
        SCHEDULE_STRUCT[COUNTER].TIME_START = root["SCHEDULE"][COUNTER]["TIME_START"].as<word>();
        SCHEDULE_STRUCT[COUNTER].TIME_STOP = root["SCHEDULE"][COUNTER]["TIME_STOP"].as<word>();
        SCHEDULE_STRUCT[COUNTER].MONDAY = root["SCHEDULE"][COUNTER]["MONDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].TUESDAY = root["SCHEDULE"][COUNTER]["TUESDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].WEDNESDAY = root["SCHEDULE"][COUNTER]["WEDNESDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].THURSDAY = root["SCHEDULE"][COUNTER]["THURSDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].FRIDAY = root["SCHEDULE"][COUNTER]["FRIDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].SATURDAY = root["SCHEDULE"][COUNTER]["SATURDAY"].as<bool>();
        SCHEDULE_STRUCT[COUNTER].SUNDAY = root["SCHEDULE"][COUNTER]["SUNDAY"].as<bool>();

        Serial.println(SCHEDULE_STRUCT[COUNTER].TIME_START);
        Serial.println(SCHEDULE_STRUCT[COUNTER].TIME_STOP);
        Serial.println(SCHEDULE_STRUCT[COUNTER].MONDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].TUESDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].WEDNESDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].THURSDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].FRIDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].SATURDAY);
        Serial.println(SCHEDULE_STRUCT[COUNTER].SUNDAY);
        
        EEPROM.begin(sizeof(SCHEDULE));
        EEPROM.put(ADDRESS, SCHEDULE_STRUCT[COUNTER]);
        EEPROM.commit();
        ADDRESS += sizeof(SCHEDULE);
      }
      CONFIGURATION();
    }
  }
}

void READ()
{
  int ADDRESS = 0;

  SETTINGS CONFIG;
  EEPROM.begin(sizeof(SETTINGS));
  EEPROM.get(ADDRESS, CONFIG);
  ADDRESS += sizeof(SETTINGS);

  Serial.println(CONFIG.CONFIG);
  Serial.println(CONFIG.DAY_TEMPERATURE);
  Serial.println(CONFIG.NIGHT_TEMPERATURE);
  
  SCHEDULE TIMETABLE[1];
  for(int COUNTER = 0; COUNTER < 1; COUNTER++)
  {
    EEPROM.begin(sizeof(SCHEDULE));
    EEPROM.get(ADDRESS, TIMETABLE[COUNTER]);
    ADDRESS += sizeof(SCHEDULE);
    
    Serial.println(TIMETABLE[COUNTER].TIME_START);
    Serial.println(TIMETABLE[COUNTER].TIME_STOP);
    Serial.println(TIMETABLE[COUNTER].MONDAY);
    Serial.println(TIMETABLE[COUNTER].TUESDAY);
    Serial.println(TIMETABLE[COUNTER].WEDNESDAY);
    Serial.println(TIMETABLE[COUNTER].THURSDAY);
    Serial.println(TIMETABLE[COUNTER].FRIDAY);
    Serial.println(TIMETABLE[COUNTER].SATURDAY);
    Serial.println(TIMETABLE[COUNTER].SUNDAY);
  }
}

Serielle Ausgabe:

Schreiben:
0
30.00
30.00
1700
1900
1
1
1
1
1
1
1

Lesen:
0
30.00
30.00
26393
16400
1
0
0
0
0
253
254

Ich habe beim ESP8266 noch nicht mit EEPROM gearbeitet, da das sowieso nur eine Emulation im Flash ist. Da kann ich auch gleich SPIFFS nutzen und die Daten in ein Config-File schreiben.

Ein binäres Configfile mit einem Array aus Strukts benutze ich im Weihnachtsstern. Du kannst ja mal schauen, ob Du daraus etwas für Dich nutzen kannst.
Die Funktionen sind writeConfig/readConfig und in der _config.ino (im Zip) ausgelagert.

Gruß Tommy

Ich möchte es gerne mit EEPROM machen.
Das problem ist, dass ich kein Array in den EEPROM speichern und lesen kann...