Geeignete Speichermethode für dynamische Tabelle

Guten Tag,

ich habe eine Excel Tabelle gefüllt mit 5 Spalten und 300 Zeilen, diese umfasst Spalten mit Ortsbezeichnungen, Datumsangaben im Format yyyy-mm-dd, aber auch Beschreibungstexten welche immer unterschiedlich lang sind und sich ändern können.

Diese Daten möchte ich in nun in Verbindung mit einer Landkarte nutzen.
Das heißt, ich hinterlege jeden der 300 Orte mit einer WS2812b LED und möchte z. B. die passende LED Grün leuchten lassen, wenn das Datum in der zugehörigen Tabellenspalte ein halbes Jahr vom heutigem Datum zurück liegt. Dazu soll der ESP32 eine dynamische Webseite bereit stellen, welche mit den Daten aus der Tabelle erzeugt wird


und einen Knopf zum bearbeiten der Daten bietet.

Hier wäre es so, dass die LED:
1 : Rot
2 : Grün
3 : Gelb
leuchtet, da ich priorisiere. Ein Auftrag hat die höchste Priorität (rote Farbe), gefolgt von der DGUV V 3 Prüfung (4 Jährlich) (Gelb) und dem SBD (halbjährlich) (Grün)

Mein Code ist soweit fertig und bietet all diese Funktionen, es hängt nur an einer einzigen Sache.

Ich weiß keine geeignete Methode um diese Masse an Daten effektiv zu speichern. Der ESP32 soll nämlich die mit der Webseite geänderten Daten speichern und bei einem Neustart laden.

Eine Idee wäre es ein 2d Array anzulegen, aber dieses kann ich soweit ich weiß nicht im SPIFFS speichern um ihn bei Programmstart wieder einzulesen. Ich denke es ist bei 2d Arrays auch nicht möglich nur die einzelne Tabellenspalte x,y auszulesen und nach bearbeiten zu speichern.

Nach stundenlangem durchsuchen diverser Foren bin ich zu keinem Ergebnis gekommen.
Ich habe schon alles mögliche gesucht, finde aber einfach nichts passendes.

Das der Flash nur 10.000 - 100.000 mal beschreibbar ist, ist vermutlich irgendwann auch ein Problem, zumindest wenn ich immer die ganze Datei aktualisieren muss und nicht eine einzige Spalte auslesen und direkt wieder speichern kann.

Ich hoffe es ist halbwegs verständlich was ich vor habe.
Mit freundlichen Grüßen

Hallo,
ich hab das jetzt noch nicht selbst probiert, aber bei der SD Lib kannst Du den Lese/Schreib Zeiger auf eine bestimmte Byte Position setzen und ab da lesen oder schreiben. Wenn Deine Datensätze jetzt alle gleich lang sind kannst Du die Position berechnen.
Heinz

Hallo,

sind leider nicht gleich lang.

Du könntest versuchen, eine Datenbank, wie SQLite auf dem ESP32 mit MicroSD oder eine MySQL/MariaDB extern zu benutzen.

Gruß Tommy

Hallo,

eine MicroSD ist denke ich auch nicht viel langlebiger, aber immerhin austauschbar.

Eine richtige Datenbank zu benutzen wäre eine Option, bleibt nur die Frage wie ich dort die Daten herauslade ohne den Flash mit Variablen zu nutzen oder den RAM Speicher des ESP32 massiv zu füllen, bzw. bei der Datenmenge sogar zu überfluten.

Dazu solltest Du Dir die Beispiele anschauen, die da dabei sind. Ich habe auch noch nicht damit gearbeitet.
Datenbanken haben den Vorteil, dass man nicht immer die ganze DB laden muss, sondern einzelne Sätze/Teile von Sätzen. Dazu braucht es halt ein paar SQL-Kenntnisse.

Gruß Tommy

wenn alles Lokal am ESP sein, soll dann eine ganz normale CSV Datei am ESP32 im Filesystem und und mit ein paar Funktionen zum verändern und lesen oder komplett neu hochladen.

Wenn die Daten wo anders liegen können, dann halt eine schönes Interface dem ESP32 zur Verfügung stellen.

Oder ich verstehe das eigentliche Problem nicht.

Und wie genau kann ich eine spezifische Zelle einer csv laden und aktualisieren?

so wie vor 30 Jahren:
zugriff für andere prozesse sperren
Zeilenweise runterlesen bis zur betroffenen Zeile
Dabei Jede Zeile in eine temporäre Datei schreiben
Zu änderende Zeile lesen und geändert in die temp Datei schreiben
restliche Zeilen schreiben
file löschen
temp datei auf file umbennenen
zugriff wieder für andere erlauben

Alternative, weil ganz was anderes:
Hast du dir auch ganz genau angesehen, welche Einschränkungen es im ESP32 NVS/preferences.h gibt? Damit habe ich aber bisher nur ein paar Werte gespeichert. Müsstest also selber querchecken.

Hilft mir bisher leider alles nicht wirklich weiter.

Ich will es vermeiden, das ausgelesene erst in eine Variable zu schreiben sondern direkt drauf zugreifen.

Was Du willst, interessiert den ESP aber nicht. Wie soll der mit einem Wert arbeiten, wenn der nicht in Variablen (oder Registern) steht? Du scheinst da ziemlich falsche Vorstellungen zu haben, was auf fehlende Grundkenntnisse schließen lässt.

Gruß Tommy

Dann beschreibe es besser!

Mach mal einen Demosketch der dein Verständnisproblem zeigt.
nur deine "Tabelle" und die Ausgabe auf der Seriellen Schnittstelle. Und eine inhaltlich leere Funktion zum ändern von Daten nur damit wir sehen, was du dir als Interface vorstellst (wie du die Funktion aufrufen willst - was du zurückbekommen willst.

ganz ohne Webserver oder sonstige externe libraries.
Einfach damit wir uns das nicht alles aus den Finger saugen müssen. Viele von den Leuten hier haben einen ESP32 rumliegen - mach es ihnen einfach dir zu helfen!

1 Like

Es würde mich erstmal weiterbringen zu wissen wie ich ein char[10] array mit spiffs speichern und laden kann. Leider finde ich hierzu nichts.

Genau so, wie bei der SD, nur mit Basis SPIFFS. Zur SD dürftest Du mehr Beispiele finden. Du kennst die Bedingungen für char-Arrays?

Außerdem gibt es da ein Beispiel in den Files Deines ESP32. Lesen und verstehen musst Du es selbst.

Gruß Tommy

Auf was willst du hinaus? :thinking:

Auf den Abschluss der Texte mit '\0'

Gruß Tommy

Nein, sagt mir nichts.

Dann solltest Du einige Schritte zurückgehen und erst mal die einfachsten Grundlagen lernen.
Du scheinst Dich in der Situation zu befinden, dass Du einen Marathon laufen willst, aber noch nicht mal Laufen gelernt hast.

Gruß Tommy

so viele Beispiele fürs SPIFFS gibts a eh nicht in der IDE.
Ich finde im SPIFFS_time da zwei schöne code zeilen

    writeFile(SPIFFS, "/hello.txt", "Hello ");
    appendFile(SPIFFS, "/hello.txt", "World!\n");

und eine Funktion

void readFile(fs::FS &fs, const char * path)

ist da auch vorbereitet.

Es gibt für den ESP32 ein umfangreiches Beispiel, auf dass ich in #14 verlinkt habe.

Gruß Tommy