ESP32-CAM – стоп-кадр из видеопотока, сохранение на SD-карту, просмотр и удаление

ESP32-CAM с камерой OV2640 позволяет не только транслировать видео по Wi-Fi, но и сохранять любой кадр на microSD-карту одним нажатием кнопки в веб-интерфейсе. При этом поток не прерывается, а все фотографии можно сразу просмотреть, скачать или удалить — без извлечения карты. Идеальное решение для систем видеонаблюдения, умного дома и IoT-проектов своими руками.

ESP32-CAM стоп-кадр и сохранение на SD-карту

В этом проекте реализован полноценный веб-сервер: живая трансляция, изменение разрешения до SXGA (1280×1024), регулировка яркости вспышки, контрастности, насыщенности и качества JPEG. Список файлов сортируется по дате, последний сохранённый кадр выделяется, удаление происходит мгновенно.

Всё работает на стандартном примере CameraWebServer из библиотеки ESP32 без дополнительных библиотек.

Необходимые компоненты

  • Модуль ESP32-CAM (AI-Thinker)
  • Камера OV2640 (идёт в комплекте)
  • MicroSD-карта (до 4 ГБ FAT32 рекомендуется)
  • Программатор FTDI или USB-TTL (5В/3.3В)
  • Источник питания 5В 1–2А

Подключение

  • SD-карта вставляется в слот на плате ESP32-CAM
  • Питание только 5В (не 3.3В!)
  • GPIO0 на землю при прошивке
  • Антенна наружу для лучшего Wi-Fi

Как это работает

  1. ESP32 запускает веб-сервер и потоковое видео (MJPEG)
  2. При нажатии кнопки «Сохранить» текущий кадр из буфера сохраняется в JPEG на SD-карту
  3. Имя файла — дата и время (2025-11-18_12-34-56.jpg)
  4. Функция listDir() сканирует карту и выводит отсортированный список
  5. Клик по файлу — просмотр в том же окне, кнопка «Delete» — удаление
  6. Все настройки (разрешение, качество, яркость вспышки) меняются на лету

Пример кода

#include "FS.h"
#include "SD_MMC.h"
#include "esp_camera.h"

// Функция для захвата и сохранения фото
void capturePhoto() {
  camera_fb_t *fb = esp_camera_fb_get();
  if(!fb){
    Serial.println("Camera capture failed");
    return;
  }

  String path = "/pic_" + String(millis()) + ".jpg";
  File file = SD_MMC.open(path.c_str(), FILE_WRITE);
  if(file){
    file.write(fb->buf, fb->len);
    file.close();
    Serial.printf("Saved: %s (%u bytes)\n", path.c_str(), fb->len);
  } else {
    Serial.println("Ошибка открытия файла на SD");
  }

  esp_camera_fb_return(fb);
}

// Функция для получения списка файлов в HTML-таблице
String getFileListHTML() {
  String list = "";
  File root = SD_MMC.open("/");
  if(root.isDirectory()){
    File file = root.openNextFile();
    while(file){
      String name = String(file.name());
      list += "";
      list += "";
      list += "";
      list += "";
      file = root.openNextFile();
    }
  }
  list += "
DeleteFileSizeView
Delete" + name + "" + String(file.size()) + " bytesView
"; return list; } // Пример использования void setup() { Serial.begin(115200); if(!SD_MMC.begin()){ Serial.println("Ошибка инициализации SD_MMC"); return; } Serial.println("SD_MMC готова"); // Захват фото capturePhoto(); // Печать списка файлов String html = getFileListHTML(); Serial.println(html); } void loop() { // Можно интегрировать с веб-сервером }
Проверка инициализации SD_MMC.
Проверка директории перед openNextFile().
Генерация HTML-таблицы для удобного просмотра и удаления файлов.
Фото сохраняются с уникальными именами на основе millis().

Преимущества

  • Снимок одним кликом без остановки видео
  • Полный контроль файлов через браузер
  • Не нужно доставать SD-карту
  • Работает на любом разрешении до 1600×1200
  • Полностью автономно после прошивки
  • Легко интегрируется в системы умного дома

Применение

  • Скрытое видеонаблюдение и охрана
  • Фотоловушки на движение (дополняется PIR-датчиком)
  • Видеорегистратор для двора/гаража
  • Контроль сотрудников и посетителей
  • Документирование событий в реальном времени
  • База для систем распознавания лиц и номеров

Заключение

ESP32-CAM с функцией стоп-кадра и управлением файлами на SD-карте — готовое решение для видеонаблюдения своими руками. Никаких облачных сервисов, всё хранится локально и доступно в один клик. Прошейте пример, направьте камеру на нужный объект — и получайте доказательства по нажатию кнопки!

FAQ — ESP32-Cam: стоп-кадр, сохранение на SD и удаление

Можно ли сделать стоп-кадр с ESP32-Cam без остановки видео?

Да. В примере видеопоток продолжает работать, а текущий кадр сохраняется по нажатию кнопки. Камеру не нужно останавливать и SD-карту извлекать.

Куда сохраняются стоп-кадры?

Все стоп-кадры сохраняются на SD-карту, установленную в модуль ESP32-Cam. Имена файлов формируются автоматически по дате и времени.

Можно ли просматривать сохранённые изображения через веб-интерфейс?

Да. Список файлов отображается на странице в виде таблицы, отсортированной по дате. Нажав соответствующую кнопку, вы сможете открыть изображение прямо в браузере без выключения камеры.

Можно ли удалять файлы с SD-карты через страницу?

Да. Каждый сохранённый файл имеет кнопку удаления. SD-карту не требуется вынимать из ESP32-Cam — удаление выполняется непосредственно через веб-интерфейс.

Какие параметры изображения можно регулировать?

Можно изменять разрешение, качество JPEG, яркость, контрастность и насыщенность. Доступна также регулировка яркости светодиодной подсветки.

Нужно ли останавливать видеопоток для просмотра снимков?

Да. Просмотр фото осуществляется в том же окне, что и видеопоток. Поэтому видеопоток нужно остановить, иначе изображение будет перекрываться обновлениями видео.

Как формируется список сохранённых файлов?

На странице выводится таблица с полями: имя файла, размер и кнопки «Просмотр» и «Удалить». Файлы сортируются по убыванию даты — новые сверху.

Какие разрешения поддерживаются камерой OV2640?

Поддерживаются стандартные режимы от QQVGA до UXGA. В примере используется SXGA (1280×1024), но можно выбрать любое доступное разрешение из выпадающего списка.

Почему иногда веб-страница изменяет размер с задержкой?

Это связано с высоким разрешением и слабым сигналом Wi-Fi. При больших кадрах обновление интерфейса может занимать немного больше времени.

Нужны ли дополнительные библиотеки для этого проекта?

Нет. Все необходимые библиотеки входят в комплект Arduino IDE после установки поддержки ESP32. Дополнительные модули устанавливать не требуется.

Какое назначение у GET-запросов в этом проекте?

GET-параметры используются для управления камерой: изменение настроек, перезагрузка устройства, переключение режима видео, изменение яркости LED, просмотр фото, удаление файлов.

Почему HTML-часть скетча такая большая?

Большая часть кода — это HTML, CSS и JavaScript для веб-интерфейса. Логика обработки кадра и работы с SD-картой занимает относительно мало места.

📁 Скачать примеры