Inhalt
SD-Karten-Modul
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.
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; |
Verzeichnis lesen mit ls
#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 4;
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 = 4;
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
#include "SdFat.h"
SdFat SD;
// Datenpin der SD-Karte
int DatenPin = 4;
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 = 4;
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
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 " + 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: