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

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);  // 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 "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.

Anmerkung

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.

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 )