
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.


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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #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:


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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | #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: