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.
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() 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; |
Arduino UNO
Verzeichnis lesen mit ls


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #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() { // eleibt leer, das Programm läuft nur einmal } |
Verzeichnis lesen mit OpenNext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #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 if (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(); } } else Serial.println(“Keine Dateien gefunden!”); } 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.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #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() { // bleibt leer, das Programm läuft nur einmal } |
Daten in Datei schreiben und lesen


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #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 if (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(); } } else Serial.println(“Keine Dateien gefunden!”); } void loop() { // bleibt leer, das Programm läuft nur einmal } |
Datei lesen mit read
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #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 } |
Datei lesen mit readStringUntil
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include “SdFat.h” SdFat SD; // 3 = FAT32 #define SD_FAT_TYPE 3 // SPI-Geschwindigkeit #define SPI_SPEED SD_SCK_MHZ(4) // CSPin der SD-Karte int CSPin = 5; // maximale Anzahl Zeilen #define ZeilenMax 50 String Zeile[ZeilenMax]; int AnzahlZeilen = 0; 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(“Start der SD-Karte fehlgeschlagen!”); Serial.println(“Programm angehalten …”); // Programm anhalten while(1);; } // 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()) { // Zeile bis zum return (lesen Zeile[AnzahlZeilen] = Datei.readStringUntil(‘\n’); AnzahlZeilen++; } } // 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(); for (int i = 0; i <= AnzahlZeilen; i++) { Serial.println(Zeile[i]); } } void loop() { // bleibt leer, das Programm läuft nur einmal } |
Daten in Datei schreiben und lesen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #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: