Я давно хотел собрать простую IoT-фотоловушку, которая:
ESP32-CAM отлично подходит для этого, но у него высокое энергопотребление. Решение — внешний таймер TPL5110, который полностью отключает модуль между съёмками.
ESP32 в deep sleep всё равно потребляет ~10 мА из-за камеры и регуляторов. А TPL5110 позволяет полностью обесточить ESP32-CAM и включать его только на время съёмки.
Принцип работы:
DONE
пин TPL5110TPL5110 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 МΩ последовательно (стандартные номиналы). Или подстрой потенциометром.
DONE
→ TPL5110 выключит питание.
Параметры:
Расход в сутки:
150 мА × (10 / 3600) ч × 12 = ~5 мА·ч/сутки
Теоретическое время работы:
3000 мА·ч / 5 мА·ч/сут = 600 дней!
Но на практике:
Реалистичная оценка: 3–6 месяцев от одной 18650.
Код делает фото, отправляет его на 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()
}
Файл 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 (опционально)
}
?>
Если хочешь видеть фото в HA, настрой MQTT-камеру:
# configuration.yaml
mqtt:
camera:
- name: "Фотоловушка на заборе"
topic: esp32cam/photo_url
А в прошивку можно добавить публикацию URL через MQTT (см. полную версию в GitHub/Gist). Но в минимальной версии — фото просто сохраняются на сервер, и ты можешь их смотреть через браузер.
Такая фотоловушка:
Я уже поставил такую на даче — ловит енотов, птиц и соседских котов 😼
Удачи в ваших IoT-экспериментах!
Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.
Если у вас есть вопросы, или Нашли неточность? пишите в коментах —
вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!