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.
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() | 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!
Das Beispielprogramm liest, schreibt oder löscht eine Datei mit Zufallszahlen.
# 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");
}
}
}
}
Das Beispielprogramm zeigt die Funktionen Ordner und Dateien erstellen und löschen, schreibt Daten in eine Datei und liest sie wieder aus.
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 Date 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: