
Das SD-Kartenmodul wird mit einer Micro-SD-Karte bestückt. Es können Verzeichnisse und Dateien erstellt und gelöscht werden. In eine Datei können fortlaufend Daten geschrieben werden, die Daten können zeilenweise auch wieder gelesen werden.
Anschluss am Arduino UNO

⇒SPI
Benötigte Bibliothek:
Sketch ⇒ Bibliothek einbinden ⇒ Bibliotheken verwalten


Achte auf die Pin-Belegung des SD-Karten-Moduls!
Die SD-Karte muss mit FAT32 formatiert sein!
| Schlüsselwort | Parameter | Aktion |
|---|---|---|
| begin(Datenpin) | Modul starten | |
| exists(Dateiname) | Vorhandensein einer Datei prüfenexits("Lottozahlen.txt"); | |
| remove(Dateiname) | Datei entfernenremove("Lottozahlen.txt"); | |
| close() | Datei schließenDatei.close(); | |
| open(Dateiname, Parameter) print() println() | O_CREAT -> Datei erstellen, wenn sie nicht existiert O_WRITE -> in die Date schreiben O_AT_END -> Startposition zum Schreiben an das Ende der Datei setzen | Daten in Datei schreibenopen("Lottozahlen.txt", O_CREAT | O_WRITE | O_AT_END); |
| open(Dateiname) available() read() readStringUntil(Zeichen) | O_RDONLY nur lesen | Datei öffnen und Daten lesenDatei = SD.open("Lottozahlen.txt", O_RDONLY); |
| mkdir(Verzeichnisname) | Verzeichnis erstellenmkdir("Zahlen"); | |
| rmdir(Verzeichnisname) | Verzeichnis löschenrmdir("Zahlen"); | |
| ls(Parameter) | LS_R Inhalt rekursiv anzeigen LS_SIZE Dateien mit Größe anzeigen LS_DATE Datei mit Datum anzeigen Die Parameter können auch kombiniert werden: ls(LS_DATE | LS_SIZE | LS_R); | Inhalt der SD-Karte anzeigen |
| openNext(Dateiname, Größe) | isDir() -> auf Vorhandensein eines Verzeichnisses prüfen getName() -> Dateiname und -größe ermitteln fileSize() -> Größe der Datei in Bytes | File Verzeichnis; |

Jeder Funktion muss der Name des SD-Karten-Moduls mit abschließenden . vorangestellt werden!

Beispiel:
Datei mit Zufallszahlen schreiben, lesen und Datei löschen.


