ArduinoIDE: ESP32UnoBoard mit SDCard
Quellen
Wikipedia(de) :
SD-Karte
Github Arduino SDCard-Library : SD
Rui Santos, randomnerdtutorials: esp32-microsd-card-arduino
Übersicht
SDCard-Modul: Ober- und Unterseite
SDCard-Modul besitzt Slotblech für Micro-SDHC-Karten:
• Speichergrösse der SDHC-Card zwischen 1GB .. 32GB
• SDHS-Card muss vor Benutzung im PC mit FAT/FAT32 formatiert werden
• Spannungsversorgung SDCard-Module: 3.3V (VCC, GND)
• MicroController SPI-Bus muss mit SPI-Interface der SDCard verdrahtet sein
• Signale SPI-Bus: SPI_NSS, SPI_CLK, SPI_MISO, SPI_MOSI
MicroController und korrekt über SPI angeschlossene SDCard ermöglichen:
• Unterscheidung zwischen Dateien und Verzeichnissen
• Verwaltung(anlegen, löschen) von Dateien und Verzeichnissen
• Schreiben von Binär- oder Ascii-Daten in eine Datei
• Lesen von Binär- oder Ascii-Daten aus einer Datei
• Unterscheidung zwischen Dateien und Verzeichnissen
• (bisher) kein Formatieren einer SDCard möglich
Hardware
Schaltung
Verdrahtung von ESP32UnoBoard mit SDCard-Modul über die SPI-V-Schnittstelle:
ESP32UnoBoard (und PC) mit SDCard-Modul
Vorbereitung
Bevor der ESP32 die SDCard verwenden kann, muss diese im PC formatiert werden:
PC-Formatierung der SDCard
Software
Der Benutzer editiert nun im ArduinoIDE-Editor den folgenden Quellcode:
//
//----------------------
// Include
//----------------------
#include <Arduino.h>
#include "FS.h"
#include "SD.h"
#include "SPI.h"
//
//----------------------
// Define
//----------------------
#define SerialPC Serial
//
//----------------------
// Helper
//----------------------
void ListDirectory(fs::FS &fs, const char * dirname, uint8_t levels)
{
SerialPC.printf("Listing directory: %s\n", dirname);
File R = fs.open(dirname);
if (!R)
{
SerialPC.println("Failed to open directory");
return;
}
if (!R.isDirectory())
{
SerialPC.println("Not a directory");
return;
}
File F = R.openNextFile();
while (F)
{
if (F.isDirectory())
{
SerialPC.print(" DIRECTORY : ");
SerialPC.println(F.name());
if(levels)
{
ListDirectory(fs, F.name(), levels -1);
}
}
else
{
SerialPC.print(" FILE: ");
SerialPC.print(F.name());
SerialPC.print(" SIZE: ");
SerialPC.println(F.size());
}
F = R.openNextFile();
}
}
//
void CreateDirectory(fs::FS &fs, const char * path)
{
SerialPC.printf("Creating Dir: %s\n", path);
if (fs.mkdir(path))
{
SerialPC.println("Directory created");
}
else
{
SerialPC.println("mkdir failed");
}
}
//
void RemoveDirectory(fs::FS &fs, const char * path)
{
SerialPC.printf("Removing Dir: %s\n", path);
if (fs.rmdir(path))
{
SerialPC.println("Dir removed");
}
else
{
SerialPC.println("rmdir failed");
}
}
//
void ReadFile(fs::FS &fs, const char * path)
{
SerialPC.printf("Reading file: %s\n", path);
File file = fs.open(path);
if (!file)
{
SerialPC.println("Failed to open file for reading");
return;
}
SerialPC.print("Read from file: ");
while (file.available())
{
SerialPC.write(file.read());
}
file.close();
}
//
void WriteFile(fs::FS &fs, const char * path, const char * message)
{
SerialPC.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if (!file)
{
SerialPC.println("Failed to open file for writing");
return;
}
if (file.print(message))
{
SerialPC.println("File written");
}
else
{
SerialPC.println("Write failed");
}
file.close();
}
//
void AppendFile(fs::FS &fs, const char * path, const char * message)
{
SerialPC.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file)
{
SerialPC.println("Failed to open file for appending");
return;
}
if(file.print(message))
{
SerialPC.println("Message appended");
}
else
{
SerialPC.println("Append failed");
}
file.close();
}
//
void RenameFile(fs::FS &fs, const char * path1, const char * path2)
{
SerialPC.printf("Renaming file %s to %s\n", path1, path2);
if (fs.rename(path1, path2))
{
SerialPC.println("File renamed");
}
else
{
SerialPC.println("Rename failed");
}
}
//
void RemoveFile(fs::FS &fs, const char * path)
{
SerialPC.printf("Deleting file: %s\n", path);
if(fs.remove(path))
{
SerialPC.println("File deleted");
}
else
{
SerialPC.println("Delete failed");
}
}
//
void TestFileIO(fs::FS &fs, const char * path)
{
File F = fs.open(path);
static uint8_t Buffer[512];
size_t L = 0;
uint32_t start = millis();
uint32_t end = start;
if (F)
{
L = F.size();
size_t FL = L;
start = millis();
while (L)
{
size_t NTR = L;
if(NTR > 512)
{
NTR = 512;
}
F.read(Buffer, NTR);
L -= NTR;
}
end = millis() - start;
SerialPC.printf("%u bytes read for %u ms\n", FL, end);
F.close();
}
else
{
SerialPC.println("Failed to open file for reading");
}
F = fs.open(path, FILE_WRITE);
if (!F)
{
SerialPC.println("Failed to open file for writing");
return;
}
start = millis();
for (size_t I = 0; I < 2048; I++)
{
F.write(Buffer, 512);
}
end = millis() - start;
SerialPC.printf("%u bytes written for %u ms\n", 2048 * 512, end);
F.close();
}
//
//----------------------
// Main - Setup
//----------------------
void setup()
{ // Initialize SerialPC
SerialPC.begin(115200);
delay(333);
SerialPC.println("\r\n\r\n*** VSEsp32SDCardInfo ***");
SerialPC.println("Version: 01V01");
SerialPC.println("Date : 220609");
SerialPC.println("Time : 1342");
SerialPC.println("Author : OMdevelop");
// Initialize SDCard
if(!SD.begin(5))
{
SerialPC.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if(CARD_NONE == cardType)
{
SerialPC.println("No SDCard attached");
return;
}
SerialPC.print("SD Card Type: ");
if(CARD_MMC == cardType)
{
SerialPC.println("MMC");
}
else
if (CARD_SD == cardType)
{
SerialPC.println("SDSC");
}
else
if (CARD_SDHC == cardType)
{
SerialPC.println("SDHC");
}
else
{
SerialPC.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
SerialPC.printf("SD Card Size: %lluMB\n", cardSize);
ListDirectory(SD, "/", 0);
CreateDirectory(SD, "/mydir");
ListDirectory(SD, "/", 0);
RemoveDirectory(SD, "/mydir");
ListDirectory(SD, "/", 2);
WriteFile(SD, "/hello.txt", "Hello ");
AppendFile(SD, "/hello.txt", "World!\n");
ReadFile(SD, "/hello.txt");
RemoveFile(SD, "/foo.txt");
RenameFile(SD, "/hello.txt", "/foo.txt");
ReadFile(SD, "/foo.txt");
TestFileIO(SD, "/test.txt");
SerialPC.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
SerialPC.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
//
//----------------------
// Main - Loop
//----------------------
void loop()
{
// nothing to do
}
Eine einfache Alternative zum Tippen bietet die Möglichkeit von
"Mark, Copy & Paste" des obigen Quelltextes in den Editor der ArduinoIDE
oder der Download: 2206091539_VSEsp32CardInfo_01V01.zip
WICHTIG! Nach dem Download muss das Projektverzeichnis auf jeden Fall
in "VSEsp32CardInfo" (statt "2206091539_VSEsp32CardInfo_01V01") umbenannt werden!
Nach dem erfolgreichen Compile & Upload startet automatisch die Programm-Abarbeitung
von "VSEsp32CardInfo" und im Terminal erscheint die Ausgabe:
"VSEsp32CardInfo" Terminal-Ausgabe (rechte Spalte)
WebSites
Module
Elektronik
SDCard