Создание веб-сервера на ESP32 с хранением данных на SD-карте

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 мог корректно работать с ней.

Оставьте комментарий