#include "SdFat.h"
// Name des SD-Karten-Moduls
SdFat SD;
// Name der Datei, die geschrieben werden soll
File ZahlenZeigen;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
// Zufallsgenerator starten
randomSeed(analogRead(A0));
/*
SD-Karte mit Angabe des Datenpins starten
wenn die Intialisierung fehlschlägt
- keine SD-Karte vorhanden
- falsche Pinbelegung
-> es wird eine Fehlermeldung angezeigt
*/
if (!SD. begin(DatenPin))
{
Serial.println("Initialisierung fehlgeschlagen!");
}
else Serial.println("Initialisierung abgeschlossen");
// Menü
Serial.println("-----------------------------");
Serial.println("Datei schreiben mit 's', Dateien entfernen mit 'l'");
}
void loop()
{
while (Serial.available() > 0)
{
// solange lesen, bis return \n = return eingegeben wurde
char Eingabe = Serial.read();
// Datei löschen
if (Eingabe == 'l')
{
// wenn die Datei Zahlen.txt existiert -> Datei löschenn (remove)
if (SD.exists("Zahlen.txt"))
{
SD.remove("Zahlen.txt");
Serial.println("Datei Zahlen.txt entfernt!");
}
else
{
Serial.println("Datei Zahlen.txt existiert nicht!");
}
// Menü
Serial.println("-----------------------------");
Serial.println("Start mit 's', Dateien entfernen mit 'l'");
}
// Daten in Datei schreiben
if (Eingabe == 's')
{
/*
O_CREAT -> Datei erstellen, wenn sie nicht existiert
O_WRITE -> in die Date schreiben
O_AT_END -> Startposition zum Schreiben an das Ende der Datei setzen
*/
ZahlenZeigen = SD.open("Zahlen.txt", O_CREAT | O_WRITE | O_AT_END);
// wenn die Datei vorhanden ist
if (ZahlenZeigen)
{
Serial.println("Schreibe Zahlen in Zahlen.txt ...");
Serial.println("-----------------------------");
// Zufallszahlen in die Datei schreiben
for (int i = 0; i < 7; i++)
{
ZahlenZeigen.println(random(1, 100));
}
// Datei schließen
ZahlenZeigen.close();
Serial.println("Abgeschlossen.");
Serial.println("-----------------------------");
}
else
{
Serial.println("Datei Zahlen.txt konnte nicht gelesen werden");
}
// Datei öffnen
ZahlenZeigen = SD.open("Zahlen.txt");
if (ZahlenZeigen)
{
Serial.println("Lese Datei Zahlen.txt ...");
Serial.println("-----------------------------");
// solange sich Zeilen in der Datei befinden ...
while (ZahlenZeigen.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(ZahlenZeigen.read());
}
// Datei schließen
ZahlenZeigen.close();
Serial.println("-----------------------------");
Serial.println("Abgeschlossen.");
Serial.println("-----------------------------");
}
else
{
Serial.println("Zahlen.txt konnte nicht gelesen werden");
}
}
}
}
Beispiel:
Ordner und Dateien erstellen und löschen, Daten in eine Datei schreiben und sie wieder auslesen.
So sieht es aus:


#include "SdFat.h"
// Eingabe fragt die Buchstaben ab
char Eingabe;
// Strings für die Dateioperationen
String Ordner;
String DateinameAbfragen;
String DatenSchreiben;
/*
Anschlussbelegung:
CS -> Pin 4
SCK -> Pin 13
SDI -> Pin 12
SDO -> Pin 11
VCC -> 5V
GND -> GND
*/
// Name der SD-Karte
SdFat SD;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
/*
SD-Karte mit Angabe des Datenpins starten
wenn die Intialisierung fehlschlägt
- keine SD-Karte vorhanden
- falsche Pinbelegung
-> es wird eine Fehlermeldung angezeigt
*/
if (!SD.begin(DatenPin))
{
Serial.println(F("Initialisierung fehlgeschlagen!"));
}
else Serial.println(F("Initialisierung abgeschlossen"));
// Menü
Serial.println(F("-------------------------------------------------"));
Serial.println(F("Verzeichnis lesen 'v', Verzeichnis erstellen 'n'"));
Serial.println(F("Verzeichnis entfernen 'l', Datei erstellen 'e'"));
Serial.println(F("Datei entfernen 'd', Befehle anzeigen 'b'"));
Serial.println(F("Datei lesen 'a'"));
Serial.println(F("-------------------------------------------------"));
}
void loop()
{
File Datei;
File Verzeichnis;
char Dateiname[20];
while (Serial.available() > 0)
{
// einzelnes Zeichen lesen
Eingabe = Serial.read();
// Inhalt der SD-Karte lesen
if (Eingabe == 'v')
{
Serial.println(SD.ls(LS_DATE | LS_SIZE | LS_R));
}
// Menü anzeigen
if (Eingabe == 'b')
{
Serial.println(F("-------------------------------------------------"));
Serial.println(F("Verzeichnis lesen 'v', Verzeichnis erstellen 'n'"));
Serial.println(F("Verzeichnis entfernen 'l', Datei erstellen 'e'"));
Serial.println(F("Datei entfernen 'd', Befehle anzeigen 'b'"));
Serial.println(F("Datei lesen 'a'"));
Serial.println(F("-------------------------------------------------"));
}
// neuen Ordner anlegen
if (Eingabe == 'n')
{
Serial.print("Name des Ordners: ");
// solange der String Ordner leer ist
// -> solange lesen, bis return \n eingegeben wurde
while (Ordner == "") Ordner = Serial.readStringUntil('\n');
// wenn der Ordner nicht existiert -> Ordner erstellen
if (SD.mkdir (Ordner))
{
Serial.println("Ordner " + Ordner + " existiert bereits!");
}
else Serial.println("Ordner " + Ordner + " erstellt!");
// Variable leeren
Ordner = "";
}
// Ordner löschen
if (Eingabe == 'l')
{
Serial.print("Name des Ordners: ");
// solange der String Ordner leer ist
// -> solange lesen, bis return \n eingegeben wurde
while (Ordner == "") Ordner = Serial.readStringUntil('\n');
// wenn der Ordner nicht existiert -> Fehlermeldung ausgeben
if (!SD.rmdir(Ordner))
{
Serial.println("Ordner " + Ordner + " existiert nicht!");
}
else Serial.println("Ordner " + Ordner + " entfernt!");
// Variable leeren
Ordner = "";
}
// Datei löschen
if (Eingabe == 'd')
{
String DateinameAbfragen;
Serial.print("Name der Datei: ");
// solange der String Dateiname leer ist
// -> solange lesen, bis return \n eingegeben wurde
while (DateinameAbfragen == "") DateinameAbfragen = Serial.readStringUntil('\n');
// wenn der Dateiname nicht existiert -> Fehlermeldung ausgeben
if (!SD.remove(DateinameAbfragen))
{
Serial.println("Datei " + DateinameAbfragen + " existiert nicht!");
}
else Serial.println("Datei " + DateinameAbfragen + " entfernt!");
// Variable leeren
DateinameAbfragen = "";
}
// Datei erzeugen und Daten eingeben
if (Eingabe == 'e')
{
Serial.print("Name der Datei: ");
// solange der String DateinameAbfragen leer ist
// -> solange lesen, bis return \n eingegeben wurde
while (DateinameAbfragen == "") DateinameAbfragen = Serial.readStringUntil('\n');
// open erwartet ein char-Array -> Array Dateiname erstellen
// char Dateiname[DateinameAbfragen.length()];
DateinameAbfragen.toCharArray(Dateiname, DateinameAbfragen.length() + 1);
Serial.println(Dateiname);
/*
O_CREAT -> Datei erstellen, wenn sie nicht existiert
O_WRITE -> in die Datei schreiben
O_AT_END -> Startposition zum Schreiben an das Ende der Datei setzen
*/
Datei.open(Dateiname, O_CREAT | O_WRITE | O_AT_END);
// Daten in Datei schreiben
Serial.println("Daten eingeben und Eingabe mit # beenden:");
while (DatenSchreiben != "#")
{
while (Serial.available() > 0)
{
DatenSchreiben = Serial.readStringUntil('\n');
Serial.println(DatenSchreiben);
// Datensatz in Datei schreiben
if (DatenSchreiben != "#") Datei.println(DatenSchreiben);
}
}
// Datei schließen
Datei.close();
Serial.println("\nDatei " + DateinameAbfragen + " erfolgreich geschrieben!");
DatenSchreiben = "";
DateinameAbfragen = "";
}
// Datei öffnen und Daten anzeigen
if (Eingabe == 'a')
{
Serial.print("Name der Datei: ");
// solange der String DateinameAbfragen leer ist
// -> solange lesen, bis return \n eingegeben wurde
while (DateinameAbfragen == "") DateinameAbfragen = Serial.readStringUntil('\n');
// open erwartet ein char-Array -> Array Dateiname erstellen
DateinameAbfragen.toCharArray(Dateiname, DateinameAbfragen.length() + 1);
Serial.println(Dateiname);
// Datei öffnen, O_RDONLY nur Lesen
if (Datei.open(Dateiname, O_RDONLY))
{
while (Datei.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Datei.read());
}
}
else Serial.println("Datei " + DateinameAbfragen + " nicht gefunden!");
// Datei schließen
Datei.close();
DateinameAbfragen = "";
}
}
}Letzte Aktualisierung: