Bei­spiel­pro­gramm SD-Karten-Modul

Lese­zeit: 5 Minu­ten

SD-Kar­ten-Modul

Das SD-Kar­ten­mo­dul wird mit einer Micro-SD-Kar­te bestückt. Es kön­nen Ver­zeich­nis­se und Datei­en erstellt und gelöscht wer­den. In eine Datei kön­nen fort­lau­fend Daten geschrie­ben wer­den, die Daten kön­nen zei­len­wei­se auch wie­der gele­sen werden. 

Das Modul wird über den ➨SPI-Bus angeschlossen.

Statt des SD-Kar­ten-Moduls kannst du auch ein ➨Ether­net-Shield oder ein ➨Daten­log­ger-Shield ver­wen­den. Beim ➨Daten­log­ger-Shield musst du als Daten­pin für die SD-Kar­te den Pin 10 angeben.

Benö­tig­te Bibliothek:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Ach­te auf die Pin-Bele­gung des SD-Kar­ten-Moduls!
Die SD-Kar­te muss mit FAT32 for­ma­tiert sein!

Funk­tio­nen der Biblio­thek SdFat

Schlüs­sel­wortPara­me­terAkti­on
begin(Datenpin)Modul star­ten

int DatenPin = 4;
begin(DatenPin);
exists(Dateiname)Vor­han­den­sein einer Datei prüfen

exits("Lottozahlen.txt");
remove(Dateiname)Datei ent­fer­nen

remove("Lottozahlen.txt");
clo­se()Datei schlie­ßen

Datei.close();
open(Dateiname, Para­me­ter)
print()
println()
O_CREAT -> Datei erstel­len, wenn sie nicht existiert
O_WRITE -> in die Date schreiben
O_AT_END -> Start­po­si­ti­on zum Schrei­ben an das Ende der Datei setzen
Daten in Datei schreiben

open("Lottozahlen.txt", O_CREAT | O_WRITE | O_AT_END);

println("1 15 8 21 37 16 34");
open(Dateiname)
available()
read()
O_RDONLY nur lesenDatei öff­nen und Daten lesen

Datei = SD.open("Lottozahlen.txt", O_RDONLY);
// solange sich Zeilen in der Datei befinden ...
while (Datei.available())
{
  // ... werden sie gelesen und im Seriellen Monitor ausgegeben
  Serial.write(Datei.read());
}
mkdir(Verzeichnisname)Ver­zeich­nis erstellen

mkdir("Zahlen");
rmdir(Verzeichnisname)Ver­zeich­nis löschen

rmdir("Zahlen");
ls(Parameter)LS_R Inhalt rekur­siv anzeigen
LS_SIZE Datei­en mit Grö­ße anzeigen
LS_DATE Datei mit Datum anzeigen
Die Para­me­ter kön­nen auch kom­bi­niert werden:
ls(LS_DATE | LS_SIZE | LS_R);
Inhalt der SD-Kar­te anzeigen

openNext(Dateiname, Grö­ße)isDir() -> auf Vor­han­den­sein eines Ver­zeich­nis­ses prüfen
get­Na­me() -> Datei­na­me und -grö­ße ermitteln
file­Si­ze() -> Grö­ße der Datei in Bytes
File Verzeichnis;
File Datei;
char Dateiname[20];

Verzeichnis.open("/");

while (Datei.openNext(&Verzeichnis, O_READ))
{
  Datei.getName(Dateiname, sizeof(Dateiname));
  Serial.print(Dateiname);

  if (Datei.isDir())
  {
    Serial.println("/");
  }
  else
  {
    Serial.print('\t');
    Serial.print(Datei.fileSize());
    Serial.println(" Bytes");
  }
  Datei.close();
}

Ver­zeich­nis 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
}

Ver­zeich­nis 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 schrei­ben 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: 24. Nov 2023 @ 13:37