Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie gemeinsam mit anderen Enthusiasten tiefer in die Welt von Raspberry Pi, Arduino und ESP32 ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Sonderangebote: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu erkunden und zu kreieren? Klicken Sie auf [here] und treten Sie heute bei!

2.10 SD-Karte Schreiben und Lesen

Dieses Projekt demonstriert die grundlegenden Fähigkeiten der Verwendung einer SD-Karte mit dem ESP32-Mikrocontroller. Es zeigt wesentliche Operationen wie das Einbinden der SD-Karte, das Erstellen einer Datei, das Schreiben von Daten in die Datei und das Auflisten aller Dateien im Stammverzeichnis. Diese Operationen bilden die Grundlage vieler Datenprotokollierungs- und Speicheranwendungen und machen dieses Projekt zu einem wichtigen Schritt im Verständnis und der Nutzung des integrierten SDMMC-Host-Peripheriegeräts des ESP32.

Benötigte Komponenten

In diesem Projekt benötigen wir die folgenden Komponenten.

KOMPONENTEN-BESCHREIBUNG

KAUFLINK

ESP32 WROOM 32E

BUY

ESP32 Kamera-Erweiterung

-

Betriebsschritte

  1. Bevor Sie das USB-Kabel anschließen, stecken Sie die SD-Karte in den SD-Kartensteckplatz der Erweiterungsplatine.

    ../_images/insert_sd1.png
  2. Verbinden Sie das ESP32-WROOM-32E mit dem Computer über das USB-Kabel.

    ../_images/plugin_esp321.png
  3. Laden Sie diesen Code herunter oder kopieren Sie ihn direkt in die Arduino IDE.Wählen Sie den entsprechenden Port und das Board in der Arduino IDE und laden Sie den Code auf Ihr ESP32 hoch.

  4. Nachdem der Code erfolgreich hochgeladen wurde, sehen Sie eine Meldung, die den erfolgreichen Dateischreibvorgang anzeigt, zusammen mit einer Liste aller Dateinamen und Größen auf der SD-Karte. Wenn Sie nach dem Öffnen des seriellen Monitors keine Ausgabe sehen, müssen Sie die EN (RST)-Taste drücken, um den Code erneut auszuführen.

    ../_images/sd_write_read.png

    Bemerkung

    Wenn Sie die folgende Information sehen.

    E (528) vfs_fat_sdmmc: mount_to_vfs failed (0xffffffff).
    Failed to mount SD card
    

    Überprüfen Sie zunächst, ob Ihre SD-Karte ordnungsgemäß in die Erweiterungsplatine eingesteckt ist.

    Wenn sie korrekt eingesteckt ist, könnte es ein Problem mit Ihrer SD-Karte geben. Sie können versuchen, die Metallkontakte mit einem Radiergummi zu reinigen.

    Wenn das Problem weiterhin besteht, wird empfohlen, die SD-Karte zu formatieren. Bitte beziehen Sie sich auf Wie formatiert man eine SD-Karte?.

Wie funktioniert das?

Der Zweck dieses Projekts ist es, die Verwendung der SD-Karte mit dem ESP32-Board zu demonstrieren. Das integrierte SDMMC-Host-Peripheriegerät des ESP32 wird verwendet, um eine Verbindung zur SD-Karte herzustellen.

Das Projekt beginnt mit der Initialisierung der seriellen Kommunikation und versucht dann, die SD-Karte einzubinden. Wenn das Einbinden der SD-Karte fehlschlägt, gibt das Programm eine Fehlermeldung aus und beendet die Setup-Funktion.

Sobald die SD-Karte erfolgreich eingebunden ist, erstellt das Programm eine Datei namens „test.txt“ im Stammverzeichnis der SD-Karte. Wenn die Datei im Schreibmodus erfolgreich geöffnet wird, schreibt das Programm eine Textzeile - „Hello, world!“ - in die Datei. Das Programm gibt eine Erfolgsmeldung aus, wenn der Schreibvorgang erfolgreich ist, andernfalls wird eine Fehlermeldung gedruckt.

Nach Abschluss des Schreibvorgangs wird die Datei geschlossen und das Stammverzeichnis der SD-Karte geöffnet. Anschließend beginnt das Programm, durch alle Dateien im Stammverzeichnis zu schleifen und den Dateinamen sowie die Dateigröße jeder gefundenen Datei im seriellen Monitor anzuzeigen.

