Wer seinen Arduino als Datenlogger nutzt, um
z.B. einen Temperaturverlauf auf zu zeichnen, steht schnell vor dem Problem, wie die erfassten Daten gespeichert werden sollen.
Natürlich könnte man alle Daten irgendwie in einem Array speichern und dann per serielle Schnittstelle an den PC übertragen.
Doch hier ist der Speicher begrenzt und fällt einmal der Strom aus, sind die Daten futsch.
Außerdem benötigt man zusätzliche Software, um die Daten von der seriellen Schnittstelle in Empfang zu nehmen und aus zu werten.
Das Problem mit dem flüchtigen Speicher könnte man umgehen, wenn man die Daten im EEPROM des Arduinos speichert - doch auch hier ist der Speicherplatz und vorallem die Zahl der Schreibzyklen begrenzt.
Auch das Problem mit der Übertragung bleibt bestehen.
Am Besten speichert man seine Daten daher auf einer Speicherkarte.
Hier sind die Daten auch bei Stromausfall sicher gespeichert, außerdem lässt sich die Speicherkarte direkt mit dem PC verbinden und auslesen.
Wenn man die Daten im richtigen Format speichert, kann man sie auch gleich mit Excel, Matlab oder ähnlichen Programmen auswerten.
Hardware
Bei Ebay gibt es SD-Karten-Module bereits für einen Euro. Ich habe mich für das Modul von LC Technology entschieden:
Die Pinbelegung ist klar ersichtlich.
Neben Pins für die Spannungsversorgung (+5V, +3,3V und GND) gibt es Pins für den SPI-Bus, mit dem auf die Speicherkarte zugegriffen werden kann.
Die Pins sind zwar zweireihig angeordnet, die obere und die untere Reihe sind aber jeweils intern verbunden.
SD-Karten arbeiten mit einem Spannungspegel von 3,3V. Das Modul kann wahlweise mit 3,3V oder mit 5V versorgt werden.
Im letzteren Fall bringt ein eingebauter Spannungswandler die Spannung automatisch auf 3,3V.
Die SPI-Pins werden allerdings NICHT gewandelt, sie dürfen also auch NICHT direkt mit dem Arduino verbunden werden - sonst wird die SD-Karte gegrillt.
Hier muss also ein Pegelwandler zwischen geschaltet werden.
Der fertige Aufbau sieht so aus:
Das Modul wird über den 5V-Ausgang vom Arduino versorgt.
Die SPI-Pins werden über den Pegelwandler wie folgt mit dem Arduino verbunden:
MOSI an Pin 11
MISO an Pin 12
SCK an Pin 13
CS an Pin 4
Ich habe einen bi-direktionalen Wandler genommen und lasse alle Pins über den Wandler laufen.
Beides ist streng genommen nicht nötig. Theoretisch reicht auch ein Pegelwandler, der nur in eine Richtung von 5V auf 3,3V wandelt (z.B. den 74HC4050).
Über diesen Wandler laufen dann nur die Pins MOSI, SCK und CS. Der MISO-Pin kann direkt mit dem Arduino verbunden werden.
Ist alles richtig verkabelt, kann die SD-Karte in das Modul gesteckt werden.
Der Arduino kann mit SD-Karten im Format FAT16 und FAT32 umgehen, laut Arduino-Referenz wird FAT16 allerdings bevorzugt.
Software
Die SD-Library für Arduino liefert einige Beispiele, mit der die Funktion des Aufbaus gleich getestet werden kann.
Ich habe mich für das Beispiel "Datalogger" entschieden.
Im Beispiel werden die Werte der drei analogen Eingänge in einer txt-Datei auf der Karte gespeichert.
#include <SD.h>const int chipSelect = 4;void setup(){ // Open serial communications and wait for port to open: Serial.begin(9600); Serial.print("Initializing SD card..."); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(10, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized.");}void loop(){ // make a string for assembling the data to log: String dataString = ""; // read three sensors and append to the string: for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += ","; } } // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); // print to the serial port too: Serial.println(dataString); } // if the file isn't open, pop up an error: else { Serial.println("error opening datalog.txt"); } }
In der setup()-Funktion wird zuerst eine serielle Verbindung aufgebaut, mit dem Befehl SD.begin(chipSelect) wird dann die SD-Karte initialisiert.
Als Parameter wird hier der Pin übergeben, an dem CS angeschlossen ist. War die Initialisierung erfolgreich, geht es in den loop()-Funktion weiter.
Hier werden die Werte der analogen Eingänge ausgelesen und in einer String-Variable gespeichert .
Mit dem Befehl SD.open() wird dann die Datei "datalog.txt" im Schreib-Modus geöffnet.
Ist das Öffnen erfolgreich, wird der Wert der String-Variable in die Datei geschrieben.
Dann wird die Datei wieder geschlossen.
Ähnlich einfach ist das Auslesen von Dateien.
dataFile = SD.open("test.txt"); if (dataFile) { Serial.println("test.txt:"); // read from the file until there's nothing else in it: while (dataFile.available()) { Serial.write(dataFile.read()); } // close the file: data.close(); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); }
Auch hier muss zuerst wieder die Datei mit dem open()-Befehl geöffnet werden.
Wurde die Datei erfolgreich geöffnet, kann sie mit dem Befehl read() Zeile für Zeile ausgelesen werden, bis das Ende der Datei erreich wurde.
Dies wird mit dem Befehl available() überprüft. Abschließend wird die Datei mit dem close()-Befehl wieder geschlossen.