Skip to content

Repository files navigation

Фотографування лічильника води на ESP32-CAM

Камера раз на хвилину фотографує механічний лічильник води й надсилає знімок у Telegram. Зроблено для будинку, який узимку стоїть порожнім: подивитися на показання можна з телефона, не їдучи на місце.

Показання не розпізнаються автоматично — пристрій надсилає фотографію, цифри читає людина. Це свідоме спрощення: розпізнавання на самому ESP32-CAM ненадійне при поганому освітленні, а знімок дає ще й контекст — чи не тече, чи не запітніло скло.


Як це працює

ESP32-CAM  ──> підсвітка (GPIO 4) ──> знімок ──> HTTPS ──> api.telegram.org ──> бот
     ^
     └── Wi-Fi: налаштовується через точку доступу при першому старті
  1. Плата вмикає світлодіод підсвітки.
  2. Робить два кадри — перший відкидається. Камері потрібен один кадр, щоб відпрацювала автоекспозиція; інакше знімок виходить темним або пересвіченим.
  3. Другий кадр надсилається до Telegram Bot API як multipart/form-data.
  4. Підсвітка гасне, пауза 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)
  • UniversalTelegramBot
  • ArduinoJson
  • esp_camera — входить у пакет плат ESP32

Налаштування в Arduino IDE

  • 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 = "";  // отримати в @BotFather

Chat ID вписувати не треба — його вводить користувач при налаштуванні мережі.


Налаштування мережі

Wi-Fi не зашитий у прошивку. При старті плата піднімає власну точку доступу:

Параметр Значення
SSID MyCamera
Пароль password

Підключіться до неї з телефона, відкриється сторінка налаштування. Там треба:

  1. вибрати свою домашню мережу й ввести пароль до неї;
  2. у полі 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, RandomNerdTutorialsTelegram: ESP32-CAM Take and Send Photo.

Від оригіналу відрізняється: додано WiFiManager замість зашитих у код облікових даних Wi-Fi, введення Telegram ID через сторінку налаштування, зйомка за таймером замість зйомки на команду, підсвітка на час кадру та корпус під друк.

Ліцензійне повідомлення оригіналу збережене у шапці water_counter.ino.

About

Фотографування та передача показників лічильника до Telegram боту

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages