ESP32 , przykład użycia karty SD aruino
SPI.h + SD.h (interfejs SPI) lub SD_MMC.h (interfejs 4-bit SD-MMC). SD.begin(CS_PIN). /test.txt, zapisuje linię tekstu i wyświetla jego zawartość w terminalu.1.1 Interfejsy
• SPI (1-bit, uniwersalny):
ESP32 ↔ SD-module
GPIO23 MOSI ↔ DI
GPIO19 MISO ↔ DO
GPIO18 SCK ↔ SCK
GPIO5 CS ↔ CS
3.3 V ↔ VCC, GND ↔ GND
• SD-MMC (4-bit, szybszy): użyj biblioteki SD_MMC.h i pinów GPIO 2/4/12/13/14/15 (dokładnie jak w tabeli w dokumentacji Espressif).
1.2 Zasilanie
– ESP32 nie toleruje 5 V na liniach I/O. Jeśli moduł SD ma konwerter poziomów i stabilizator, zasil go 5 V; w przeciwnym razie wszystko podłącz do 3 V3.
– Szczytowy pobór prądu przy zapisie przekracza 100 mA; zadbaj o krótkie przewody i kondensator 100 nF + ≥10 µF przy gnieździe SD.
1.3 Format karty
– FAT16/FAT32 (oficjalny „SD Card Formatter”).
– exFAT jest w fazie testów w core 2.0.11-dev, jeszcze niezalecane do produkcji.
#include <SPI.h>
#include <SD.h>
constexpr uint8_t PIN_CS = 5; // CS (dowolny wolny GPIO)
SPIClass spi = SPIClass(VSPI); // VSPI → SCK18 MISO19 MOSI23
void setup() {
Serial.begin(115200);
spi.begin(18, 19, 23, PIN_CS); // (SCK, MISO, MOSI, CS)
if (!SD.begin(PIN_CS, spi, 40000000)) { // 40 MHz, można obniżyć
Serial.println("SD init failed");
for (;;);
}
Serial.println("SD OK");
File f = SD.open("/test.txt", FILE_WRITE);
if (f) { f.println("Witaj z ESP32!"); f.close(); }
f = SD.open("/test.txt");
if (f) { while (f.available()) Serial.write(f.read()); f.close(); }
}
void loop() {}
Wywołanie z trzecią składową spi pozwala na przeniesienie magistrali na niestandardowe piny.
#include <SD_MMC.h>
void setup() {
Serial.begin(115200);
if (!SD_MMC.begin("/sdcard", true, false, SDMMC_FREQ_DEFAULT)) {
Serial.println("SD_MMC init failed");
for (;;);
}
File f = SD_MMC.open("/fast.txt", FILE_WRITE);
if (f) { f.println("Transfer 4-bit ~18 MB/s"); f.close(); }
}
void loop() {}
Interfejs SD-MMC osiąga 15-20 MB/s (SPI typowo 1-2 MB/s).
| Objaw | Typowe przyczyny | Rozwiązanie |
|---|---|---|
| „SD init failed” | błędny CS, zły poziom logiki, karta >32 GB sformatowana exFAT | sprawdź okablowanie, użyj FAT32 |
| Losowe zawieszanie przy zapisie | zbyt długie przewody, brak kondensatorów | skrócić kable, dodać C=100 nF+10 µF |
| Zniekształcone dane | taktowanie SPI za wysokie | obniżyć SD.begin(CS, spi, 20000000) |
– Biblioteka SdFat (integralnie w core 2.x) zapewnia buforowanie i większe szybkości (funkcja SD.sdfs).
– Dla logowania czasu użyj rtc.begin() i znaczników UNIX → strftime().
– Duże pliki binarne (np. zdjęcia ESP32-CAM) zapisuj f.write(buf, len) zamiast println().
File file = SD.open("/x", "r", true);)config_fatfs.h pozwala włączyć długie nazwy LFN. File dziedziczy z Stream; można użyć file.readBytes(buf, n) – analogicznie do UART. platformio.ini zwiększ build_flags = -DCORE_DEBUG_LEVEL=5, by zobaczyć diagnostykę SD.mbedTLS + AES) przed zapisem. Update.begin(file.size()). wifi.low_power = true. feature/exfat). LittleFS na wbudowanym flash + SD jako kopia bezpieczeństwa.Integracja karty SD z ESP32 w Arduino sprowadza się do: poprawnego zasilania 3 V3, spięcia magistrali SPI (lub SD-MMC), wywołania SD.begin() i operacji na plikach jak w PC-towym C. Zaktualizowane core 2.x oferuje większą szybkość, SdFat oraz (beta) exFAT. Pamiętaj o kondycji zasilania, krótkich przewodach i formatowaniu FAT32 – a nawet rozbudowane projekty (rejestratory danych, serwery plików, ESP32-CAM) będą działać pewnie i wydajnie.