INEMA.SOLUÇÕES
Solução 4 · Vigilância

Câmera que avisa só quando aparece uma pessoa

A ESP32-CAM (ou uma webcam USB) manda a imagem pelo Wi-Fi. No seu computador, um modelo de IA chamado YOLO procura pessoas na imagem e ignora gato, carro e galho balançando. Quando alguém entra na zona que você marcou, ele salva a foto e avisa. Tudo roda na sua casa, sem nuvem.

Kit R$ 60–150 por câmeraDificuldade: médiaPrecisa de um computador
Câmera tem regra. Coloque uma placa avisando que o lugar tem câmera. Não aponte para a rua, para a casa do vizinho nem para banheiro e quarto. Não grave nem publique o rosto de ninguém sem permissão, e apague as fotos no fim do dia. As regras completas estão em Privacidade.

Como funciona

A câmera filma, o computador decide

Câmera filma Computador roda o YOLO Tem pessoa na zona? Sim Não ESP32-CAM ou webcam, pelo Wi-Fi procura pessoas em cada quadro centro da pessoa dentro da área em 5 quadros seguidos? salva foto e avisa continua olhando
Os números (5 quadros, 60 s entre alertas, confiança 0,5) são pontos de partida. Você ajusta depois dos testes.

Um sensor de movimento comum dispara com qualquer coisa que esquenta ou mexe. O YOLO foi treinado para reconhecer objetos e devolve uma caixa em volta de cada pessoa que encontra. O programa só considera a pessoa que está dentro da zona que você marcou, e só dispara se ela continuar lá por alguns quadros. Isso corta a maioria dos alarmes falsos.

Peças

Lista de compras

PeçaPara que servePreço aprox.
ESP32-CAM AI-Thinker com câmera OV2640Filma e manda a imagem pelo Wi-FiR$ 40–70
Placa ESP32-CAM-MB ou adaptador FTDI (FT232RL)Grava o programa na ESP32-CAM pelo USBR$ 15–30
Fonte 5 V de pelo menos 1 A (carregador de celular serve)Alimenta a câmera. Fonte fraca é a causa nº 1 de travamentoR$ 0–30
Jumpers fêmea-fêmeaLigação com o FTDIR$ 5–10
Total por câmeraR$ 60–150
Alternativa: webcam USBLigada direto no computador, sem ESP32-CAMR$ 60–120
Computador ou mini PCRoda o YOLO. Qualquer notebook recente serve para começarfora do kit

Preços aproximados de loja online brasileira em outubro de 2026, a conferir antes de comprar. Não inclui caixa de acabamento nem suporte de parede.

Ligação

Gravar o programa na ESP32-CAM

A ESP32-CAM não tem entrada USB. Para gravar o programa, você liga um adaptador FTDI nos pinos da placa. Depois de gravada, ela só precisa de 5 V e GND.

FTDI jumper em 5V ESP32-CAM VCC GND TX RX 5V GND U0R · GPIO 3 U0T · GPIO 1 IO0 · GPIO 0 Tracejado: IO0 no GND só para gravar. Tire o fio e aperte RST para rodar.
Os fios cruzam: TX do adaptador vai no U0R (recebe) da câmera e RX vai no U0T (envia).
Adaptador FTDIESP32-CAMQuando
VCC (jumper em 5 V)5Vsempre
GNDGNDsempre
TXU0R (GPIO 3)só para gravar
RXU0T (GPIO 1)só para gravar
fio entre IO0 (GPIO 0) e GND da câmerasó durante a gravação
Caminho mais fácil: a placa ESP32-CAM-MB encaixa embaixo da câmera, tem entrada USB e botão IO0. Você não liga fio nenhum: segura IO0, aperta RST e grava.

Passo a passo

Da caixa ao primeiro alerta

  1. Prepare a Arduino IDE. Instale a Arduino IDE 2 e, em Gerenciador de Placas, o pacote "esp32" (Espressif). Escolha a placa "AI Thinker ESP32-CAM".
  2. Abra o exemplo pronto. Em Arquivo › Exemplos › ESP32 › Camera, abra "CameraWebServer". No arquivo principal, deixe ativa só a linha #define CAMERA_MODEL_AI_THINKER e escreva o nome e a senha da sua rede.
  3. Grave. Ligue o FTDI como no diagrama, com IO0 no GND. Aperte RST, clique em Carregar e espere o "Done uploading". Tire o fio do IO0 e aperte RST de novo.
  4. Ache o endereço. No Monitor Serial (115200) aparece "Camera Ready! Use http://192.168.0.60". Abra no navegador, clique em Start Stream e ajuste a resolução (VGA é um bom começo).
  5. Feche o navegador. A ESP32-CAM manda o vídeo para um cliente por vez. O endereço do vídeo é o mesmo IP com :81/stream no fim.
  6. Prepare o Python no computador. Instale o Python 3 e rode pip install ultralytics opencv-python. Na primeira execução o programa baixa o modelo yolov8n.pt (cerca de 6 MB). Depois disso a detecção roda sem internet.
  7. Rode o vigia. Troque o IP no código, rode python vigia.py e passe na frente da câmera. A janela mostra a zona em vermelho e a caixa em volta de você. Aperte Q para sair.

Código

Python + YOLO no computador

Salve como vigia.py. A zona é marcada em frações da imagem (0 a 1), então funciona em qualquer resolução. Para usar webcam USB, troque FONTE por 0.

# vigia.py — avisa quando aparece pessoa
# Instale com:
# pip install ultralytics opencv-python
import os, time
from datetime import datetime
import cv2
from ultralytics import YOLO

# ESP32-CAM pelo Wi-Fi (troque o IP)
FONTE = "http://192.168.0.60:81/stream"
# webcam USB: FONTE = 0

# Zona: (esquerda, topo, direita,
# base)
# em frações da imagem, de 0 a 1
ZONA = (0.2, 0.2, 0.9, 1.0)
# quadros seguidos com pessoa
QUADROS = 5
# segundos mínimos entre dois alertas
INTERVALO = 60
PASTA = "alertas"

os.makedirs(PASTA, exist_ok=True)
# baixa o modelo na 1ª vez; roda local
modelo = YOLO("yolov8n.pt")
cam = cv2.VideoCapture(FONTE)
seguidos, ultimo = 0, 0.0


def na_zona(caixa, larg, alt):
    # o centro da pessoa está na zona?
    x1, y1, x2, y2 = caixa
    cx = (x1 + x2) / 2 / larg
    cy = (y1 + y2) / 2 / alt
    e, t, d, b = ZONA
    return e <= cx <= d and t <= cy <= b


def avisar(foto):
    # Para o celular, use um bot SEU.
    # Leia o token com os.environ,
    # nunca escreva o token aqui.
    print("ALERTA: pessoa", foto)


while True:
    ok, quadro = cam.read()
    if not ok:
        # caiu: espera e reconecta
        time.sleep(2)
        cam = cv2.VideoCapture(FONTE)
        continue
    alt, larg = quadro.shape[:2]
    # classe 0 = pessoa; confiança 0,5
    res = modelo(quadro, classes=[0],
                 conf=0.5,
                 verbose=False)[0]
    caixas = res.boxes.xyxy.tolist()
    achou = any(na_zona(c, larg, alt)
                for c in caixas)
    if achou:
        seguidos += 1
    else:
        seguidos = 0

    tela = res.plot()
    e, t, d, b = ZONA
    p1 = (int(e * larg), int(t * alt))
    p2 = (int(d * larg), int(b * alt))
    # zona em vermelho
    cv2.rectangle(tela, p1, p2,
                  (0, 0, 255), 2)

    agora = time.time()
    espera = agora - ultimo > INTERVALO
    if seguidos >= QUADROS and espera:
        ultimo = agora
        # nome = AAAAMMDD-HHMMSS
        f_ = "%Y%m%d-%H%M%S"
        nome = datetime.now().strftime(f_)
        foto = f"{PASTA}/{nome}.jpg"
        cv2.imwrite(foto, tela)
        # registro para o resumo do dia
        reg = PASTA + "/registro.csv"
        with open(reg, "a") as f:
            f.write(nome + "\n")
        avisar(foto)

    cv2.imshow("vigia", tela)
    if cv2.waitKey(1) == ord("q"):
        break

cam.release()
cv2.destroyAllWindows()

Limpeza do fim do dia. Agende para rodar às 23h59 (cron no Linux e no Mac, Agendador de Tarefas no Windows):

# limpa.py — apaga as fotos do dia
import glob, os

for f in glob.glob("alertas/*.jpg"):
    os.remove(f)
print("fotos apagadas")

A camada de IA

O que a IA faz neste projeto

Detecção de pessoa, local

O YOLO roda no seu computador. A imagem não sai da sua rede e você não paga nada por mês.

Zonas proibidas

Você marca a área que importa (portão, porta dos fundos, depósito). Quem passa na calçada fora da zona não dispara alerta.

Resumo do dia

Um script conta os alertas por hora e pede a um modelo de IA um resumo em português: "três alertas, todos entre 7 h e 8 h, horário de entrega".

Resumo do dia. Só os números saem do programa, nunca as fotos:

# resumo.py — alertas por hora, em texto
import collections, datetime

hoje = datetime.date.today()
hoje = hoje.strftime("%Y%m%d")
por_hora = collections.Counter()
for linha in open("alertas/registro.csv"):
    nome = linha.strip()
    if nome.startswith(hoje):
        # nome = AAAAMMDD-HHMMSS
        por_hora[nome[9:11] + "h"] += 1

prompt = (
    "Alertas de pessoa por hora, hoje: "
    + str(dict(sorted(por_hora.items())))
    + ". Escreva um resumo do dia em "
    "português, em até 4 frases, e aponte "
    "horários fora do comum."
)
print(prompt)
# Mande só este texto ao modelo:
# - de preferência um modelo local no PC,
#   sem chave nenhuma; ou
# - o serviço de IA da sua conta, com a
#   SUA chave numa variável de ambiente.
# Nunca envie as fotos para fora.
Chave e token são como senha. Nunca escreva chave de IA ou token de bot dentro do código nem em arquivo que vai para o GitHub. Guarde numa variável de ambiente do computador e siga a documentação do serviço que você escolheu.

Teste e melhore

Confira antes de mostrar para alguém

Checklist
  • Você entra na zona e o alerta sai uma vez só, com a foto na pasta alertas.
  • Você fica parado na zona e o segundo alerta só sai depois de 60 s.
  • Um gato, um carro ou uma árvore na imagem não disparam nada.
  • Quem passa fora da zona vermelha não dispara nada.
  • O limpa.py apaga as fotos e a placa de aviso está visível.
Erro comumCausa provávelComo resolver
"Brownout detector was triggered"Fonte fraca ou cabo fino e compridoFonte 5 V de pelo menos 1 A, cabo curto, ligada no pino 5V (não no 3V3)
"Failed to connect" ao gravarIO0 sem ligar no GND, ou TX e RX sem cruzarLigue IO0 no GND, aperte RST, confira TX → U0R e RX → U0T
Python não abre o vídeoNavegador ainda aberto no streamFeche a aba: a câmera atende um cliente por vez
Imagem lenta, poucos quadrosResolução alta ou computador fracoBaixe para VGA ou QVGA na página da câmera
Alerta com foto de cartaz ou TVO YOLO vê pessoa em imagem tambémTire a TV da zona ou suba conf para 0,6
Não detecta nada à noiteA ESP32-CAM não enxerga no escuroDeixe uma luz acesa na área ou use câmera com infravermelho

Caderno de testes. Cada vez que mudar alguma coisa, anote numa linha. Conte alarmes falsos e alarmes perdidos: esse número é o seu argumento de venda.

DataVersãoO que mudouResultado
20/10v1Imagem inteira, 1 quadro bastaAlerta com cada pessoa que passou na calçada
21/10v2Zona só no portão, 5 quadros seguidosSó alertas de quem entrou de verdade
…v3Resumo do dia com IAAnote aqui

Privacidade e segurança

Regras da câmera

Avise e peça permissão. Coloque uma placa "ambiente com câmera" bem visível. Instale só onde o dono do lugar autorizou, e conte para quem mora ou trabalha ali.
Aponte só para o que é do cliente. Nada de rua, casa do vizinho, banheiro, quarto ou vestiário. Use a zona para olhar só o portão ou a porta.
Não guarde, não publique. Não grave vídeo contínuo, não poste foto de ninguém e não mande imagem para fora da rede. Rode o limpa.py todo dia. A LGPD (Lei Geral de Proteção de Dados) trata imagem de rosto como dado pessoal, e quem instala responde pelo uso.
Eletricidade. A câmera usa 5 V de um carregador. Puxar fio da tomada, mexer no quadro ou ligar sirene de 127/220 V: só um adulto ou professor faz, com a energia desligada.

Ficha de negócio

Como vender a câmera

Quem compraComércio pequeno (depósito, fundos da loja), condomínio (portão, garagem), sítio e chácara (galpão, porteira)
Custo do kitR$ 60–150 por câmera (lista acima, a conferir). O computador pode ser um notebook antigo do cliente
Preço sugeridoR$ 200–350 por câmera instalada e configurada (sugestão)
Mão de obra2 a 3 horas: instalar, marcar as zonas com o cliente, configurar o alerta e a limpeza diária
Assinatura opcionalR$ 20–40 por mês: ajuste das zonas, manutenção e resumo semanal (sugestão)
Argumento de economiaSem mensalidade de nuvem e menos alarme falso. Prove: deixe um sensor de movimento comum e a câmera com YOLO lado a lado por uma semana e conte os alertas falsos de cada um
Mais de uma câmera? O mesmo computador lê várias câmeras. Rode um vigia.py para cada uma, com IP e pasta diferentes, e venda por ponto vigiado.

Para ir além

Próximos passos

Para entender como um modelo enxerga e decide, siga o curso Visão e ação (VLA). Para a base de IA, comece pelo IA do zero. Todos os cursos são abertos e gratuitos no INEMA.CLUB.