Konfiguration auf SD-Karte speichern JSON sinnvoll?

Moin,
ich bastel mir gerade ein kleines Gerät zusammen. Board soll MEGA, UNO oder ESP32 werden.
Testen erledige ich gerade auf dem MEGA.
Dieses Gerät soll man konfigurieren können mit ca. 10-15 Werten.
Diese sollen gespeichert werden, um nach einem Stromausfall wieder da zu sein. Dies möchte ich über eine SD-Karte realisieren.
Soweit so gut und lesen, bzw. schreiben auf SD ist jetzt auch nicht das Problem.
Bisher schaue ich mir 2 Bibliotheken an. SD.h und SDFat.h.
Die SDFat ist mir für meinen Bedarf eigentlich zu groß und braucht ewig zum kompilieren.
Primär geht es mir um das Problem der Datenhaltung.
AUF SD-Karte entweder als csv oder als JSON ablegen sind meine Überlegungen.
CSV ist natürlich schlanker, allerdings bin ich schon seid langem ein Freund von JSON. Sehr komfortabel in meinen Augen.
Nur wie schaut es auf einem µC aus? JSON arbeitet viel mit Strings und das wiederum frisst gut Speicher.

Welchen Vorschlag habt ihr, üm mehrere Werte möglichst sinnvoll in einer Datei abzulegen und wieder aufzurufen?

mfG
Tyr

Die Konfigurationsdaten des Mega oder Uno kannst du doch im EEProm speichern.
Die des ESP32 in den Preferences.

Mach es als csv/txt.
Du kennst die Reihenfolge des Aufbaus. Alles in einem Rutsch einlesen bis zum Trennzeichen - auswerten - nächstes einlesen bis zum trennzeichen / EOF.
Wenn Du JSON machen willst, brauchst Du einen entsprechend grossen Puffer, der das insgesamt aufnimmt.

:wink: Ich stell mir das grad vor, einen Cocktailmaker mit veränderlichen Rezepten....

SD am UNO für "15 Parameter" wär mir ein zu großer Resourcenfresser.
Ähnlich sehe ich es mit JSON auf einem kleinen Prozessor.

Wenn nicht das "Datenträger" entnehmen im Vordergrund stehen soll, dann würde ich auf verfügbares zurückgreifen:
ESP32 preferences.
Mega/UNO EEPROM.get / EEPROM.put

Netürlich ist für die Eigenschaft Daten/Einstellungen/Rezepte auf dem PC zu generieren und dann per CSV auf der Sd Karte für den Arduino und konsorten verfügbar zu machen sinnvoll.
3D Drucker machen das ja schon ewig.

Wenn die Daten/Einstellungen/Rezepte auf dem system selbst erzeugt werden dann sehe iche EEprom sinnvoll,

Grüße Uwe

Es geht ja gerade darum, die Konfiguration wechselbar zu halten. Sprich SD-Karte raus und in ein anderes Gerät, bzw. andere SD-Karte und habe eine neue Konfiguration.
Von daher fällt der EEPROM leider aus. Dabei wäre es durch seinen tabellarischen Aufbau so schön einfach. :blush:

Also am besten in einer CSV halten, die Zeilenweise einlesen, bis der passende Wert kommt?
Wie mache ich das am besten mit der Datenhaltung im Programm. Auf einem großen System hätte ich alle Daten in einen globalen Array eingelesen und gut.
Ist es bei einem Arduino vielleicht sinnvoller, die Daten nur wenn sie gebraucht werden von der SD-Karte abzufragen und gar nicht global verfügbar zu machen?

Nein.
Nicht bis der passende Wert kommt.
Wobei das natürlich auch geht - aber dazu musst Du wissen, wann denn der passende Wert da ist.

Eine .csv zeichnet sich dadurch aus, das je Zeile eine WerteListe, geteilt in Spalten vorliegt.
Der (Listen)Aufbau ist immer gleich.

Alternativ kannst Du auch ein Konfigurationsfile anlegen.
Das entspricht dann dem Format einer Initialisierungsdatei.
Dann suchst Du die entsprechende Sektion und parst durch die Schlüssel und kommst auf den Wert.

Beschreib doch mal, was Du da machen willst.

Das Programm hat zb.: Startwert, Stopwert, Laufzeit, Pausenzeit.
Diese Werte sind veränderbar.
Jetzt soll das Programm, wenn der Sensor unter Start geht einschalten für die Laufzeit, Pause machen (Pausenzeit) und wieder starten. So lange, bis der Sensor über dem Stopwert ist.
Die Logik ist ja kein Problem.
Allerdings habe ich große Schwierigkeiten, das Ressourcenschonend mit der Speicherung umzusetzen. :sob:
Ich hätte jetzt versucht einen enum zu bauen und mit diesem die Funktion zu füttern, welche ausließt. Diese geht Zeile für Zeile durch, splittet am "," und das so lang, bis der Variablenname gefunden ist. Dann gibt sie den Wert zurück.

