Messdaten auf einer SD-Karte Speichern

Erstellt von Thore Sommer
Benötigtes Material
  • SD-Karten Modul
  • 6x MV-Kabel
  • Arduino Uno
  • USB-Kabel für den Arduino
Benötigte Software
  • SD Library von Arduino
Als PDF
PDF-Download
Arbeitsblatt
PDF-Download Lehrer
Lehrerblatt

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 ModulArduino
GNDGND
VCC5V
MOSI11
MISO12
SCK13
SS/CS10

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

Schaltplan

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.

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.

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 )