Сторожевой таймер на ESP32-CAM
# Охранный модуль на базе ESP32-CAM
Перед нами встала конкретная прикладная задача: контролировать движение в ограниченном пространстве (например, в узком коридоре, лестничном пролёте или тамбуре), оперативно делать снимки происходящего и пересылать их пользователю в Telegram. При этом в зоне наблюдения уже функционирует стандартный бытовой датчик движения, управляющий освещением.
Разумеется, подобное можно реализовать с помощью банальной недорогой веб-камеры, однако в таком случае мы окажемся полностью зависимы от её проприетарной экосистемы.
В предыдущей статье, посвящённой созданию и развёртыванию серверной инфраструктуры для экосистемы ESP-устройств, мы подробно рассматривали интеграцию популярных сервисов в рамках Kubernetes-кластера. Тогда были задействованы следующие компоненты:
-
Прошивка микроконтроллеров (ESP8266 / ESP32) — транслирует их текущий статус через MQTT-брокер и принимает управляющие команды.
-
Mosquitto MQTT — брокер сообщений, обрабатывающий входящий телеметрический поток от микроконтроллеров.
-
Esp-server — ядро системы, позволяющее мониторить и конфигурировать зарегистрированные устройства посредством мобильного клиента, публичного API или веб-админки.
-
iOS-клиент — мобильное приложение для первичной настройки оборудования через публичный API.
-
Воркеры (kworker, ai-worker, hworker) — вспомогательные микросервисы, анализирующие события в Kafka для генерации уведомлений, построения матриц состояний, отявления аномалий и отправки вебхуков.
-
Docker — среда контейнеризации для Minikube-кластера.
-
Kafka — событийно-ориентированный брокер логов.
-
Kafdrop — веб-интерфейс для визуального контроля топиков Kafka.
-
Vector — агент сбора телеметрии для экосистемы Prometheus.
-
VictoriaMetrics — высокопроизводительное хранилище временных рядов.
-
Grafana — инструмент визуализации данных.
-
Dashboard Minikube — панель администрирования кластера Kubernetes.
-
Скрипты автоматизации развёртывания инфраструктуры.
В настоящем материале мы покажем, как расширить этот кластер следующими элементами:
-
Аппаратный модуль на базе ESP32-CAM.
-
Специализированная прошивка для ESP32-CAM, поддерживающая несколько рабочих режимов.
-
MinIO — объектное хранилище для медиафайлов, создаваемых камерой.
-
pworker — сервис-мост, подхватывающий из Kafka уведомления о новых кадрах и генерирующий защищённые ссылки на файлы.
-
N8n — оркестратор сценариев автоматизации, пересылающий изображения в Telegram-бот.
-
Telegram-бот — интерфейс для оперативного просмотра фотографий.
Общая архитектура потоков данных выглядит следующим образом:

Давайте разберем концепцию подробнее.
Если вы только начинаете погружаться в мир микроконтроллеров, подобный стек может показаться избыточным, особенно на фоне упоминания Kubernetes. Однако задайте себе вопрос: сколько времени уйдёт на самостоятельную разработку сопутствующего функционала, выходящего за рамки вашей прямой задачи? Каждая новая функция требует проработки целых пластов — от бизнес-логики до публичного API и интерфейсов администрирования. Трудозатраты при этом растут лавинообразно, не говоря о последующей поддержке и мониторинге. В то же время проверенные промышленностью решения избавляют вас от рутины, позволяя сосредоточиться на творческой составляющей. А Kubernetes обеспечивает отказоустойчивость: при сбое любого сервиса он перезапустится автоматически, а при необходимости кластер легко масштабируется на несколько серверов.
Такие компоненты, как прошивки, воркеры, клиентские приложения и конфигурационные сценарии, поставляются в виде открытого кода — их можно использовать как есть или адаптировать под свои задачи. Прочие сервисы являются признанными стандартами индустрии, доступными абсолютно легально и бесплатно. Пытаться написать велосипед с нуля ради экономии ресурсов кажется проще лишь на первый взгляд — в долгосрочной перспективе самописное решение обойдется значительно дороже как по времени, так и по силам.
Аппаратная часть (Hardware)
Главное отличие ESP32-CAM от классической ESP32 заключается в меньшем количестве свободных пинов, причём практически все они задействованы в нашем проекте.
В данном устройстве используется распиновка следующего вида:

