ESP32 karta SD przykładowy kod
SD.h
(SPI) lub – gdy wymagana jest wyższa przepustowość – SD_MMC.h
(interfejs SD-MMC w trybie 1-/4-bit). #include <SPI.h>
#include <SD.h>
constexpr uint8_t CS = 5; // Chip-Select
constexpr uint32_t SPI_FREQ = 20'000'000; // 20 MHz – najczęściej stabilne
void setup() {
Serial.begin(115200);
if (!SD.begin(CS, SPI, SPI_FREQ)) { // inicjalizacja z podaniem częstotliwości
Serial.println("⛔ Błąd inicjalizacji SD");
return;
}
Serial.println("✅ Karta SD OK");
// zapis
File f = SD.open("/hello.txt", FILE_WRITE);
f.println("Witaj świecie z ESP32!");
f.close();
// odczyt
f = SD.open("/hello.txt");
while (f.available()) Serial.write(f.read());
f.close();
}
void loop() {}
Kluczowe punkty
• zasilanie 3 V3 oraz integralny stabilizator/moduł poziomów logicznych
• format FAT32 ≤ 32 GB (Arduino-core 2.0.14+ umożliwia także exFAT przez SdFat, lecz wymaga ręcznej aktywacji)
• osobny pin CS dla innych urządzeń SPI
1.1 SPI (najczęstszy) – dowolne piny, najprostsza konfiguracja, do ~10 M B/s.
1.2 SD-MMC (wbudowany peryferyjny kontroler) – dedykowane GPIO (2, 4, 12–15), tryb 1- lub 4-bit, realna prędkość 18–25 M B/s.
1.3 HSPI/VSPI – w ESP32 dostępne dwie pełne magistrale; SD i inne peryferia można rozdzielić.
• SD.h
(wrapper nad SdFat v1) – stabilne, w rdzeniu esp32-arduino od v2.0.0.
• SdFat_ESP32
– (od v2.1) obsługuje exFAT, posix-style, DMA.
• SD_MMC.h
– korzysta z drivera ESP-IDF; w Arduino-core ≥ v2.0.11 naprawiono problem z plikami >4 GiB.
• LittleFS
/SPIFFS
– alternatywa wbudowana w flash, przydatna gdy karta SD nie jest wymagana.
SPI.begin(SCK, MISO, MOSI, CS);
– jeśli chcemy niestandardowe piny. SD.begin(CS, SPI, F_CPU_SPI)
lub SD_MMC.begin("/sdcard", true)
open() / read() / write() / rename() / remove()
xSemaphoreCreateMutex()
. • SD.cardType()
, SD.cardSize()
, SD.totalBytes()
, SD.usedBytes()
– szybki check.
• „init failed” → 80 % przypadków to błąd CS lub zasilania; 15 % – format exFAT z kartą >32 GB; 5 % – uszkodzony czytnik.
Teoretycznie:
\[
t{transfer} = \frac{N\text{Bajtów}}{f_{SPI}/8}
\]
Praktycznie przy 40 MHz (maks. w SdFat DMA) odczyt ciągły ~5 MB/s; SPI 20 MHz ~2,5 MB/s. Tryb 4-bit SD-MMC potrafi przekroczyć 15 MB/s.
#include "SD_MMC.h"
void setup() {
Serial.begin(115200);
if(!SD_MMC.begin("/sdcard", true)) { // true = 1-bit, false = 4-bit
Serial.println("SD_MMC mount FAIL");
return;
}
File f = SD_MMC.open("/log.csv", FILE_APPEND);
f.printf("%lu,%0.2f,%0.2f\n", millis(), temp, hum);
f.close();
}
void loop() {}
• Rdzeń Arduino-ESP32 2.0.14 (maj 2024) domyślnie kompiluje SdFat v2.2 z opcjonalnym exFAT.
• Espressif wprowadza „wear-leveling” dla SD-MMC (IDF v5.2).
• Coraz więcej projektów używa SD jako „web content storage” – serwowanie plików przez esp32_async_webserver
.
• Moduły zgodne z UHS-I (SDR50/104) są wspierane w nowych układach ESP32-S3 (wymaga PCB 50 Ω).
• Staraj się trzymać przewody < 10 cm, skręć SCK z GND.
• Przy równoległej obsłudze Wi-Fi ustaw SD.begin(..., SPI_HALF_SPEED)
– obniża zakłócenia.
• Do testów wydajności: uint32_t t = millis(); testFileIO(SD, "/bench.dat"); Serial.println(millis()-t);
• Ogranicz liczbę open()/close()
– lepiej buforować.
• Regularnie wywołuj fsync()
lub file.flush()
aby uniknąć utraty danych przy zaniku zasilania.
SD_CONFIG(SD_CS, SD_SCK_MHZ(50))
. • Porównanie zużycia energii SD vs. QSPI-flash vs. PSRAM dla loggerów bateryjnych.
• Szyfrowanie karty SD przy użyciu ESP32-AES-hardware (mapowanie FATFS do szyfrowanych bloków).
• Zbadanie trwałości kart industrialnych SLC w aplikacjach IoT (-40 °C…+85 °C).
Karta SD na ESP32 działa pewnie zarówno przez SPI (SD.h
), jak i szybciej przez natywny SD-MMC (SD_MMC.h
). Kluczowe są: poprawne piny, poziomy 3 V3, FAT32 lub exFAT (najnowsze SdFat), oraz stabilne zasilanie. Przykładowy kod przedstawiony powyżej pozwala natychmiast rozpocząć pracę i łatwo go rozszerzyć o logowanie danych, serwowanie plików czy aktualizacje OTA.