Подключение MicroSD-модуля к ESP8266: работа с файлами и автоматическая запись
MicroSD-модуль на ESP8266 — отличный способ хранить большие объёмы данных без компьютера. Подключаем по SPI, используем встроенную библиотеку SD. Создаём, читаем, удаляем файлы, автоматически разбиваем логи на пронумерованные файлы (например, по 10 секунд). Идеально для логгеров температуры, влажности, датчиков движения или Wi-Fi-роутеров. Работает с картами до 32 ГБ (FAT32), запись стабильная и быстрая.
Возможности
Подключение по SPI (4 провода). Создание/удаление файлов. Автоматическая нумерация файлов. Запись данных с датчиков. Чтение и вывод в Serial. Легко интегрировать с DHT, DS18B20, логами Wi-Fi или камерой. До 17–20 записей в секунду на быстрой карте.
Компоненты
- ESP8266 NodeMCU
- MicroSD-адаптер (модуль с уровнями 3.3В)
- MicroSD-карта (FAT32)
Подключение по SPI
- VCC → 3.3V или 5V (модуль работает от обоих)
- GND → GND
- MISO → D12 (GPIO12)
- MOSI → D11 (GPIO13)
- SCK → D13 (GPIO14)
- CS → D8 (GPIO15, любой свободный)
Не подключайте напрямую без модуля — паяйте резисторы делителя.
Библиотеки
- SD (встроенная в ESP8266 core)
- SPI (встроенная)
Основные функции SD
- SD.begin(CS_PIN) — инициализация
- SD.exists(«/file.txt») — проверка существования
- SD.open(«/file.txt», FILE_WRITE) — открыть/создать
- file.println(data) — запись
- SD.remove(«/file.txt») — удаление
Скетч: автоматическая запись с нумерацией
#include <SPI.h>
#include <SD.h>
const uint8_t CHIP_SELECT = D8;
const unsigned long FILE_INTERVAL = 10000; // 10 сек
const unsigned long WRITE_INTERVAL = 1000; // 1 сек
File dataFile;
uint32_t fileNumber = 0;
unsigned long lastFileSwitch = 0;
unsigned long lastWrite = 0;
// поиск следующего свободного файла
String nextFilename() {
String name;
do {
name = "/data" + String(fileNumber++) + ".txt";
} while (SD.exists(name));
return name;
}
void openNewFile() {
if (dataFile) dataFile.close();
String filename = nextFilename();
dataFile = SD.open(filename, FILE_WRITE);
if (dataFile) {
Serial.print("Открыт файл: ");
Serial.println(filename);
} else {
Serial.println("Ошибка открытия файла!");
}
}
void setup() {
Serial.begin(115200);
if (!SD.begin(CHIP_SELECT)) {
Serial.println("Ошибка инициализации SD!");
while (true);
}
openNewFile();
lastFileSwitch = millis();
lastWrite = millis();
}
void loop() {
unsigned long now = millis();
// смена файла каждые 10 секунд
if (now - lastFileSwitch >= FILE_INTERVAL) {
openNewFile();
lastFileSwitch = now;
}
// запись данных раз в секунду
if (dataFile && now - lastWrite >= WRITE_INTERVAL) {
int value = random(0, 10000);
dataFile.println(value);
dataFile.flush(); // гарантируем запись
Serial.println(value);
lastWrite = now;
}
}
Каждые 10 секунд создаёт новый файл на SD-карте.
Раз в секунду записывает случайное число и сразу сохраняет его на карту.
Использует millis() вместо delay() — код работает стабильно и без блокировок.
Как работает
Инициализация SD, поиск последнего файла. Каждые 10 секунд закрываем текущий и создаём новый с номером. Запись случайных чисел (замените на данные датчика). Автоматическая нумерация предотвращает переполнение.
Заключение
MicroSD на ESP8266 — надёжное локальное хранилище. Легко логировать данные часами/сутками. Интегрируйте с датчиками, Wi-Fi или Telegram для полной автономной системы.
FAQ — MicroSD на ESP8266
Почему SD не инициализируется?
Проверьте подключение, формат FAT32, правильный CS-пин. Добавьте pull-up 10 кОм на MISO.
Можно без модуля?
Да, но нужны делители напряжения (резисторы) на линиях 5В→3.3В.
Как создать папки?
SD.mkdir(«/folder») — создаёт директорию.
Сколько файлов максимально?
FAT32 — тысячи, зависит от карты. Нумеруйте для избежания переполнения.
Как читать файл?
File file = SD.open(«/file.txt»); while(file.available()) Serial.write(file.read());
Работает ли с ESP32?
Да, та же библиотека SD, другие пины SPI.
Как добавить время в имя файла?
Интегрируйте NTP или RTC, используйте String(«/» + year() + month() + day() + «.txt»).