Большая часть выводов обслуживает саму камеру или слот для карты памяти. Даже если они простаивают, подключать к ним стороннюю периферию не рекомендуется.
Для построения нашего «сторожа» задействованы следующие пины:
Ориентация (лево/право) определяется относительно расположения надписи «ESP32-CAM» в нижней части платы при взгляде на модуль камеры в нормальном положении.
Будьте внимательны и сверяйте схему с маркировкой на вашей плате, так как у разных производителей распиновка может отличаться.
Некоторые инженерные нюансы, привычные аппаратчикам, могут удивить разработчиков софта:
1. Требуется внешний источник питания 5В с токоотдачей не менее 1А. Пиковые нагрузки при инициализации Wi-Fi и съёмке могут спровоцировать перезагрузку.
2. При использовании внешнего питания программатор подключается только линиями RXD, TXD и GND. Выводы DTR и 3V3 задействовать не нужно.
3. Нельзя питать периферию от встроенных стабилизаторов 3.3V и VCC микроконтроллера (или линии 3V3 программатора) — они не рассчитаны на такие токи.
4. При продолжительном хранении фиксирующая защёлка шлейфа камеры может рассохнуться, что приводит к деформации контактов и сбоям в работе.
5. Для прошивки необходимо замкнуть GPIO0 на GND и дождаться старта загрузки в Serial Monitor. В отличие от обычной ESP32, модель с камерой требует физического вмешательства. На обратной стороне платы вверху слева расположена кнопка Reset, которую нужно нажать при замкнутом GPIO0. После окончания прошивки перемычку снимают и снова нажимают Reset. Автор вывел на GPIO0 тактовую кнопку для удобства. К сожалению, кнопку Reset придётся дорабатывать пайкой, если вы хотите вывести её наружу.
6. Модуль ощутимо греется под нагрузкой. По возможности стоит предусмотреть небольшой радиатор или медную пластину для теплоотвода.
7. Непрерывная фото- или видеосъёмка в течение нескольких часов гарантированно выведет модуль камеры из строя из-за перегрева (автор сжёг тестовый экземпляр за три часа). Сама ESP32 при этом останется работоспособной.
Карта памяти в данном устройстве не используется (даже несмотря на наличие слота), поскольку линия GPIO14 отдана под датчик освещённости.
Пин GPIO4 управляет ярким белым светодиодом, который можно задействовать как вспышку. Учитывайте, что это заметно увеличивает энергопотребление и нагрев.

Прошивка (Firmware)
Из-за специфики использования пинов стандартная прошивка для ESP32 была адаптирована. Исходный код находится в директории firmware/esp32-cam.
Помимо корректировки логики опроса пинов, передаваемых через MQTT на сервер, были внесены следующие изменения:
-
Добавлены менеджеры CameraManager (CoreCamera.cpp) и CaptureManager.
-
Реализована публикация снимков в MQTT-топик «photo».
-
Добавлено сохранение настроек камеры в конфигурационном файле.
-
Внедрено три режима фотосъёмки:
-
Кадр каждые 5 секунд.
-
Серия из 3 кадров каждые 5 секунд.
-
Съёмка каждые 5 секунд на протяжении 20 секунд после срабатывания датчика.
-
В остальном архитектура прошивки осталась прежней.
Чтобы уберечь матрицу от перегрева, снимки делаются только при достаточной освещённости (когда сопротивление фоторезистора минимально). Вспышка может демаскировать устройство — если вас это не устраивает, просто закомментируйте проверку в файле CoreCamera.cpp:
if (capturer.isNight()) return nullptr;
Серверная часть (esp-server)
Бэкенд претерпел следующие архитектурные расширения:
1) Интегрирована поддержка объектного хранилища MinIO.
2) Добавлена обработка MQTT-топика «photos» с приёмом сериализованных изображений и их выгрузкой в MinIO.
3) Настроена публикация соответствующих событий в топики Kafka.
4) В веб-админку добавлена секция конфигурации камеры, которая отображается автоматически, если mDNS-имя устройства содержит суффикс «-cam».
Также была улучшена навигация по админке: после сохранения параметров система сразу перенаправляет пользователя к списку устройств, что существенно упрощает администрирование.
Все доправки проектировались с расчётом на изоляцию: они легко отключаются и никак не затрагивают базовый функционал платформы.

