Inhalt
SD-Karten-Modul

Das Modul wird über den ⇒SPI-Bus angeschlossen.
Statt des SD-Karten-Moduls kannst du auch ein ⇒Ethernet-Shield oder ein Datenlogger-Shield verwenden.
Beim ⇒Datenlogger-Shield musst du als Datenpin für die SD-Karte den Pin 10 angeben.
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!
Funktionen der Bibliothek SdFat
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() | 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; |
Arduino UNO
Verzeichnis lesen mit ls


#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 10;
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(500);
/*
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");
Serial.println(SD.ls(LS_DATE | LS_SIZE | LS_R));
}
void loop()
{
// beleibt leer, das Programm läuft nur einmal
}
Verzeichnis lesen mit OpenNext
#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 10;
void setup()
{
// Bezeichner für Verzeichnis und Dateien
File Verzeichnis;
File Datei;
char Dateiname[20];
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(500);
/*
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");
// Wurzelverzeichnis öffnen
// wenn keine Dateien gefunden wurden -> Fehlermeldung anzeigen
Verzeichnis.open("/");
/*
SD-Karte mit openNext lesen
getName Parameter:
Dateiname und Größe in Bytes
*/
while (Datei.openNext(&Verzeichnis, O_READ))
{
Datei.getName(Dateiname, sizeof(Dateiname));
Serial.print(Dateiname);
// wenn es sich um ein Verzeichnis handelt
if (Datei.isDir())
{
Serial.println("/");
}
// es handelt sich um eine Datei
else
{
Serial.print('\t');
Serial.print(Datei.fileSize());
Serial.println(" Bytes");
}
Datei.close();
}
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
Datei lesen
Lege auf der SD-Karte eine Datei Zahlen.txt an und fülle sie mit einigen Zahlen.

