SD-Karte - Messdaten einfach speichern

Erstellt von Thore Sommer
Benötigtes Vorwissen
Benötigtes Material
  • Arduino Uno
  • USB-Kabel für den Arduino
  • microSD-Karten Modul
  • microSD-Karte
  • 6x MW-Kabel
Benötigte Software
  • Bibliothek SD von Arduino
Als PDF
PDF-Download
Arbeitsblatt
PDF-Download erweitert
Erweitertes Arbeitsblatt

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 microSD-Karte abzuspeichern.

Verkabelung

SD-Karten ModulArduino
GNDGND
VCC5V
MOSI11
MISO12
SCK13
SS/CS10

Falls das Modul nur 3.3V Pin hat, dies mit 3.3V statt 5V am Arduino verbinden.

Schaltplan

Schaltplan

Die Reihenfolge der Pins kann verschieden sein. Auf die Beschriftung achten!

Code

#include <SD.h>
#include <SPI.h>
String logPrefix = "DATEN_";  // Prefix für die Logdateien
String logFileName;           // Name der Datei zum Abspeichern der Daten

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);
}

void loop() {
  // sensorValue wird hier beispielsweise mit 42 belegt.
  // Dies ersetzen um richtige Werte abzuspeichern.
  int sensorValue = 42;

  File logFile = SD.open(logFileName, FILE_WRITE);  // Oeffne 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 "sensorValue"
  logFile.println(sensorValue);

  logFile.close();  // Schliesse die Datei

  // Warte 1000 Millisekunden
  delay(1000);
}

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 der Wert des Sensors gespeichert.

Damit nun nicht immer 42 auf die SD-Karte als Wert geschrieben wird, muss in der Zeile 28 der Wert von sensorValue auf den Wert des Sensors gesetzt werden.

Der Code ist so aufgebaut, dass das nach jeder Ausführung am Ende 1000 Millisekunden gewartet wird. Dieses Intervall lässt sich durch das delay(..) in Zeile 45 anpassen.

Große SD-Karten Module

Es gibt auch SD-Karten Module für die großen SD-Karten. Wenn man diese an den Arduino anschließt, wird auf den Datenleitungen 5V benutzt, was in unserer Erfahrung zu Fehlern führt und die SD-Karte beschädigen kann.

Aufgaben

Beschreibe, was der Code tut!

Es wird zuerst ein Präfix für die Logdateien, der Name der Datei zum Abspeichern und der Speicherzeitabstand festgelegt. Im Setup wird auf eine eingesteckte SD-Karte gewartet und versucht eine Verbindung aufzubauen. Danach wird ein freier Dateiname gesucht und dieser abgespeichert. In der loop wird der Speicherzeitpunkt aktualisiert, indem die Datei geöffnet, Daten und Zeitpunkt neu geschrieben werden und die Karte wieder geschlossen wird.

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 kann ü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 )