Воркер pworker
pworker — новый связующий микросервис между Kafka и MinIO. Он мониторит топик «photos», генерирует временную защищённую (presigned) ссылку на файл и передаёт её по HTTP-вебхуку в оркестратор N8n. Сам N8n скачивает изображение напрямую из MinIO внутри сети Kubernetes (http://minio-service:9000), поскольку мессенджеры не имеют доступа к внутренним адресам. Ссылка имеет ограничение по времени жизни (15 минут) и привязана к конкретному хосту. По аналогии с остальными воркерами (kworker, ai-worker, hworker), pworker легко масштабируется при увеличении числа устройств.


Деплоймент
Конфигурационный манифест infra.yaml был дополнен инструкциями для автоматической установки сторонних сервисов MinIO и N8n при первом запуске.
В стартовые скрипты en-start-cluster и ru-start-cluster добавлены команды для инициализации новых компонентов, открытия их веб-интерфейсов и запуска консоли pworker.
Хранилище MinIO
MinIO организует хранение файлов в виде иерархических батчей. В качестве имён папок используются mDNS-имена устройств (SSDN). Это существенно упрощает поиск: если у вас работает несколько камер, файлы каждой из них аккуратно раскладываются по именным директориям. Управлять файлами можно через удобную веб-панель.

Интеграция с Telegram
Сам по себе Telegram не входит в экосистему «esp-monitor», но выступает в роли клиентского приложения для получения тревожных фото. Для этого требуется выполнить несколько предварительных шагов:
1) Создать бота через официального @BotFather:
-
Найти @BotFather в поиске Telegram.
-
Запустить диалог кнопкой «Start».
-
Отправить команду /newbot и следовать инструкциям (имя должно заканчиваться на «_bot»).
-
Перейти в меню управления ботами через кнопку «Open».
-
Скопировать токен доступа из защищённого поля.
2) Узнать собственный ID с помощью сервиса «User Info»:
-
Найти бота userinfo в поиске Telegram.
-
Запустить его.
-
Скопировать числовой параметр id из полученной карточки пользователя.
Оркестратор N8n
N8n отвечает за построение логических сценариев. Наша автоматизация состоит из трёх шагов:
-
Принять защищённую ссылку от pworker.
-
Выполнить HTTP GET-запрос для скачивания бинарных данных изображения.
-
Переслать полученный файл в Telegram-бот.
В дальнейшем этот пайплайн можно расширить, подключив модули искусственного интеллекта для анализа снимков (например, распознавание людей или животных с последующей активацией сирены или открытием замка).
Готовый сценарий уже подготовлен и лежит в папке k8s (n8n-esp32-photo.json). Его нужно импортировать при первом запуске N8n, после чего прописать учетные данные Telegram.
Для этого в импортированном workflow открывают узел «Telegram», прописывают полученный ранее Chat ID, а в настройках Credentials указывают токен бота. После этого нажимают кнопку Publish в верхнем правом углу — сценарий готов к работе.



