Категории

Фотоловушка на ESP32-CAM с TPL5110: 2 часа сна → фото → спать. Работа от 18650

2025-10-03 09:04:35 | Статья из категории: IOT умный дом

Я давно хотел собрать простую IoT-фотоловушку, которая:

ESP32-CAM отлично подходит для этого, но у него высокое энергопотребление. Решение — внешний таймер TPL5110, который полностью отключает модуль между съёмками.

Почему TPL5110?

ESP32 в deep sleep всё равно потребляет ~10 мА из-за камеры и регуляторов. А TPL5110 позволяет полностью обесточить ESP32-CAM и включать его только на время съёмки.

Принцип работы:

  1. ESP32-CAM включается → делает фото → отправляет → подаёт сигнал на DONE пин TPL5110
  2. TPL5110 выключает питание
  3. Через заданное время (например, 2 часа) TPL5110 снова включает питание

Схема подключения

TPL5110                ESP32-CAM
──────────────────────────────────────
VIN      → 5V (от 18650 через TP4056+MT3608)
GND      → GND
ENABLE   → не используется (или к GND)
DELAY    → резистор для настройки времени (см. ниже)
DONE     → GPIO 4 (любой свободный пин)
──────────────────────────────────────
Камера OV2640 — уже впаяна в модуль ESP32-CAM

Настройка времени задержки: время определяется резистором между DELAY и GND. Формула:

Таймаут (сек) ≈ 110 × R (МΩ)

Для 2 часов (7200 сек):
R = 7200 / 110 ≈ 65.5 МΩ

На практике используй 62 МΩ + 3.9 МΩ последовательно (стандартные номиналы). Или подстрой потенциометром.

Важно! После отправки фото ESP32 должен подать HIGH на пин DONE → TPL5110 выключит питание.

Расчёт времени работы от 18650

Параметры:

Расход в сутки:
150 мА × (10 / 3600) ч × 12 = ~5 мА·ч/сутки

Теоретическое время работы:
3000 мА·ч / 5 мА·ч/сут = 600 дней!

Но на практике:

Реалистичная оценка: 3–6 месяцев от одной 18650.

Прошивка для ESP32-CAM

Код делает фото, отправляет его на HTTP-сервер и подаёт сигнал DONE.

#include "esp_camera.h"
#include <WiFi.h>
#include <HTTPClient.h>

// === Настройки ===
const char* ssid = "ВАШ_SSID";
const char* password = "ВАШ_ПАРОЛЬ";
const char* upload_url = "http://192.168.1.100/upload.php";

#define DONE_PIN 4  // подключён к DONE TPL5110

// === Пины камеры (для ESP32-CAM) ===
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22

void setup() {
  Serial.begin(115200);
  pinMode(DONE_PIN, OUTPUT);
  digitalWrite(DONE_PIN, LOW); // начинаем с выключенного состояния

  // Инициализация камеры
  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_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_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;

  if (psramFound()) {
    config.frame_size = FRAMESIZE_VGA;
    config.jpeg_quality = 12;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_QVGA;
    config.jpeg_quality = 15;
    config.fb_count = 1;
  }

  esp_camera_init(&config);

  // Подключение к Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  // Делаем фото
  camera_fb_t * fb = esp_camera_fb_get();
  if (fb) {
    // Отправка на сервер
    if (WiFi.status() == WL_CONNECTED) {
      HTTPClient http;
      http.begin(upload_url);
      http.addHeader("Content-Type", "image/jpeg");
      http.POST(fb->buf, fb->len);
      http.end();
    }
    esp_camera_fb_return(fb);
  }

  // Говорим TPL5110: "работа окончена — выключай!"
  digitalWrite(DONE_PIN, HIGH);
  delay(100); // убедиться, что сигнал ушёл

  // Теперь TPL5110 отключит питание
  // ESP32 больше ничего не делает
}

void loop() {
  // Ничего не делаем — всё в setup()
}

Сервер для приёма фото (PHP)

Файл upload.php на твоём сервере:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $filename = 'photo_' . date('Y-m-d_H-i-s') . '.jpg';
    $path = __DIR__ . '/photos/' . $filename;
    if (!is_dir(__DIR__ . '/photos')) mkdir(__DIR__ . '/photos', 0777, true);
    file_put_contents($path, file_get_contents('php://input'));
    echo "http://ваш-сервер/photos/$filename"; // для MQTT (опционально)
}
?>

Интеграция с Home Assistant

Если хочешь видеть фото в HA, настрой MQTT-камеру:

# configuration.yaml
mqtt:
  camera:
    - name: "Фотоловушка на заборе"
      topic: esp32cam/photo_url

А в прошивку можно добавить публикацию URL через MQTT (см. полную версию в GitHub/Gist). Но в минимальной версии — фото просто сохраняются на сервер, и ты можешь их смотреть через браузер.

Вывод

Такая фотоловушка:

Я уже поставил такую на даче — ловит енотов, птиц и соседских котов 😼

Удачи в ваших IoT-экспериментах!

Комментарии

Пока нет комментариев. Будьте первым!

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

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион