Messdaten auf einer SD-Karte Speichern
- SD-Karten Modul
- 6x MV-Kabel
- Arduino Uno
- USB-Kabel für den Arduino
- SD Library von Arduino
Beschreibung
Häufig ist es interessant, sich Messdaten von Sensoren über längere Zeit anzugucken. Sich die Werte über die serielle Schnittstelle auszugeben, ist nicht immer optimal, da der Arduino mit dem Rechner verbunden bleiben muss. Dieses Problem kann dadurch gelöst werden, die Werte auf einer SD-Karte abzuspeichern.
Verkabelung
SD-Karten Modul | Arduino |
---|---|
GND | GND |
VCC | 5V |
MOSI | 11 |
MISO | 12 |
SCK | 13 |
SS/CS | 10 |
Falls das Modul nur 3.3V Pin hat, dies mit 3.3V am Arduino verbinden nicht 5V.

Schaltplan
Die Reihenfolge der Pins kann verschieden sein. Auf die Beschriftung achten!
Code-Beispiel
#include <SD.h>
#include <SPI.h>
String logPrefix = "DATEN_"; // Prefix für die Logdateien
String logFileName; // Name der Datei zum abspeichern der Daten
unsigned long intervall = 1000UL * 5; // Abstand in dem Werte auf die SD-Karte
// geschrieben werden in Millisekunden
void setup() {
// Starte die Serielle Schnittstelle
Serial.begin(9600);
// Warte solange bis eine SD-Karte eingesteckt wurde
while (!SD.begin(SS_PIN)) {
Serial.println("Konnte keine Verbindung zur SD-Karte aufbauen.");
Serial.println("Versuche es in 2 Sekunden nochmal");
delay(2000);
}
// Finde Dateinamen der frei ist.
int number = 0;
while (SD.exists(logPrefix + number + ".CSV")) {
number++;
}
logFileName = logPrefix + number + ".CSV"; // Setze den Namen zusammen
Serial.println("Setup erfolgreich. Speichere Daten in: " + logFileName);
}
unsigned long lastTime = 0; // Letzter Zeitpunkt wo die Werte ausgegeben wurden
void loop() {
unsigned long currentTime = millis(); // Hole die jetzige Zeit.
// Teste ob die Zeit schon ein Intervall weiter ist.
if (currentTime - lastTime >= intervall) {
lastTime = currentTime; // Aktualisiere den Zeitpunkt
// sensorValue wird hier beispielsweise mit 42 belegt.
// Dies ersetzen um richtige Werte abzuspeichern.
int sensorValue = 42;
File logFile = SD.open(logFileName, FILE_WRITE); // Oefffne Datei
if (!logFile) {
Serial.println("Konnte die Datei nicht öffnen");
}
// Gebe die Daten aus auf der seriellen Schnittselle
Serial.println(sensorValue);
// Schreibe die Daten wie folgt auf die SD-Karte "Zeit,sensorValue"
logFile.print(currentTime);
logFile.print(",");
logFile.println(sensorValue);
logFile.close(); // Schliesse die Datei
}
}
Damit der Code funktioniert, muss die SD-Karte mit FAT32 formatiert werden.
Sobald der Arduino mit Strom versorgt wird und die SD-Karte erkannt
wird, wird eine Datei mit dem Namen WERTE_X.CSV
angelegt. X wird dabei
einfach hochgezählt. In dieser wird dann pro Zeile einmal die vergangene
Zeit in Millisekunden und dann der Wert des Sensors gespeichert.
Damit nun nicht immer 42 auf die SD-Karte als Wert geschrieben wird,
muss in der Zeile 38 der Wert von sensorValue
auf den Wert des Sensors
gesetzt werden.
Der Code ist so aufgebaut, dass das innere der if
-Bedingung nur alle 5
Sekunden ausgeführt wird. Dieses Intervall lässt sich durch die Variable
intervall
anpassen.
Die Methode millis()
gibt zurück, seit wie vielen Millisekunden der
Arduino schon läuft. Der Wert setzt sich nach jedem
Zurücksetzen/Hochladen oder nach einer Stromtrennung wieder auf 0
zurück.
Wenn der Arduino länger als 50 Tage am Stück läuft, kann es zu Fehlern
kommen, da millis()
ab einen Punkt dann wieder bei 0 anfängt zu
zählen.
Falls die echte Uhrzeit immer mit gespeichert werden soll, kann man eine
Real Time Clock (RTC) als extra Modul anschließen und diese statt
millis()
verwenden.
Häufige Fragen und Probleme
Die SD-Karte wird nicht erkannt.
- Sind die Kabel alle richtig verbunden?
- Wird der Arduino mit ausreichend Strom versorgt? Dies kann auftreten falls zu viele Sensoren, LEDs etc. angeschlossen sind. Der Arduino über seine Pins nur Sachen mit ca. 150mA versorgen.
- Ist die SD-Karte mit FAT32 formatiert.
Das Material und dessen Inhalte sind - sofern nicht anders angegeben - lizenziert unter der Creative Commons Lizenz CC BY-NC-SA 4.0 (für den vollständigen Lizenztext siehe https://creativecommons.org/licenses/by-sa/4.0/legalcode )