Подключаем ESP32-CAM (OV2640/OV7670) к AI-агенту ASI Biont: компьютерное зрение, распознавание объектов и автоматизация безопасности

Введение

Камеры на базе ESP32-CAM с модулями OV2640 или OV7670 — это одни из самых доступных и популярных решений для встраиваемого компьютерного зрения. Стоимость модуля начинается от $10, а возможности включают передачу JPEG-кадров по Wi-Fi, работу с MicroPython и совместимость с OpenCV. Однако главная проблема — рутинная интеграция: нужно написать код для захвата изображения, настроить передачу на сервер, реализовать логику распознавания. AI-агент ASI Biont решает эту задачу за секунды: вы просто описываете в чате, к какому устройству подключиться и что с ним делать, а агент сам генерирует и выполняет код. В этой статье мы разберём, как подключить ESP32-CAM к ASI Biont по MQTT и через HTTP API, настроить распознавание объектов, лиц и QR-кодов, а также автоматизировать сценарии умного дома и безопасности.

Как AI-агент подключается к ESP32-CAM

ESP32-CAM — это не просто камера, а полноценный микроконтроллер с Wi-Fi. Он может выступать в роли MQTT-клиента, HTTP-сервера или клиента. ASI Biont поддерживает несколько способов интеграции:

  1. MQTT — ESP32-CAM публикует изображения в топик (например, camera/esp32cam/image), а AI-агент подписывается на этот топик через paho-mqtt. Это самый надёжный и асинхронный способ для IoT.
  2. HTTP API — ESP32-CAM запускает встроенный веб-сервер, отдающий JPEG по запросу. AI-агент использует aiohttp или requests для получения кадра.
  3. SSH — если ESP32-CAM работает под управлением MicroPython или CircuitPython с включённым FTP/WebREPL, AI может подключиться по SSH (через paramiko) и выполнить скрипт захвата.
  4. Hardware Bridge (COM-порт) — для отладочных плат, где ESP32-CAM подключена к ПК через USB-UART мост (например, CP2102).

В этой статье мы сосредоточимся на двух основных сценариях: MQTT (для постоянной отправки кадров) и HTTP API (для запроса по требованию).

Сценарий 1: Умный дом — детекция движения и уведомление в Telegram

Идея

ESP32-CAM висит в прихожей, делает фото каждые 5 секунд и публикует его в MQTT-топик. AI-агент ASI Biont получает изображение, запускает модель компьютерного зрения (например, YOLOv8 через torch или onnxruntime) и, если обнаруживает человека, отправляет уведомление в Telegram с вложенным фото.

Что делает пользователь

Пользователь пишет в чате ASI Biont:

«Подключись к моему ESP32-CAM по MQTT. Камера публикует JPEG в топик camera/image. При обнаружении человека пришли фото в Telegram. Мой токен бота: 123456:ABC, chat_id: 987654. MQTT брокер: mqtt://192.168.1.100:1883.»

Что делает AI-агент

AI генерирует Python-скрипт, который выполняется в sandbox-окружении ASI Biont (через execute_python). Скрипт подключается к MQTT-брокеру, подписывается на топик camera/image, получает бинарные данные JPEG, декодирует их через PIL.Image, прогоняет через ONNX-модель YOLOv8 (загруженную из Hugging Face Hub), и при обнаружении класса "person" отправляет фото в Telegram через requests.post.

Пример кода, который генерирует AI (для sandbox):

import paho.mqtt.client as mqtt
import numpy as np
import onnxruntime as ort
from PIL import Image
import requests
import io
import json

TELEGRAM_TOKEN = "123456:ABC"
CHAT_ID = "987654"
MQTT_BROKER = "192.168.1.100"
MQTT_PORT = 1883
TOPIC = "camera/image"

# Загружаем модель YOLOv8 (предварительно скачанную в sandbox)
session = ort.InferenceSession("yolov8n.onnx")
input_name = session.get_inputs()[0].name

def send_telegram_photo(photo_bytes, caption="Обнаружен человек!"):
    url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendPhoto"
    files = {'photo': ('photo.jpg', photo_bytes, 'image/jpeg')}
    data = {'chat_id': CHAT_ID, 'caption': caption}
    requests.post(url, files=files, data=data)

def on_message(client, userdata, msg):
    image_bytes = msg.payload
    img = Image.open(io.BytesIO(image_bytes))
    img_resized = img.resize((640, 640))
    input_tensor = np.array(img_resized).astype(np.float32) / 255.0
    input_tensor = np.transpose(input_tensor, (2, 0, 1))[np.newaxis, ...]

    outputs = session.run(None, {input_name: input_tensor})
    detections = outputs[0][0]

    for det in detections:
        if det[4] > 0.5 and int(det[5]) == 0:  # класс 0 = person
            send_telegram_photo(image_bytes)
            break

client = mqtt.Client()
client.on_message = on_message
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.subscribe(TOPIC)
client.loop_start()
# Важно: не while True, а loop_start() — таймаут 30 секунд
import time
time.sleep(25)
client.loop_stop()

Результат: В Telegram приходит фото с подписью «Обнаружен человек!».

Почему это выгодно

  • Не нужно писать код вручную — AI генерирует его за секунду.
  • Можно менять модель распознавания одной фразой: «Используй MobileNet SSD вместо YOLO».
  • Легко масштабировать: добавить ещё 5 камер — AI адаптирует скрипт.

Сценарий 2: Промышленная безопасность — распознавание QR-кодов и лиц

Идея

На проходной завода установлен ESP32-CAM, который сканирует QR-коды с пропусков и делает фото лица. AI-агент ASI Biont по HTTP запрашивает кадр, распознаёт QR-код через pyzbar (доступен в sandbox как часть PIL + numpy), сверяет с базой данных сотрудников (PostgreSQL) и открывает шлагбаум по Modbus TCP.

Что делает пользователь

«Камера на проходной отдаёт JPEG по http://192.168.1.200/capture. При распознавании QR-кода проверь код в таблице employees (поле qr_code) в PostgreSQL на 10.0.0.1:5432, база factory, пользователь admin, пароль pass. Если сотрудник найден, отправь команду write_coil 0x0001 True на PLC по Modbus TCP 10.0.0.2:502.»

Что делает AI-агент

AI генерирует скрипт, который:
1. По HTTP запрашивает JPEG с ESP32-CAM.
2. Декодирует QR-код через pyzbar.
3. Подключается к PostgreSQL через psycopg2 и ищет запись.
4. Если найден — через industrial_command с протоколом modbus отправляет команду write_coil.

Пример кода:

import requests
from PIL import Image
from pyzbar.pyzbar import decode
import psycopg2
import io

# Шаг 1: захват изображения
resp = requests.get("http://192.168.1.200/capture", timeout=5)
img = Image.open(io.BytesIO(resp.content))

# Шаг 2: распознавание QR-кода
qr_codes = decode(img)
if not qr_codes:
    print("QR-код не найден")
    exit()
qr_data = qr_codes[0].data.decode()
print(f"Распознан QR: {qr_data}")

# Шаг 3: проверка в БД
conn = psycopg2.connect(
    host="10.0.0.1",
    port=5432,
    dbname="factory",
    user="admin",
    password="pass"
)
cur = conn.cursor()
cur.execute("SELECT name FROM employees WHERE qr_code = %s", (qr_data,))
row = cur.fetchone()
if row:
    print(f"Сотрудник {row[0]} найден, открываем шлагбаум")
    # Команда через industrial_command (tool call, не Python-функция)
    # В sandbox это будет выглядеть как вызов tools
    # industrial_command(protocol='modbus', command='write_coil', args={'unit_id': 1, 'address': 1, 'value': True})
else:
    print("Доступ запрещён")

Результат: Шлагбаум открывается автоматически после сканирования пропуска.

Сценарий 3: Автоматизация умного дома — управление светом по жестам

Идея

