Sensordaten zwischenspeichern (buffern)

Hallo zusammen,

ich stehe erneut vor einer mir nicht lösbaren Aufgabe - besser gesagt fehlt mir der Ansatz bzw. die effizienteste Lösung.

Ich lese Sensordaten am Arduino in sehr schnellem Zyklus (1-2ms). Diese Sensordaten sollten alle zwischengespeichert werden, und im 300-500ms Takt in eine SD-Karte geschrieben werden, oder über eine Serielle Schnittstelle übertragen werden.

Gibt es eine professionelle Lösung für das Zwischenspeichern dieser Werte?
Oder ist es die beste Möglichkeit ein Array mit Daten zu füllen und nach dem Schreiben zu leeren?

Gibt es bei längerer Verwendung irgendwann mal ein Problem mit der Lebensdauer der SD Karte? Oder ist das zu vernachlässigen?

patrick_bit4bit:
Ich lese Sensordaten am Arduino in sehr schnellem Zyklus (1-2ms). Diese Sensordaten sollten alle zwischengespeichert werden, und im 300-500ms Takt in eine SD-Karte geschrieben werden, oder über eine Serielle Schnittstelle übertragen werden.

Gibt es eine professionelle Lösung für das Zwischenspeichern dieser Werte?
Oder ist es die beste Möglichkeit ein Array mit Daten zu füllen und nach dem Schreiben zu leeren?

Über welche Größe je Umlauf reden wir denn? Ein byte? Ein int8_t? Ein float?
Wenn Du SD nutzt, macht die lib einen buffer auf, der - wenn Du kein .flush oder .close machst, wird erst alle 500 bytes geschrieben.

Gibt es bei längerer Verwendung irgendwann mal ein Problem mit der Lebensdauer der SD Karte? Oder ist das zu vernachlässigen?

Immer wieder gestellt und immer wieder beantwortet:

der Wert wird ein int_16 oder ein float sein.

Danke für die Info!
Das heisst ich führe das Schreiben in eine .txt in jedem Zyklus aus, und schließe diese nicht?

bezüglich Lebensdauer:
Wenn ich also jede ms einen bool Wert schreibe komme ich in ca 16min auf 1Mio Werte.
Die Angabe der Lebensdauer ist ca. 1Mio Schreibvorgänge.
Ist diese Angabe auf das einzelne Register bezogen (1Mio x Speichergröße)?

patrick_bit4bit:
der Wert wird ein int_16 oder ein float sein.

Danke für die Info!
Das heisst ich führe das Schreiben in eine .txt in jedem Zyklus aus, und schließe diese nicht?

Der Puffer ist 512bytes - Dein float ist 4 bytes - nach spätestens 128 Umläufen wird geschrieben.

bezüglich Lebensdauer:
Wenn ich also jede ms einen bool Wert schreibe komme ich in ca 16min auf 1Mio Werte.
Die Angabe der Lebensdauer ist ca. 1Mio Schreibvorgänge.
Ist diese Angabe auf das einzelne Register bezogen (1Mio x Speichergröße)?

Vielleicht hilft es ja mal Angaben der Hersteller zu vergleichen.
Für WesternDigital/SanDisk hier:

Und da kommt dann auch zum Vorschein, das man sich nicht unbedingt mit Karten aus dem billigen Consumerbereich beschäftogen sollte. :wink:

Wenn die SD Karte nur zum Datenloggen verwendet wird, wird im Idealfall jeder Daten-Sektor nur einmal im Leben des Projektes beschrieben. Die Sektoren der Dateiverwaltung etwas häufiger. Auch wenn du zwischenzeitlich eine Datei schließt oder flush() aufrufst, wird das Ziel "Jeder Sektor ein einziges Mal in seinem Leben" knapp verfehlt. SD Karten sind so groß, dass man sie mit Messdaten üblicherweise nicht voll kriegt.

Meine Erfahrung: Wenn SD - Karten zum physikalischen Datentransfer zwischen Arduino und PC verwendet werden, ist die mechanische Beanspruchung beim Rein-Raus (evtl. gar mit Schreibschutz ein/aus) die relevante Belastung. Wenn die SD eher als fest installierter ExternSpeicher verwendet wird, ist das natürlich etwas anderes.

Ein Messwert je ms über mehrere Minuten ist natürlich ein Haufen Rohdaten, über die man sich schon Gedanken machen sollte. Wenn da erstmal keine Datenreduktion gewollt ist, sollte man auch bei den gemessenen Rohwerten bleiben und nicht int16->float32 umrechnen.

Noch zwei OT Anmerkungen:

  • In .txt Dateien wird üblicherweise lesbarer Text erwartet. Binärdaten sind natürlich effektiver.
  • Brauchen die Daten keine Zeitstempel? ( Was misst du überhaupt? )

Danke michael_x für die Inforeiche Antwort.

Die Messung wird von einem 16bit ADC in einer Abtastrate von ca 400SPS (~1 Wert in 2ms).
Das Ziel wäre einen gemessenen Wert innerhalb von ca.10ms zu messen und abzulegen.

Ich bin mittlerweile auf eine Datenbank Library gestossen (jedoch noch nicht vertraut) - sqlite3.
Ich denke von der performance ist eine Datenbank die beste alternative.