In der Hauptschleifenfunktion gibt es keine Operationen. Dieses Projekt konzentriert sich auf SD-Karten-Operationen wie das Einbinden der Karte, das Erstellen einer Datei, das Schreiben in eine Datei und das Lesen des Datei-Verzeichnisses, die alle in der Setup-Funktion ausgeführt werden.

Dieses Projekt dient als nützliche Einführung in den Umgang mit SD-Karten beim ESP32, was bei Anwendungen, die Datenprotokollierung oder -speicherung erfordern, von entscheidender Bedeutung sein kann.

Hier ist eine Analyse des Codes:

  1. Einbinden der SD_MMC-Bibliothek, die benötigt wird, um mit SD-Karten über das integrierte SDMMC-Host-Peripheriegerät des ESP32 zu arbeiten.

    #include "SD_MMC.h"
    
  2. Innerhalb der setup()-Funktion werden die folgenden Aufgaben ausgeführt.

    • Initialisieren der SD-Karte

    Initialisieren und Einbinden der SD-Karte. Wenn das Einbinden der SD-Karte fehlschlägt, wird „Failed to mount SD card“ im seriellen Monitor gedruckt und die Ausführung gestoppt.

    if(!SD_MMC.begin()) { // Versuch, die SD-Karte einzubinden
        Serial.println("Failed to mount card"); // Wenn das Einbinden fehlschlägt, im seriellen Monitor drucken und Setup beenden
        return;
    }
    
    • Öffnen der Datei

    Öffnen einer Datei namens "test.txt", die sich im Stammverzeichnis der SD-Karte befindet, im Schreibmodus. Wenn das Öffnen der Datei fehlschlägt, wird „Failed to open file for writing“ gedruckt und zurückgegeben.

    File file = SD_MMC.open("/test.txt", FILE_WRITE);
    if (!file) {
        Serial.println("Failed to open file for writing"); // Print error message if file failed to open
        return;
    }
    
    • Daten in die Datei schreiben

    Schreiben des Textes „Test file write“ in die Datei. Wenn die Schreiboperation erfolgreich ist, wird „File write successful“ gedruckt; andernfalls wird „File write failed“ gedruckt.

    if(file.print("Test file write")) { // Die Nachricht in die Datei schreiben
        Serial.println("File write success"); // Wenn das Schreiben erfolgreich ist, im seriellen Monitor drucken
    } else {
        Serial.println("File write failed"); // Wenn das Schreiben fehlschlägt, im seriellen Monitor drucken
    }
    
    • Schließen der Datei

    Schließen der geöffneten Datei. Dies stellt sicher, dass alle gepufferten Daten in die Datei geschrieben und die Datei ordnungsgemäß geschlossen wird.

    file.close(); // Die Datei schließen
    
    • Öffnen des Stammverzeichnisses

    Öffnen des Stammverzeichnisses der SD-Karte. Wenn das Öffnen des Verzeichnisses fehlschlägt, wird „Failed to open directory“ gedruckt und zurückgegeben.

    File root = SD_MMC.open("/"); // Öffnen des Stammverzeichnisses der SD-Karte
    if (!root) {
        Serial.println("Failed to open directory"); // Fehlernachricht drucken, wenn das Öffnen des Verzeichnisses fehlschlägt
        return;
    }
    
    • Drucken der Namen und Größen der Dateien

    Die Schleife, beginnend mit while (File file = root.openNextFile()), iteriert über alle Dateien im Stammverzeichnis und druckt den Dateinamen und die Dateigröße jeder gefundenen Datei im seriellen Monitor.

    Serial.println("Files found in root directory:"); // Die Liste der im Stammverzeichnis gefundenen Dateien drucken
    while (File file = root.openNextFile()) { // Durch alle Dateien im Stammverzeichnis iterieren
          Serial.print("  ");
          Serial.print(file.name()); // Den Dateinamen drucken
          Serial.print("\t");
          Serial.println(file.size()); // Die Dateigröße drucken
          file.close(); // Die Datei schließen
    }
    
  3. Diese loop()-Funktion ist eine leere Schleife und führt im aktuellen Programm keine Operationen aus. In einem typischen Arduino-Programm würde diese Funktion kontinuierlich ausgeführt werden und den darin enthaltenen Code ausführen. In diesem Fall, da alle erforderlichen Aufgaben in der setup()-Funktion ausgeführt wurden, wird die loop()-Funktion nicht benötigt.

    void loop() {} // Leere loop-Funktion, tut nichts