Oder bin ich da jetzt komplett auf dem Holzweg?

Meinst du damit eine .ini Datei?

Jupp.

Aber Du hast doch nur 4 Werte. Komma/Semikolon separiert und hoffentlich kein komma/semikolon in den Werten.

Die kommen in eine Zeile.
Du liest genau diese eine Zeile und teilst den Inhalt dann auf.
Die Reihenfolge ist immer die gleiche.

Es werden ja mehr Werte. Die Nutzung einer .ini gefällt mir recht gut. Gibt es dazu schon eine fertige Lib?

Vor allem wäre das ein guter Weg für mein Display und das Logging, um die ganzen Texte auch auszulagern auf die SD-Karte. Somit ist der ganze Text-Kram sauber in files abgelegt und der Arduino holt sich bei Bedarf das, was er braucht.

Hallo,
was spricht gegen einen ESP mit einer Weboberfläche , Daten auf dem internen Filesystem. Da gehen dann auch mehrere Rezepte ohne Probleme drauf. Ein Rezept eine Zeile.
Da kannst Du auch erst mal ohne Weboberfläche anfangen und schickst die Datei dann per OTA an den ESP.

Heinz

Wenn Du jetzt nicht endlich mit Deinem Vorhaben vollständig rumkommst bin ich raus.
Es macht keinen Sinn hier Stückleweise irgendwas aufzudröseln.

start=42
stop=21
laufzeit=4711
pause=815

Zeilenweise
Bezeichner=Wert

Zeilenweise einlesen
mit strtok aufteilen
Variable übernehmen,
nächste Zeile

wo ist das Problem?

So hab jetzt mal 2 *.ini Dateien gebaut. Wie es ungefähr aussehen soll:

;Arduino INI Datei
[Sensorwerte]
sens1_min=1
sens1_max=100
[Programmwerte]
set_Value=50
pump_run=3
pump_pause=5
[Zeitstempel]
year=2022
month=2
day=13
hour=20
minute=03
;Displaytexte
[Ueberschrift]
set_Value=Sollwert:
menue1=SOLL(%):    IST(%):
menue2=Pumpe Pumpen (min):
menue3=Pumpe Pause (min):
submenue1=Uhrzeit:
submenue2=Datum einstellen:
submenue2_1=Tag:
submenue2_2=Monat:
submenue2_3=Jahr:
submenue3=Uhrzeit einstellen:
submenue3_1=Stunde:
submenue3_2=Minute:
text_line2=Einstellen:
[Datumsformate]
tf_all=DD.MM.YYYY,hh:mm:ss
tf_date=DD.MM.YYYY
tf_time=hh:mm:ss

und diese beiden Dateien will ich zum Start einlesen, die Werte setzen und falls ein Wert verändert wird, das wieder auf die SD-Karte zurückschreiben.

Hallo,
und wozu soll die zweite Datei gut sein, Das sind doch konstante Texte, die kannst Du doch fest im Code hinterlegen.
da machst Du 3 Blöcke und verzweigst mit einer Variablen "seite" in den passenden Block. Da blickst Du doch sonst nach 3 Wochen nicht mehr durch.
Die erste Datei soll ja die Nutzdaten enthalten , warum nicht alles in einer Zeile getrennt mit einem Trennzeichen. CSV da bietet sich doch ein ";" an, nein es drängt sich auf.
Heinz

Und du willst dir echt auf einem Uno die Arbeit mit Kommentaren und Sections antun?
Hast dir die INI LIbrary schon angesehen und ausprobiert?

Hallo Rentner,
Ja das sind die ganzen Texte, die im Display angezeigt werden sollen. Dachte mir halt, wenn ich die auslagere, wie es ja bei einigen Displays von Haus aus ist, würde ich gut was an Speicher sparen, da es ja alles Strings sind, die der Arduino nicht mag.

Wie meinst du das genau?

Ja das ist von der Funktion her ziemlich das selbe. *.ini Dateien sind halt übersichtlicher in meinen Augen. Und vielleicht gibt es ja da schon eine fertige Bibliothek, auf welche ich zuggreifen kann.

Das genau ist ja meine Frage. auf einem Gerät, welches gut Ressourcen hat, wie ein Raspi, alles easy, aber µC sind Neuland für mich und die Lineare Abarbeitung und Speichernutzung muss ich erst verinnerlichen. Soll ja kein Bastelding werden.

lesen und studieren, Beispiele ausprobieren.

Danach entscheiden ob man das so machen will oder

Zeilenweise einlesen
mit strtok aufteilen
Variable übernehmen,
nächste Zeile