Важное примечание по работе с N8n:
В свежих версиях N8n интерфейс использует разделение на черновики (Draft) и опубликованные версии (Published). Любые правки сохраняются как черновик и не обрабатывают реальные входящие вебхуки, пока вы не нажмёте кнопку Publish. Если кнопка активна — значит, пайплайн переведён в боевой режим.
Это сбережёт немало нервов при отладке, так как многие по привычке ищут старый тумблер «Active» и недоумевают, почему изменённый сценарий молчит.

Запуск Kubernetes-кластера
Если вы разворачиваете систему впервые, скачайте исходный код из публичного репозитория и установите Docker на целевой хост.
Запустите скрипт setup-k8s-cluster.sh — он выполнит базовую подготовку среды и скачает необходимые бинарные зависимости.
После завершения подготовки запустите кластер с помощью скрипта en-start-cluster или ru-start-cluster.
При первом запуске не забудьте настроить интеграции Telegram и N8n, как описано выше.
Для последующих запусков (после перезагрузки хоста) достаточно выполнить стартовый скрипт и дождаться инициализации служб.
В процессе старта браузер по умолчанию откроет панели управления ключевых сервисов:
-
Grafana
-
Esp-server
-
MinIO
-
N8n
-
Kafdrop
-
Minikube Dashboard
Некоторое время интерфейсы могут отдавать пустые страницы, пока службы полностью поднимаются (обычно это занимает до минуты). Контролировать процесс можно через дашборд Minikube: как только все графики станут зелёными, страницы можно обновлять.
Если мониторинг в реальном времени вам не нужен, открытые вкладки браузера можно смело закрыть.
В конце работы скрипта в консоли появится справочная информация о том, как повторно открыть нужную панель управления. Терминальные окна воркеров и вспомогательных процессов можно свернуть или закрыть, оставив активным только основной терминал кластера. Для остановки всей системы достаточно прервать выполнение стартового скрипта.

Подключение ESP-устройства
Поскольку базовый сценарий работы устройств подразумевает обмен данными через локальный MQTT-брокер, первичная конфигурация выполняется одним из следующих способов:
-
Собрать и установить на iOS-устройство мобильное приложение из папки clients/iPhone. Подключившись к точке доступа камеры, передать ей параметры сети. Приложение сохраняет конфигурацию, что позволяет быстро настраивать новые модули.
-
Воспользоваться готовым скриптом curl из папки clients/curl, предварительно подключившись к Wi-Fi сети самого устройства (пароль точки доступа — «1qazxsw2»).
-
Использовать любой REST-клиент (например, Postman), отправив POST-запрос с аналогичными параметрами.
Заключение
Несмотря на объёмное описание, повседневная эксплуатация системы крайне проста: инфраструктура поднимается одной командой, после чего сторожевой модуль начинает автономно патрулировать территорию и присылать фотоотчёты в мессенджер. Дальнейшие возможности ограничиваются лишь вашей фантазией, ведь гибкость N8n позволяет автоматизировать любые сценарии без написания сложного кода.
Бюджетный датчик температуры и влажности Xiaomi оснастили экраном на 3,6 дюйма и сенсором CO₂
Анонсирован первый в мире модуль DDR5 RDIMM на 512 ГБ: емкость ОЗУ в серверах достигнет 12 ТБ
Сравнение Samsung Galaxy S26 Ultra и iQOO 16 с лучшим дисплеем от Samsung
Как кремний взломал кремний: история создания первого в мире подтвержденного PCIe Gen2 x16 для CMP90HX
За полгода SpaceX совершила более 200 тысяч маневров уклонения для спутников Starlink
Sonnet выпустила док-станцию Breakaway Box 850 T5 для видеокарт с Thunderbolt 5 и блок питания на 850 Вт
Ученые призвали искать следы инопланетных технологий на Луне
Раскрыты детали Realme 16 Pro Harry Potter Edition: в комплекте будет письмо из Хогвартс и билет на поезд