ESP32-CAM с OV7670 (низкое разрешение, но высокая скорость) снимает видео 30 кадров/с. AI-агент через MQTT получает кадры и определяет жест руки (например, поднятая ладонь — включить свет, кулак — выключить). Команда отправляется на ESP32 с реле через MQTT publish.

Что делает пользователь

«Подключись к ESP32-CAM по MQTT (топик camera/frame). При обнаружении жеста "открытая ладонь" отправь команду relay/control = ON, при жесте "кулак" — OFF. MQTT брокер тот же.»

Что делает AI-агент

AI использует предобученную модель MediaPipe Hands (доступна через opencv-python и mediapipe в sandbox). Скрипт подписывается на топик, декодирует кадр, определяет landmarks, классифицирует жест и публикует команду.

Пример кода:

import paho.mqtt.client as mqtt
import cv2
import mediapipe as mp
import numpy as np
import io

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()

def classify_gesture(landmarks):
    # Простая логика: если все пальцы разжаты — ладонь, если сжаты — кулак
    tips = [4, 8, 12, 16, 20]
    extended = 0
    for tip in tips:
        if landmarks[tip].y < landmarks[tip - 2].y:
            extended += 1
    if extended >= 4:
        return "PALM"
    elif extended <= 1:
        return "FIST"
    return "UNKNOWN"

def on_message(client, userdata, msg):
    img = cv2.imdecode(np.frombuffer(msg.payload, np.uint8), cv2.IMREAD_COLOR)
    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb)
    if result.multi_hand_landmarks:
        gesture = classify_gesture(result.multi_hand_landmarks[0].landmark)
        if gesture == "PALM":
            client.publish("relay/control", "ON")
        elif gesture == "FIST":
            client.publish("relay/control", "OFF")

mqtt_client = mqtt.Client()
mqtt_client.on_message = on_message
mqtt_client.connect("192.168.1.100", 1883, 60)
mqtt_client.subscribe("camera/frame")
mqtt_client.loop_start()
import time
time.sleep(20)
mqtt_client.loop_stop()

Как подключить ESP32-CAM к ASI Biont: пошаговая инструкция

  1. Установите библиотеки на ESP32-CAM. Если используете MicroPython, загрузите прошивку с поддержкой Wi-Fi и MQTT (например, umqtt.simple). Пример прошивки и скетча для Arduino IDE можно найти в официальной документации Espressif.
  2. Настройте камеру. В скетче укажите SSID и пароль Wi-Fi, а также топик MQTT или URL для HTTP.
  3. Запустите bridge.py. Скачайте bridge.py из дашборда ASI Biont (Devices → Create API Key → Скачать bridge). Запустите с параметрами:
    python bridge.py --token=ВАШ_ТОКЕН --ports=COM3 --baud 115200
    Bridge обеспечит связь между ASI Biont и вашим ПК, если вы используете COM-порт для отладки.
  4. Опишите задачу в чате ASI Biont. Например:

    «Подключись к моему ESP32-CAM по HTTP: http://192.168.1.200/capture. Получай изображение каждые 10 секунд и проверяй, есть ли в кадре кошка. Если есть — отправь мне в Telegram.»

  5. AI сгенерирует и выполнит код. Всё происходит автоматически.

Почему ASI Biont — это удобно

  • Без кода. Вы не пишете интеграцию — AI пишет её за вас.
  • Гибкость. Подключайте любые камеры: USB-вебкамеры через OpenCV, IP-камеры через RTSP, ESP32-CAM через MQTT.
  • Безопасность. Код выполняется в изолированном sandbox, а bridge работает только на вашем ПК.
  • Мгновенная автоматизация. Один запрос в чате — и система готова.

Заключение

ESP32-CAM с OV2640 или OV7670 — это мощный и дешёвый инструмент для компьютерного зрения. В паре с AI-агентом ASI Biont он превращается в интеллектуальную систему безопасности, умного дома или промышленного контроля. Вам не нужно писать десятки строк кода — достаточно описать задачу на естественном языке. Попробуйте интеграцию на asibiont.com и автоматизируйте свои устройства уже сегодня.

← Все статьи

Комментарии