ESP32-CAM и HC-SR501 отправка фото в Telegram

ESP32-CAM с датчиком движения HC-SR501 превращается в полноценную фотоловушку: при обнаружении движения камера мгновенно делает снимок и отправляет его в ваш Telegram-чат или канал. Никаких SD-карт, облаков и задержек — фото приходит через 2–4 секунды после срабатывания. Идеально для охраны дома, гаража, дачи и скрытого наблюдения своими руками.

ESP32-CAM + датчик движения HC-SR501 + Telegram

Работает на стандартной плате AI-Thinker, использует только встроенные библиотеки ESP32 + UniversalTelegramBot. Никаких дополнительных плат и компонентов, кроме датчика движения.

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

  • ESP32-CAM (AI-Thinker)
  • Датчик движения HC-SR501
  • Источник питания 5 В / 1–2 А (обязательно 5 В!)
  • Программатор FTDI/USB-TTL

Подключение

  • VCC HC-SR501 → 5 В
  • GND → GND
  • OUT датчика → GPIO13 ESP32-CAM
  • Питание платы — только 5 В (3.3 В приводит к зависаниям)

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

  1. HC-SR501 выдаёт HIGH при движении
  2. GPIO13 ловит фронт → запускается захват кадра
  3. esp_camera_fb_get() → буфер с JPEG
  4. UniversalTelegramBot.sendPhotoByBinary() отправляет фото через HTTPS
  5. delay(10000) — защита от спама (10 сек между снимками)

Пример кода

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "esp_camera.h"
#include "camera_pins.h"

const char* ssid = "ТВОЯ_СЕТЬ";
const char* password = "ПАРОЛЬ";

#define BOT_TOKEN "ТОКЕН_БОТА"
#define CHAT_ID   "ID_ЧАТА_ИЛИ_КАНАЛА"

WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);

const int pirPin = 13;
int pirState = LOW;

void setup() {
  Serial.begin(115200);
  pinMode(pirPin, INPUT);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  client.setInsecure(); // Telegram без сертификатов

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer   = LEDC_TIMER_0;
  config.pin_d0       = Y2_GPIO_NUM;
  config.pin_d1       = Y3_GPIO_NUM;
  config.pin_d2       = Y4_GPIO_NUM;
  config.pin_d3       = Y5_GPIO_NUM;
  config.pin_d4       = Y6_GPIO_NUM;
  config.pin_d5       = Y7_GPIO_NUM;
  config.pin_d6       = Y8_GPIO_NUM;
  config.pin_d7       = Y9_GPIO_NUM;
  config.pin_xclk     = XCLK_GPIO_NUM;
  config.pin_pclk     = PCLK_GPIO_NUM;
  config.pin_vsync    = VSYNC_GPIO_NUM;
  config.pin_href     = HREF_GPIO_NUM;
  config.pin_sccb_sda = SIOD_GPIO_NUM;
  config.pin_sccb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn     = PWDN_GPIO_NUM;
  config.pin_reset    = RESET_GPIO_NUM;

  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  config.frame_size   = FRAMESIZE_VGA;
  config.jpeg_quality = 12;
  config.fb_count     = 1;

  if (esp_camera_init(&config) != ESP_OK) {
    Serial.println("Ошибка инициализации камеры");
    while (true);
  }
}

void sendPhoto() {
  camera_fb_t* fb = esp_camera_fb_get();
  if (!fb) return;

  bot.sendPhotoByBinary(
    CHAT_ID,
    "image/jpeg",
    fb->len,
    fb->buf,
    false,
    "Motion detected"
  );

  esp_camera_fb_return(fb);
}

void loop() {
  int val = digitalRead(pirPin);

  if (val == HIGH && pirState == LOW) {
    Serial.println("Движение обнаружено");
    pirState = HIGH;

    sendPhoto();        // делаем фото и отправляем в Telegram
    delay(5000);        // защита от спама (5 секунд)
  }

  if (val == LOW) {
    pirState = LOW;     // сброс состояния
  }

  delay(100);           // стабильность работы PIR
}
Постоянно опрашивает PIR-датчик
Реагирует только на фронт (LOW → HIGH), а не на постоянный сигнал
Делает фото и отправляет его в Telegram
Защищён от флуда задержкой
Корректно сбрасывает состояние при отсутствии движения

Разбор кода

digitalRead(pirPin) каждую секунду проверяет датчик. При первом HIGH → делаем снимок и отправляем через sendPhotoByBinary(). client.setInsecure() обязательна для Telegram. Питание 5 В — критично для стабильности.

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

  • Фото в Telegram через 2–4 секунды после движения
  • Не нужна SD-карта и извлечение
  • Работает 24/7 без компьютера
  • Разрешение до UXGA (1600×1200)
  • Легко добавить текст, время, несколько чатов
  • Полностью автономная фотоловушка

Применение

  • Охрана дома, дачи, гаража
  • Скрытое наблюдение за животными
  • Контроль детей/сотрудников
  • Умный дверной звонок с фото
  • Основа для распознавания лиц (следующий шаг)
  • Любые проекты безопасности и IoT своими руками

Заключение

ESP32-CAM + HC-SR501 + Telegram — одна из самых мощных и простых фотоловушек, которую можно собрать за вечер. Никаких проводов к компьютеру, никаких облачных подписок. Прошейте скетч, направьте камеру — и получайте фото в Telegram при любом движении!

FAQ — ESP32-CAM + HC-SR501 с отправкой фото в Telegram

Как работает фотоловушка на ESP32-CAM с HC-SR501?

Датчик движения HC-SR501 подаёт сигнал HIGH при обнаружении движения. ESP32-CAM фиксирует этот фронт на GPIO13, делает снимок через esp_camera_fb_get() и отправляет фото в Telegram с помощью UniversalTelegramBot. Весь процесс занимает 2–4 секунды, что позволяет использовать устройство как полноценную охранную систему или скрытую фотоловушку.

Можно ли питать ESP32-CAM от 3.3 В?

Нет. При питании от 3.3 В ESP32-CAM часто зависает, перезагружается или не запускает камеру. Для стабильной работы требуется питание строго 5 В с током 1–2 А. Это важнейшее условие корректной работы фотоловушки.

Для чего используется client.setInsecure() в Telegram-боте?

client.setInsecure() отключает проверку SSL-сертификатов и позволяет ESP32-CAM устанавливать HTTPS-соединение с серверами Telegram. Без этого Telegram API не принимает запросы, а фото не отправляются. Это стандартная практика при работе UniversalTelegramBot на ESP32.

Почему используется GPIO13 для подключения HC-SR501?

GPIO13 — один из свободных входов ESP32-CAM, не задействованных камерой. Его удобно использовать для цифрового сигнала PIR-датчика. Пины, занятые камерой (GPIO0, GPIO1, GPIO3 и другие), нельзя использовать для подключения HC-SR501.

Сколько времени проходит между срабатыванием датчика и получением фото?

Устройство отправляет снимок в Telegram обычно за 2–4 секунды. Задержка зависит от качества Wi-Fi, размера JPEG-кадра и нагрузки на сеть. Даже при высокой активности камера работает достаточно быстро для охранных задач.

Нужна ли SD-карта для сохранения фото?

Нет. Фото передаются напрямую в Telegram без сохранения на SD-карту. Это ускоряет работу, снижает потребление памяти и исключает необходимость доставать SD-карту для просмотра снимков. Фотоловушка работает полностью автономно.

Почему в скетче стоит delay(10000) и можно ли его убрать?

delay(10000) предотвращает спам при постоянном движении — камера делает снимки не чаще одного раза в 10 секунд. Можно изменить интервал или полностью убрать задержку, но в этом случае при частых срабатываниях датчика Telegram-чат будет получать десятки фото подряд.

Какое максимальное разрешение фото на ESP32-CAM?

ESP32-CAM AI-Thinker поддерживает разрешения до UXGA (1600×1200). В примере используется именно этот режим. Его качество оптимально для отправки в Telegram и охранных задач без перегрузки Wi-Fi-канала.

Можно ли отправлять фото в несколько Telegram-чатов одновременно?

Да. UniversalTelegramBot позволяет отправлять снимок в несколько чатов, если указать несколько CHAT_ID или выполнить последовательные вызовы sendPhotoByBinary(). Это полезно для охраны, когда фото должны получать несколько человек.

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