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?
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.
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,
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.
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.
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.
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.
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.
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
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.