Abtastrate > 100Hz Datenspeicherung SD Karte (Zwischenspeicher?)

Hallo zusammen,

ich würde gerne eine Messung mit einer Abtastrate größer 100Hz realisieren.
Die Messung an sich dürfte kein Problem darstellen.
Ich würde die erfassten Daten aber gerne auf einer SD Karte Speichern.

Dafür würde ich gerne etwa jede Sekunde einen integrierten Wert auf die SD Karte Speichern.

Meine Frage nun:
Ich würde gerne verhindern, dass ich jede Sekunde auf die SD Karte schreiben muß.
Gibt es eine sinnvolle Möglichkeit eine Art Zwischenspeicher zu verwenden, der dann nur alle paar Minuten ausgelesen und auf die SD-Karte geschrieben wird.

Die Messung soll recht lange laufen (> 1 Woche)
Die Datenstruktur ist recht simpel.

Timestamp | Messwert1 (int) | Messwert2(int)

Gruß

Wenn man eine Ansammlung von unterschiedlichen Datentypen hat verwendet man Arrays aus structs:

Ausserdem wird physikalisch erst auf die Karte geschrieben, wenn ein 512 byte Block voll ist.
Zum einfachen Austausch wäre Ascii schon sinnvoll
hh:mm:ss 1023 1023 sind 19 Zeichen, es würde also alle 25 sec geschrieben.
ca. 1k/Minute = 1.5MB / Tag = ca. 10 MB in der Woche.

Alternativ könntest du dir den Zeitstempel sparen und brauchst binär nur 4 byte, alo weniger als 25% der obigen Schätzung.
( → alle 2 Minuten ein Block )

Generelle Frage: wofür brauchst du 100 Messungen / sek, und wie machst du daraus dann 2 / sek ( Max / Min ?)

michael_x:
Ausserdem wird physikalisch erst auf die Karte geschrieben, wenn ein 512 byte Block voll ist.

Aber nur wenn man nicht nach jedem einzelnem Schreibvorgang close() macht. close() schreibt automatisch den Puffer auf die Karte.

Beim Speichern im RAM musst du übrigens aufpassen, dass nicht viel RAM da ist. Ein unsigned long als Zeitstempel mit der Unix-Zeit und zwei ints sind 4 + 2 + 2 = 8 Bytes. Der UNO hat nur 2500 Bytes RAM. Davon gehen bei der SD Klasse schon mal 512 Bytes für einen internen Puffer drauf. Dann brauchst du noch Speicher für andere Sachen. Da bietet es sich an mit einer Funktion zu testen was noch frei ist.

Oder du verwendest wie gesagt genau diesen Puffer als Zwischenspeicher. Wird vielleicht vernünftiger sein als die Daten nochmal extra zu speichern.

Serenifly:
Beim Speichern im RAM musst du übrigens aufpassen, dass nicht viel RAM da ist. Ein unsigned long als Zeitstempel mit der Unix-Zeit und zwei ints sind 4 + 2 + 2 = 8 Bytes. Der UNO hat nur 2500 Bytes RAM. Davon gehen bei der SD Klasse schon mal 512 Bytes für einen internen Puffer drauf. Dann brauchst du noch Speicher für andere Sachen. Da bietet es sich an mit einer Funktion zu testen was noch frei ist.

Oder du verwendest wie gesagt genau diesen Puffer als Zwischenspeicher. Wird vielleicht vernünftiger sein als die Daten nochmal extra zu speichern.

Du bist sehr optimistisch.
Der Arduino UNO mit dem ATmega328 hat 2kByte (2048) RAM. Der ATmega32U4 auf dem Leonardo hat 512 Byte mehr.
Grüße Uwe

Oops. 2000. 2500. Leicht zu verwechseln :stuck_out_tongue:

Und ja, eigentlich muss man Binär rechnen. Nicht wie die Festplatten Hersteller...

Okay,

wenn ich das richtig verstanden habe, wird ohnehin ein Puffer von 512 byte angelegt.
Das wäre ja schon ganz ordentlich, wenn nur alle 512byte geschrieben wird.

Ich überlege nur gerade, wie das im Detail funktioniert.

Berechnet man wann der Puffer voll ist und gibt dann den close() - Befehl?

Danke & Gruß

Ich überlege nur gerade, wie das im Detail funktioniert.
Berechnet man wann der Puffer voll ist und gibt dann den close() - Befehl?

Das macht die SD library für dich.
( Wie gesagt, wenn du nicht close() oder flush() oder so was aufrufst. )

Dann ist natürlich die Frage, was bei einem Spannungsausfall passiert.
Wenn du ausreichend sicher bist, dass das in der Woche nicht passiert, umso besser.

Alternativ kannst du z.B. alle 4 ( oder 8, 12, 24) Stunden close() machen, und bei der Gelegenheit eine andere (neue) Datei anlegen.
Und/Oder die Spannungsversorgung mit einem Dicken Elko (SuperCap) puffern und überwachen und bei Spannungsausfall schnell noch sichern, ...