Камера раз на хвилину фотографує механічний лічильник води й надсилає знімок у Telegram. Зроблено для будинку, який узимку стоїть порожнім: подивитися на показання можна з телефона, не їдучи на місце.
Показання не розпізнаються автоматично — пристрій надсилає фотографію, цифри читає людина. Це свідоме спрощення: розпізнавання на самому ESP32-CAM ненадійне при поганому освітленні, а знімок дає ще й контекст — чи не тече, чи не запітніло скло.
ESP32-CAM ──> підсвітка (GPIO 4) ──> знімок ──> HTTPS ──> api.telegram.org ──> бот
^
└── Wi-Fi: налаштовується через точку доступу при першому старті
- Плата вмикає світлодіод підсвітки.
- Робить два кадри — перший відкидається. Камері потрібен один кадр, щоб відпрацювала автоекспозиція; інакше знімок виходить темним або пересвіченим.
- Другий кадр надсилається до Telegram Bot API як
multipart/form-data. - Підсвітка гасне, пауза 60 секунд, і все повторюється.
З'єднання йде по HTTPS із перевіркою кореневого сертифіката api.telegram.org
(clientTCP.setCACert), тому знімки не ходять відкритим текстом.
| Компонент | Значення |
|---|---|
| Плата | ESP32-CAM, модель AI-THINKER |
| Камера | OV2640 (штатна для цієї плати) |
| Підсвітка | штатний світлодіод, GPIO 4 |
| Живлення | 5 В, стабільні, з запасом по струму |
| Корпус | korpus_v1.0 v1.stl — друкується на FDM-принтері |
Про живлення. ESP32-CAM у момент передачі кадру дає кидок струму, і від слабкого джерела плата йде в перезавантаження по brown-out. У коді детектор brown-out вимкнений (
RTC_CNTL_BROWN_OUT_REG), що прибирає симптом, але не причину. Живіть плату нормальним блоком на 5 В / 2 А, а не від USB-порту ноутбука.
| Файл | Що це |
|---|---|
water_counter.ino |
прошивка |
korpus_v1.0 v1.stl |
модель корпусу для друку |
Прошивка.pdf |
покрокова інструкція зі заливання прошивки |
Налаштування мережі.pdf |
покрокове налаштування Wi-Fi і Telegram |
WiFiManager(tzapu)UniversalTelegramBotArduinoJsonesp_camera— входить у пакет плат ESP32
- Board: AI Thinker ESP32-CAM
- Partition Scheme: Huge APP (3MB No OTA)
- Upload Speed: 115200
ESP32-CAM не має USB — потрібен перехідник USB-UART (FTDI). Щоб зайти в режим прошивки, замкніть GPIO 0 на GND, подайте живлення, залийте скетч, приберіть перемичку й перезавантажте плату.
Детально — у Прошивка.pdf.
У коді треба вписати токен бота:
String BOTtoken = ""; // отримати в @BotFatherChat ID вписувати не треба — його вводить користувач при налаштуванні мережі.
Wi-Fi не зашитий у прошивку. При старті плата піднімає власну точку доступу:
| Параметр | Значення |
|---|---|
| SSID | MyCamera |
| Пароль | password |
Підключіться до неї з телефона, відкриється сторінка налаштування. Там треба:
- вибрати свою домашню мережу й ввести пароль до неї;
- у полі Enter your Telegram ID ввести свій ID — його підкаже бот
@myidbot.
Після цього плата під'єднається до вашої мережі й почне надсилати знімки.
Детально — у Налаштування мережі.pdf.
⚠️ Пароль точки доступу в коді стоїть буквальноpassword. Поки плата в режимі налаштування, до неї може під'єднатися будь-хто поруч. Змініть його в рядкуwm.autoConnect("MyCamera", "password")на власний.
| Що | Де | Зараз |
|---|---|---|
| Інтервал зйомки | delay(60000) у loop() |
60 секунд |
| Якість JPEG | config.jpeg_quality |
40 — менше число = краща якість |
| Роздільність | config.frame_size |
FRAMESIZE_UXGA з PSRAM |
Якщо цифри на знімку виходять нечіткими, починайте з jpeg_quality: значення 40 — це
сильний стиск. Спробуйте 10–12, кадр стане важчим, але цифри читатимуться.
Інтервал у хвилину надлишковий для лічильника води — показання так швидко не міняються.
Збільшення delay до кількох годин зменшить і трафік, і нагрів плати.
Пишу чесно, щоб не витрачали час на пошук того, чого немає.
- Команди бота не працюють. У коді є обробник
handleNewMessages()з командами/start,/photoі/flash, алеloop()не опитує Telegram, тому обробник ніколи не викликається. Знімки йдуть тільки за таймером. Щоб оживити команди, треба додати вloop()періодичний викликbot.getUpdates(). - Налаштування мережі не зберігаються між перезавантаженнями. У
setup()стоїтьwm.resetSettings(), тому після кожного ребута плата знову піднімає точку доступу й просить ввести дані. Зручно при налагодженні, незручно в роботі — приберіть цей рядок, коли пристрій стане на місце. - Немає розпізнавання цифр — за задумом, див. початок.
- Немає автономності. Пристрій живиться від мережі й не переживає вимкнення світла. Це наступне, що я хочу зробити.
- Немає сповіщень про мовчання. Якщо плата зависне або втратить Wi-Fi, ви цього не дізнаєтесь — знімки просто перестануть приходити.
- Живлення від акумулятора з реальним, а не паспортним розрахунком автономії
- Глибокий сон між знімками замість
delay() - Сповіщення «немає знімка N годин»
- Канал зв'язку, який не залежить від провайдера
- Не комітьте справжній токен бота. Токен у репозиторії = повний контроль над ботом
для будь-кого. Якщо вже закомітили — відкличте його через
@BotFatherкомандою/revoke, видалити коміт недостатньо: він лишається в історії. - Chat ID вводиться при налаштуванні й у код не потрапляє.
- Змініть пароль точки доступу з дефолтного.
Прошивка побудована на прикладі Rui Santos, RandomNerdTutorials — Telegram: ESP32-CAM Take and Send Photo.
Від оригіналу відрізняється: додано WiFiManager замість зашитих у код облікових даних
Wi-Fi, введення Telegram ID через сторінку налаштування, зйомка за таймером замість
зйомки на команду, підсвітка на час кадру та корпус під друк.
Ліцензійне повідомлення оригіналу збережене у шапці water_counter.ino.