1. Подключение SD-карты к ESP32
Для подключения SD-карты используйте SPI интерфейс. Подключите контакты следующим образом:
- CS (Chip Select) → GPIO5
- MOSI (Master Out Slave In) → GPIO23
- MISO (Master In Slave Out) → GPIO19
- SCK (Serial Clock) → GPIO18
- GND → GND
- VCC → 3.3V
Убедитесь, что SD-карта отформатирована в файловой системе FAT16 или FAT32, так как ESP32 поддерживает только эти форматы.
2. Импорт библиотеки SD
В Arduino IDE добавьте библиотеку SD:
- Выберите
Sketch
→Include Library
→SD
.
3. Инициализация SD-карты
Используйте функцию SD.begin()
для инициализации SD-карты. Убедитесь, что карта подключена корректно и находится в рабочем состоянии. Пример:
Примерный код для создания веб-сервера на ESP32 с хранением данных на SD-карте:
if (!SD.begin(5)) { // 5 — номер пина CS
Serial.println("Ошибка инициализации SD-карты");
return;
}
4. Создание веб-сервера
Используйте библиотеки WiFi
и WebServer
для создания веб-сервера. Настройте подключение к Wi-Fi и создайте объект сервера:
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "Ваш_SSID";
const char* password = "Ваш_пароль";
WebServer server(80);
void setup() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Подключение к Wi-Fi...");
}
Serial.println("Подключено к Wi-Fi");
Serial.print("IP-адрес: ");
Serial.println(WiFi.localIP());
server.begin();
}
5. Обработка запросов клиентов
Для обработки запросов используйте функции библиотеки SD
:
- Открытие файла:
SD.open()
- Чтение данных:
read()
- Закрытие файла:
close()
- Запись данных:
SD.open()
с параметромFILE_WRITE
иwrite()
Пример обработки запроса на чтение файла:
void handleRoot() {
File file = SD.open("/index.html");
if (file) {
server.streamFile(file, "text/html");
file.close();
} else {
server.send(404, "text/plain", "Файл не найден");
}
}
void setup() {
server.on("/", handleRoot);
}
6. Запись данных на SD-карту
Для записи данных от клиента используйте функцию handleFileUpload()
:
void handleFileUpload() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
String filename = upload.filename;
if (!filename.startsWith("/")) filename = "/" + filename;
File file = SD.open(filename, FILE_WRITE);
if (file) {
upload.file = file;
} else {
server.send(500, "text/plain", "Ошибка создания файла");
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (upload.file) upload.file.write(upload.buf, upload.currentSize);
} else if (upload.status == UPLOAD_FILE_END) {
if (upload.file) {
upload.file.close();
server.send(200, "text/plain", "Файл загружен успешно");
}
}
}
void setup() {
server.on("/upload", HTTP_POST, []() {
server.send(200, "text/plain", "Загрузка завершена");
}, handleFileUpload);
}
7. Запуск сервера
Запустите сервер с помощью server.begin()
. ESP32 начнет слушать входящие запросы:
void loop() {
server.handleClient();
}
8. Оптимизация и обработка ошибок
- Оптимизация: Используйте кэширование данных в памяти ESP32 для уменьшения количества обращений к SD-карте. Применяйте функции
flush()
илиsync()
для гарантии записи данных. - Обработка ошибок: Проверяйте возвращаемые значения функций (например,
SD.open()
) и отправляйте клиенту соответствующие сообщения об ошибках. - Защита данных: Для конфиденциальных данных рассмотрите возможность шифрования или ограничения доступа к файлам.
Пример кода:
#include <WiFi.h>
#include <WebServer.h>
#include <SD.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
WebServer server(80);
void handleRoot() {
File file = SD.open("/index.html"); // Открываем файл index.html на SD-карте
if (file) {
server.streamFile(file, "text/html"); // Отправляем файл клиенту
file.close(); // Закрываем файл
} else {
server.send(404, "text/plain", "File Not Found"); // Отправляем ошибку 404, если файл не найден
}
}
void handleFileUpload() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
String filename = upload.filename;
if (!filename.startsWith("/")) {
filename = "/" + filename;
}
File file = SD.open(filename, FILE_WRITE);
if (file) {
upload.file = file;
} else {
server.send(500, "text/plain", "Failed to create file");
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (upload.file) {
upload.file.write(upload.buf, upload.currentSize);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (upload.file) {
upload.file.close();
server.send(200, "text/plain", "File uploaded successfully");
}
}
}
void setup() {
Serial.begin(115200);
// Инициализируем SD-карту
if (!SD.begin(5)) { // CS pin is connected to GPIO5
Serial.println("Failed to initialize SD card");
return;
}
// Подключаемся к Wi-Fi сети
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Определяем обработчики запросов
server.on("/", handleRoot);
server.on("/upload", HTTP_POST, []() {
server.send(200, "text/plain", "Upload complete");
}, handleFileUpload);
// Запускаем сервер
server.begin();
}
void loop() {
server.handleClient(); // Обрабатываем клиентские запросы
}
Обработка запросов:
Корневой запрос (/
) обрабатывается функцией handleRoot()
, которая открывает файл index.html
на SD-карте и отправляет его клиенту.
Запрос на загрузку файла (/upload
) обрабатывается функцией handleFileUpload()
, которая сохраняет загруженный файл на SD-карту.
Убедитесь, что вы внесли необходимые изменения в код, такие как SSID и пароль Wi-Fi сети. Также убедитесь, что SD-карта правильно подключена к ESP32 и настроена.
Вы можете добавить дополнительные обработчики запросов и функции для работы с файлами на SD-карте, в зависимости от вашей специфической задачи.
Обратите внимание, что номера GPIO, указанные в схеме, могут отличаться в зависимости от конкретной модели ESP32 и используемых контактов,
- Подключите контакт CS (Chip Select) на SD-карте к пину GPIO5 на ESP32.
- Подключите контакт MOSI (Master Out Slave In) на SD-карте к пину GPIO23 на ESP32.
- Подключите контакт MISO (Master In Slave Out) на SD-карте к пину GPIO19 на ESP32.
- Подключите контакт SCK (Serial Clock) на SD-карте к пину GPIO18 на ESP32.
- Подключите контакт GND на SD-карте к GND на ESP32.
- Подключите контакт VCC на SD-карте к 3.3V на ESP32.
некоторые модели ESP32 имеют встроенные пины для работы с SD-картами, такие как D5 (GPIO5) для CS и D23 (GPIO23) для MOSI. Проверьте документацию вашей конкретной модели ESP32 для уточнения доступных пинов для работы с SD-картой.
Кроме того, убедитесь, что SD-карта правильно отформатирована в файловую систему FAT16 или FAT32, чтобы ESP32 мог корректно работать с ней.