Frage zur Speicherung von dynamischen Variablen

Hallo zusammen,

Ich lese mit einem lolin nodemcu v3 von einem Server die angeschlossenen Drucker (3-4) und deren Informationen via API aus (Pro Drucker ca. 10). Die Daten sollen initial beim Hochfahren einmal abgerufen werden und dann dynamisch in ein Minuten Abständen kontrolliert / angepasst werden.

Das Auslesen in „normale“ Variablen (Stings) klappt soweit auch problemlos. Nun muss ich diese Daten aber irgendwie zwischenspeichern und das am besten dynamisch, weil sich die Anzahl der Drucker ändert und ich nur die aktiven benötige.

Meine Frage ist nun, was ihr empfehlen würdet, wie ich in einem solchen Szenario die Daten am besten Speichere.

Meine Ansätze wären folgende:

  1. für jeden Drucker einen typedef struct zu erstellen und die Daten darin zu speichern. Hier könnte man die Daten, wenn der Drucker nicht mehr angeschlossen ist wieder komplett löschen und so wieder Speicher schaffen. Hier ist dann aber die Frage, wie sich ein struct dynamisch erstellen und ansprechen lässt.

  2. Die Daten stumpf in einem Array speichern. Für jeden Drucker dann die gleiche Anzahl von Einträgen und bei Bedarf das Array eben erweitern lassen. Hier sehe ich dann aber das Problem, dass wenn ich Einträge aus der Mitte entfernen möchte, dieses aufwendig wird oder aber eben Speicherleichen entstehen, wenn man diese Felder einfach dann leer setzt.

  3. Alles auf einem Datenlogger speichern (SD-Karte oder IC). Denke für den Speicherbedarf wäre das die effektivste Lösung, dann müsste ich eben nur zusätzliche Hardware verbauen, was ich aufgrund von Platzmangel im Gehäuse lieber nicht machen würde.

Gibt es noch andere Möglichkeiten, die mir so nicht einfallen oder die ich ggf. erst gar nicht kenne, oder würdet ihre eine der Oberen Optionen empfehlen.

Danke für alle Infos und Anregungen.

Steve

Dynamischer Speicher geht mit new/delete. Um welche Datenstruktur es sich dabei handelt ist vollkommen egal. Du musst nur irgendwie die Zeiger darauf verwalten. Normal nimmt man dafür Vektoren oder Listen. Die gibt es aber auf dem Arduino nicht. Wenn du eine maximal mögliche Anzahl von Einträgen hast, kannst du ein Array aus Zeigern dieser Größe anlegen.

typedef struct ist übrigens eine C Sache. In C++ braucht man das typedef in den aller meisten Fällen nicht.

Chaos_Lord: 3. Alles auf einem Datenlogger speichern (SD-Karte oder IC). Denke für den Speicherbedarf wäre das die effektivste Lösung, dann müsste ich eben nur zusätzliche Hardware verbauen, was ich aufgrund von Platzmangel im Gehäuse lieber nicht machen würde.

mir ist zwar noch nicht klar warum du das persistieren willst, aber am NodeMCU hast du ein SPIFFS ... ein Filesystem zur Verfügung, warum nicht dorthin?

Persistieren möchte ich das Alles nicht, daher ja auch meine Frage welche Ideen ihr hättet, bzw wie ihr es machen würdet.

SPIFFS wäre natrlich eine Idee, wenn man eben die Speicherung auf einem festen Medium überlegt.

Die Idee mit den Arrys wäre auch eine Überlegung aber wie schon geschrieben wäre das ein ziemliches Gewurschtel mit den Zeigern in einem zusätzlichem Array.

Chaos_Lord: Die Idee mit den Arrys wäre auch eine Überlegung aber wie schon geschrieben wäre das ein ziemliches Gewurschtel mit den Zeigern in einem zusätzlichem Array.

Dein Vorschlag war die Daten selbst in einem Array zu speichern. Das ist etwas anderes

Hier sehe ich dann aber das Problem, dass wenn ich Einträge aus der Mitte entfernen möchte

Dafür gibt es übrigens verkettete Listen

wie viele Bytes kommen denn pro Information (wie du es nennst)?

weil "3-4" Drucker ... 10 "Informationen" ... 40x wie viel - ... ist das echt ein Problem im RAM zu halten?

Wenn das wirklich nur 3-4 Drucker sind, wieso nimmst dann nicht einfach ein Array aus 4 structs? Ob das eine mal nicht gebraucht wird ist egal

Man könnte ja zusätzlich ein Flag "aktiv" mit ins struct aufnehmen.

Gruß Tommy

Serenifly: Normal nimmt man dafür Vektoren oder Listen. Die gibt es aber auf dem Arduino nicht.

Soweit mit bekannt, stehen große Teile der STL für ESP zur Verführung. z.B. list und vector finde ich in meinen Includedateien.

Danke für die vielen Anregungen,

bin jetzt auf euren Vorschlag eingegangen, die Drucker fest in einem Array als structe zu speichern und dann eben einen Falg zu setzen welcher aktiv ist.

Klappt soweit.

Grüße

Steve