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.