#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 10;
void setup()
{
// Bezeichner für die Datei
File Datei;
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(500);
/*
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");
// Datei öffnen, O_RDONLY nur Lesen
// char-Array für den Dateinamen erstellen
char Dateiname[20] = "Zahlen.txt";
Serial.println("Datei " + String(Dateiname) + " lesen:");
Serial.println("---------------------");
// Datei zum Lesen öffnen
if (Datei.open(Dateiname, O_RDONLY))
{
// solange sich Daten in der Datei befinden ...
while (Datei.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Datei.read());
}
}
// wenn die Datei Zahlen.txt nicht existiert ...
else
{
// char-Array Dateiname muss in String umgewandelt werden
Serial.print("Datei " + String(Dateiname) + " nicht gefunden!");
}
// Datei schließen
Datei.close();
}
void loop()
{
// beleibt leer, das Programm läuft nur einmal
}
Daten in Datei schreiben und lesen


#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 10;
bool Schreiben = false;
void setup()
{
// Bezeichner für die Datei
File Datei;
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial) { ; };
delay(500);
/*
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");
// char-Array für den Dateinamen erstellen
char Dateiname[20] = "Zahlen.txt";
String DatenSchreiben;
/*
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:");
// solange kein # eingegeben wurde und Schreiben false ist
while (DatenSchreiben != "#" && !Schreiben)
{
while (Serial.available() > 0)
{
DatenSchreiben = Serial.readStringUntil('\n');
Serial.println(DatenSchreiben);
// wenn das erste eingegebene Zeichen # ist
// -> Schreiben auf true setzen -> while verlassen
if (DatenSchreiben.startsWith("#")) Schreiben = true;
// ansonsten Datensatz in Datei schreiben
else Datei.println(DatenSchreiben);
}
}
// Datei schließen
Datei.close();
Serial.println("\nDatei " + String(Dateiname) + " erfolgreich geschrieben!");
// Datei Zahlen.txt öffnen
Serial.println("Zeige " + String(Dateiname));
if (Datei.open(Dateiname, O_RDONLY))
{
while (Datei.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Datei.read());
}
}
// wenn die Datei Zahlen.txt nicht existiert ...
else
{
// char-Array Dateiname muss in String umgewandelt werden
Serial.print("Datei " + String(Dateiname) + " nicht gefunden!");
}
// Datei schließen
Datei.close();
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
ESP32

Verzeichnis lesen mit ls
#include "SdFat.h"
SdFs SD;
// 3 = FAT32
#define SD_FAT_TYPE 3
// SPI-Geschwindigkeit
#define SPI_SPEED SD_SCK_MHZ(4)
/*
Pinbelegung:
CIPO -> 19
COPI -> 23
SCK -> 18
CS -> 5
*/
// CSPin der SD-Karte
int CSPin = 5;
void setup()
{
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(1000);
/*
SD-Karte mit Angabe des CSPins starten
wenn die Intialisierung fehlschlägt
- keine SD-Karte vorhanden
- falsche Pinbelegung
-> es wird eine Fehlermeldung angezeigt
*/
if (!SD.begin(CSPin, SPI_SPEED))
{
Serial.println("Initialisierung fehlgeschlagen!");
}
else Serial.println("Initialisierung abgeschlossen");
// Dateien im Verzeichnis anzeigen
Serial.println(SD.ls(LS_DATE | LS_SIZE | LS_R));
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
Verzeichnis lesen mit OpenNext
#include "SdFat.h"
SdFs SD;
// 3 = FAT32
#define SD_FAT_TYPE 3
// SPI-Geschwindigkeit
#define SPI_SPEED SD_SCK_MHZ(4)
/*
Pinbelegung:
CIPO -> 19
COPI -> 23
SCK -> 18
CS -> 5
*/
// CSPin der SD-Karte
int CSPin = 5;
void setup()
{
// Bezeichner für Verzeichnis und Dateien
File Verzeichnis;
File Datei;
char Dateiname[20];
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(500);
/*
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(CSPin, SPI_SPEED))
{
Serial.println("Initialisierung fehlgeschlagen!");
}
else Serial.println("Initialisierung abgeschlossen");
// Wurzelverzeichnis öffnen
// wenn keine Dateien gefunden wurden -> Fehlermeldung anzeigen
Verzeichnis.open("/");
/*
SD-Karte mit openNext lesen
getName Parameter:
Dateiname und Größe in Bytes
*/
while (Datei.openNext(&Verzeichnis, O_READ))
{
Datei.getName(Dateiname, sizeof(Dateiname));
Serial.print(Dateiname);
// wenn es sich um ein Verzeichnis handelt
if (Datei.isDir())
{
Serial.println("/");
}
// es handelt sich um eine Datei
else
{
Serial.print('\t');
Serial.print(Datei.fileSize());
Serial.println(" Bytes");
}
Datei.close();
}
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
Datei lesen
#include "SdFat.h"
SdFs SD;
// 3 = FAT32
#define SD_FAT_TYPE 3
// SPI-Geschwindigkeit
#define SPI_SPEED SD_SCK_MHZ(4)
/*
Pinbelegung:
CIPO -> 19
COPI -> 23
SCK -> 18
CS -> 5
*/
// CSPin der SD-Karte
int CSPin = 5;
void setup()
{
// Bezeichner für die Datei
File Datei;
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial);
delay(500);
/*
SD-Karte mit Angabe des CSPins starten
wenn die Intialisierung fehlschlägt
- keine SD-Karte vorhanden
- falsche Pinbelegung
-> es wird eine Fehlermeldung angezeigt
*/
if (!SD.begin(CSPin, SPI_SPEED))
{
Serial.println("Initialisierung fehlgeschlagen!");
}
else Serial.println("Initialisierung abgeschlossen");
// Datei öffnen, O_RDONLY nur Lesen
// char-Array für den Dateinamen erstellen
char Dateiname[20] = "Zahlen.txt";
Serial.println("Datei " + String(Dateiname) + " lesen:");
Serial.println("---------------------");
// Datei zum Lesen öffnen
if (Datei.open(Dateiname, O_RDONLY))
{
// solange sich Daten in der Datei befinden ...
while (Datei.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Datei.read());
}
}
// wenn die Datei Zahlen.txt nicht existiert ...
else
{
// char-Array Dateiname muss in String umgewandelt werden
Serial.print("Datei " + String(Dateiname) + " nicht gefunden!");
}
// Datei schließen
Datei.close();
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
Daten in Datei schreiben und lesen
#include "SdFat.h"
SdFs SD;
// 3 = FAT32
#define SD_FAT_TYPE 3
// SPI-Geschwindigkeit
#define SPI_SPEED SD_SCK_MHZ(4)
/*
Pinbelegung:
CIPO -> 19
COPI -> 23
SCK -> 18
CS -> 5
*/
// CSPin der SD-Karte
int CSPin = 5;
bool Schreiben = false;
void setup()
{
// Bezeichner für die Datei
File Datei;
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(CSPin, SPI_SPEED))
{
Serial.println("Initialisierung fehlgeschlagen!");
}
else Serial.println("Initialisierung abgeschlossen");
// char-Array für den Dateinamen erstellen
char Dateiname[20] = "Zahlen.txt";
String DatenSchreiben;
/*
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:");
// solange kein # eingegeben wurde und Schreiben false ist
while (DatenSchreiben != "#" && !Schreiben)
{
while (Serial.available() > 0)
{
DatenSchreiben = Serial.readStringUntil('\n');
Serial.println(DatenSchreiben);
// wenn das erste eingegebene Zeichen # ist
// -> Schreiben auf true setzen -> while verlassen
if (DatenSchreiben.startsWith("#")) Schreiben = true;
// ansonsten Datensatz in Datei schreiben
else Datei.println(DatenSchreiben);
}
}
// Datei schließen
Datei.close();
Serial.println("\nDatei " + String(Dateiname) + " erfolgreich geschrieben!");
// Datei Zahlen.txt öffnen
Serial.println("Zeige " + String(Dateiname));
if (Datei.open(Dateiname, O_RDONLY))
{
while (Datei.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Datei.read());
}
}
// wenn die Datei Zahlen.txt nicht existiert ...
else
{
// char-Array Dateiname muss in String umgewandelt werden
Serial.print("Datei " + String(Dateiname) + " nicht gefunden!");
}
// Datei schließen
Datei.close();
}
void loop()
{
// bleibt leer, das Programm läuft nur einmal
}
Letzte Aktualisierung: