Criar um sistema de vigilância pode ser algo bem útil, pois podemos utilizá-lo para vigiar a entrada de uma casa, a garagem ou até mesmo criar um timelapse de algum cenário. Portanto, neste post vou mostrar como criar um sistema de vigilância caseiro com um ESP32 gastando menos de R$100.

Informações básicas

O que é o projeto

O sistema que vou mostrar envolve o monitoramento visual de um determinado local por meio de uma câmera conectada via Wi-Fi. A essência do funcionamento é um módulo ESP32-CAM. Uma desvantagem do sistema é que a câmera só poderá ser acessada por alguém que estiver dentro da mesma rede Wi-Fi da câmera.

Não sei se o termo CFTV está adequado para o projeto, pois não conheço a definição exata dele. Mas a ideia de utilizar ele é fazer referência a um sistema de vigilância doméstica.

De toda forma, vou mostrar duas formas de fazer o projeto: alimentado pela rede e movido a energia solar. Infelizmente, não tive muito sucesso com o segundo caso por conta do alto consumo do ESP32, mas vou deixar dicas sobre como resolver.

Aplicações

Embora o sistema de CFTV remeta a ideia de segurança, o projeto mostrado aqui pode ir além disso. Vejamos alguns exemplos:

  • Monitorar o crescimento de plantas.
  • Embutir a ideia em um projeto de robótica.
    • Carrinho com câmera por exemplo.
  • Monitorar uma máquina.

Alternativas

Você consegue encontrar alguns produtos que são relativamente baratos (acima de R$100) e que também têm a função de monitoramento visual. Os mais comuns são as “lampadas câmera”, que inclusive podem ser acessadas externamente via aplicativo.

Essas alternativas podem parecer melhores, mas o projeto aqui, além de ser mais barato, te permite customizar a câmera para ela fazer o que você quiser. Isso, porque utilizaremos um ESP32 que pode ser programado de acordo com sua vontade.

Configurando o ESP32

Para o caso desse projeto, o ideal é comprar a placa ESP32-CAM, que já vem com as conexões da câmera e com o conector adequado. No meu caso, eu comprei um kit que veio o ESP32-CAM, uma câmera OV2640 e um gravador USB chamado ESP32-CAM MB. Acabei pagando R$30 no kit (sem frete).

Por conta disso, o requisito inicial do projeto é ter o ESP32-CAM com uma câmera. Você também pode usar um “conversor USB para TTL” como gravador. Entretanto, o ESP32-CAM MB é bem simples e direto de usar.

Ajustando IDE do Arduino

O primeiro passo é configurar a IDE do Arduino para que ela aceite os códigos do ESP32 e para que ela possa programá-lo. Sendo assim, siga os passos:

  1. Dentro da IDE, vá no menu “Arquivo” -> “Preferências”
  2. Clique no campo “URL’s adicionais para gerenciadores de placas” e insira o seguinte link:
    • https://dl.espressif.com/dl/package_esp32_index.json
  3. Clique em “OK” e volte à IDE.
  4. Acesse o menu “Ferramentas” > “Placas” > “Gerenciador de Placas”.
  5. Na janela que aparecer, role para baixo até encontrar “ESP32”, clique nessa opção e clique em instalar.
  6. Quando a instalação estiver completa, será possível escolher as placas ESP32 no menu “Ferramentas” > “Placa”.
  7. Acesse o menu “Ferramentas” > “Placas” > “ESP32” e role para baixo até encontrar “ESP32 Wrover Module”.
    • Existe uma opção para o ESP32-CAM, mas ela nos limita em relação as configurações possíveis.
  8. Acesse o menu “Ferramentas” > “Esquema de partição” ou “Partition Scheme” e selecione “Minimal SPIFFS (1.9MB APP with OTA)”.
    • Não tenho certeza se o nome em português está correto.
    • Esse particionamento nos permite gravar o ESP32 à distância (OTA).

Pronto, agora é só pegar o código e gravar no seu ESP32.

Obs: No Linux, tive problemas com o driver do CH340, que é o CI conversor na placa ESP32-CAM MB. Se for o seu caso, apenas pesquise pelo driver dele no Google que facilmente você encontrará bons tutoriais ensinando a instalar um driver adequado.

Código base

O programa base que utilizei para criar o código final é o que pode ser encontrado nos exemplos: “Arquivo” -> “Exemplos” -> “ESP32” -> “Camera” -> “CameraWebServer”. Se você nunca mexeu com o ESP32, recomendo rodar esse código primeiro para se familiarizar.

O código final é praticamente idêntico ao do exemplo. A diferença é que removi as funcionalidades de detecção e reconhecimento de faces para deixar o código mais leve. Além disso, resolvi traduzir e esclarecer alguns dos textos da página que utilizamos para acessar a câmera. No tópico seguinte, comento sobre isso.

Sem remover o trecho que faz o reconhecimento facial, o código pesaria pouco mais de 2,5 MB, o que impossibilitaria a utilização da gravação à distância, já que no esquema de partição escolhido, o APP pode ter no máximo ~2 MB. E a gravação à distância é um recurso muito útil na minha opinião, pois o sistema ficará montado dentro de uma caixinha e o ideal é que você não precise abri-lo para atualizar ou modificar o código.

Também, eu não tinha pretensão de utilizar o reconhecimento facial no sistema. Por conta disso, o programa final ficou pesando pouco menos de 1MB. Seria possível reduzir mais ainda, mas resolvi manter algumas partes para o caso de algum leitor do site utilizar um ESP32 com uma câmera diferente da OV2640.

Modificando página HTML

Conforme disse acima, resolvi modificar o web server traduzindo e ajustando alguns textos. Este processo foi um pouco complicadinho, porque o arquivo html do web server fica armazenado em formato comprimido GZIP dentro do arquivo “camera_index.h”.

É possível obter o código html simplesmente abrindo o web server e pedindo para o navegador salvar o html da página. Entretanto, ao fazermos as modificações, precisamos voltar o código para o formato comprimido. Isso é altamente desejado, porque um código com ~26 mil caracteres é reduzido à ~4 mil. Ou seja, economizamos bastante espaço.

Felizmente, esse processo não é muito difícil, pois, podemos utilizar as ferramentas deste site para fazer a conversão diretamente. Esse site também pode ser usado para o processo contrário: converter o código comprimido em um código html.

Resolvi descrever o processo acima para o caso de alguém querer mudar o html também.

OTA

Para incluir a atualização à distância no código base, acabei recorrendo a uma gambiarra. Isso, porque o web server com as funcionalidades da câmera foi criado com uma biblioteca diferente da padrão e não consegui embutir o código de atualização nela. Então, criei a página de atualização da forma padrão e acabei criando “um novo webserver” em cima do que já tinha. Por conta disso, o web server pode retornar uma mensagem de “erro” (“não encontrado”) algumas das vezes que você tentar acessar ele.

De toda forma, é só insistir no acesso que uma hora funciona. E pode acontecer isso principalmente na hora de subir o código novo na página de atualização (IP_ESP32/update). Das vezes que tentei subir um programa novo, a página me retornou um erro falando que o cabeçalho é muito grande para o servidor interpretar. Se isso acontecer, é só apertar F5 e a página vai perguntar se você quer reenviar o formulário. Você confirma e o código deve começar a ser enviado sem problemas.

Código completo

O código completo pode ser baixado neste link do GitHub. Adiante estão algumas informações úteis que você pode precisar:

  • Você precisa inserir o nome e rede da sua senha nos parâmetros “NET_ID” e “NET_PASS” que estão no início do código.
  • Utilize um aplicativo de análise de rede para descobrir qual o IP do dispositivo.
    • No meu PC eu utilizo o Angry IP Scanner.
  • Para atualizar o ESP32 à distância, utilize o link “IP_DO_DISPOSITIVO/update”.
    • Observações estão no tópico anterior.
  • Teoricamente o ESP32 também pode ser acessado digitando “http://camera.local/” no navegador.
    • Você pode mudar o nome de “camera” para outro, modificando o parâmetro “HOST” no início do código. 
    • Na minha casa tem um repetidor Wi-Fi, e não consegui acessar dessa forma quando o ESP32 se conectou a ele. Mas, quando o ESP32 se conectou ao roteador principal, deu certo.
  • É possível obter uma captura da câmera acessando o link “IP_ESP32/capture”.
  • É possível acessar o vídeo diretamente acessando o link: “IP_ESP32:81/stream”.
    • Não é possível existir mais de 1 acesso simultâneo ao vídeo. A titulo de curiosidade, este link mostra um programa que corrige isso e aceita até 10 conexões simultâneas.

ESP32 ligado na rede

AVISO: Esta seção mostra uma montagem que envolve conexões com a rede elétrica. Portanto, tenha em mente que esta tarefa é perigosa e pode causar acidentes, os quais eu não me responsabilizo. Se você for seguir o tutorial, tome bastante cuidado e opte por fazer as conexões com a rede desligada.

Componentes

Para este projeto, você vai precisar dos seguintes componentes:

  • ESP32-CAM, câmera apropriada e gravador.
    • Gastei R$30.
  • Fonte para converter tensão da rede para 3,3V ou 5V.
    • Utilizei uma fonte pequenininha chamada HLK-PM03 de 3,3V (gastei R$10).
  • 4 fios para fazer as ligações.
    • Reaproveitei fios de outros dispositivos, então não gastei com isso.
  • Material para fazer uma caixinha.
    • Resolvi fazer a estrutura em impressora 3D. Como a caixa é pequena, o custo também é baixo.

Custo total (no meu caso): R$40.

Circuito

O circuito é bem simples e direto, pois é necessário apenas ligar o HLK-PM03 na rede (2 fios) e depois no ESP32-CAM (2 fios). Veja o esquemático abaixo:

Esquemático do ESP32 ligado na rede

Como o HLK-PM03 fornece 3,3V, pude ligar a saída dele direto no 3,3V do ESP32. Se você for utilizar uma fonte de 5V ligada na tomada (tipo fonte de celular), ela precisaria ser ligada no 5V do ESP32. Tenha em mente também que a fonte precisa ser capaz de fornecer 1A para um bom funcionamento do dispositivo. O porquê disso está explicado no projeto movido a energia solar.

Estrutura

Conforme comentei, resolvi fazer a estrutura na impressora 3D. Para isso, utilizei o Tinkercad e o link para acesso é este. No link estão as estruturas para o projeto alimentado via rede e via energia solar.

Ela é bem simples, pois apenas acomoda o ESP32 e o HLK-PM03. A estrutura possui uma tampa deslizante para facilitar a montagem e os componentes podem ser apenas encaixados.

Um detalhe importante é que a tampa possui um furo para a câmera e, para evitar que água ou poeira entre na caixa pelo furo, recortei uma tira de plástico de uma garrafa PET e coloquei na parte externa da tampa. Utilizei uma super cola para fixar a tira de plástico e depois silicone para vedar as extremidades. Você também pode utilizar o silicone para vedar os outros pontos da caixa, caso ela for ficar exposta no tempo.

Montagem

Simplificadamente estes são os passos da montagem:

  1. Crie a estrutura.
  2. Posicione os componentes na estrutura.
  3. Solde os fios e faça as ligações conforme esquemático.
    • Deixe a ligação com a rede por último, já que ela não exige soldagem. E lembre-se de desligar a energia antes de mexer. No meu caso, apenas emendei a fase e o neutro nos fios de entrada do HLK-PM03.
  4. Posicione a caixinha no local desejado.
    • Você pode utilizar fita dupla face (mais prático) ou criar furos na caixa e parafusar ela.
  5. Tampe a caixinha e vede de acordo com dicas no tópico anterior.

Resultados

Após seguir os passos da montagem, estes foram os resultados que obtive:

ESP32 montado na caixinha
ESP32 CFTV finalizado

A caixinha ficou montada em cima de um apagador inutilizado que tinha na frente da casa. Felizmente, esse apagador tinha um fio para fase e outro para neutro, o que facilitou bastante a montagem.

No início, a ideia era passar os fios ligados à rede na lateral da caixa. Mas depois eles foram passados na parte de trás da caixa.

Por fim, restou apenas acessar o IP da câmera e verificar se o projeto estava funcionando. Para isso, usei um celular velho, fixei na parede com fita dupla face e deixei ele conectado no web server da câmera. Veja abaixo:

CFTV em funcionamento

ESP32 movido a energia solar

Componentes

Para este projeto, você vai precisar dos seguintes componentes:

  • ESP32-CAM, câmera apropriada e gravador.
    • Gastei R$30.
  • Painel solar 5V com potência acima de 1W ou corrente acima de 200 mA.
    • Gastei R$33. Entretanto, acho que o painel que comprei fornece 0,5 W, apesar de ter sido anunciado como 1 W.
  • Opcional: diodo schottky (optei por não colocar).
    • Preço: R$0,50.
  • Bateria de lítio 3,7V (exemplo: 18650) com alta capacidade (acima de 2000mAh).
    • Gastei R$20.
  • Suporte p/ bateria 18650.
    • Gastei R$7.
  • Regulador de tensão de 3,3V de baixo dropout com capacidade de 1A.
    • Gastei R$0,12.
    • Algumas opções que conheço: XC6206 (o que usei) e MCP1700-3302E. Eles não tem capacidade de 1A, então é necessário utilizar mais de 1 em paralelo.
    • Pode ser um conversor buck também.
  • Módulo carregador de bateria de lítio (TP4056).
    • Gastei R$7,50.
    • O módulo carregador que vem com um circuito de proteção não funciona. Mais detalhes em tópicos adiante.
  • Fios para fazer as ligações.
    • Reaproveitei fios de outros dispositivos, então não gastei com isso.
  • Material para fazer uma caixinha.
    • Resolvi fazer a estrutura em impressora 3D. Como a caixa é pequena, o custo também é baixo.

Custo total (no meu caso): R$97,62.

Circuito

O circuito tem mais ligações que o caso do ESP32 ligada à rede, mas ainda assim é bem simples. A ideia é que o ESP32 seja alimentado por uma bateria de lítio. E, para carregar essa bateria, é necessário utilizar um módulo (TP4056). Com isso, a entrada do módulo fica ligada ao painel solar para que ele fique carregando constantemente a bateria.

Se você quiser usar a porta USB do módulo para carregar a bateria de outra forma, será necessário soldar um diodo entre o fio positivo do painel solar e a entrada do módulo. Caso contrário, a tensão da porta USB vai direto pro painel solar e ele pode ser danificado.

Veja o esquemático abaixo:

Esquemático do ESP32 ligado no painel solar

Outros detalhes do circuito estão distribuídos nos tópicos seguintes.

Regulador de tensão

Se você for usar o conversor buck, esta etapa não é necessária.

Para que o circuito funcione sem problemas, é necessário trocar o regulador de tensão que tem no ESP32 (AMS1117). Isso, porque ele tem um dropout de 1V, o que faz com que a tensão de saída (3,3V) fique em 2,7V quando a bateria estiver com o valor nominal (3,7V). Ou seja, o ESP32 não vai funcionar. Além disso, o AMS1117 adiciona um gasto de corrente de até 11 mA no circuito. Como o circuito todo é ligado a uma bateria, o ideal é reduzir ao máximo todos os gastos.

O passo a passo que segui para dessoldar o AMS1117 foi o seguinte (utilizando ferro de solda de ar quente/soprador):

  1. Passe fluxo de solda nos terminais do componente.
  2. Esquente o componente e a região em volta com o soprador à 200ºC.
    • Faça isso por uns 30 segundos. Isso serve para tentar deixar a temperatura da placa homogênea ao soldar o componente e evitar possíveis estresses térmicos.
  3. Aumente a temperatura do soprador para 300ºC (300 a 330ºC).
  4. Esquente o componente até a solda derreter e puxe ele para fora.
  5. Em seguida, é comendável limpar a placa com álcool isopropílico e remover o excesso de solda dos pinos.

Veja o resultado abaixo:

Tirando AMS1117 do ESP32-CAM

Em seguida, precisamos soldar o novo regulador. No canal do site tem um vídeo ensinando a soldar, então recomendo dar uma olhada. Como o regulador que tenho é de até no máximo 0,5A, tive que soldar 2 em paralelo. Fiz isso soldando um em cima do outro.

Além disso, o encapsulamento dele é diferente do AMS1117, então é importante ficar atento à compatibilidade de pinos. Felizmente os pinos 1 e 2 são compatíveis, então soldei ele em cima dos pinos do AMS1117 e soldei um fio para ligar o pino 3. Veja abaixo:

Colocando dois reguladores no ESP32-CAM

Inicialmente, tentei soldar apenas um regulador, mas o ESP32 ficou reiniciando constantemente. Pelo que pesquisei, em certos momentos, existe um pico de corrente por conta de algum processo relacionado ao Wi-Fi. E o regulador de 0,5A sozinho não consegue fornecer corrente suficiente para isso.

Módulo carregador de bateria

No tópico sobre componente, eu disse que o módulo carregador de bateria não pode ser o que tem um circuito de proteção. Isso, porque fiz testes usando esse módulo e o ESP32 não conseguiu dar boot. Acredito que o problema tenha relação com os picos de corrente que comentei no tópico anterior. Talvez, o circuito de proteção interpreta esses picos como um tipo de anormalidade no circuito (curto-circuito) e acaba cortando a tensão de saída.

Mesmo adicionando capacitores eletrolíticos (10 μF e 100 μF) e de poliester (100nF) na saída do regulador, o problema não foi resolvido. Por esse motivo, decidi utilizar o módulo sem o circuito de proteção. Veja abaixo imagens do teste:

Capacitores soldados em paralelo com 3V3

Linhas horizontais na tela

Um problema que enfrentei com esse projeto foi que ficavam aparecendo linhas horizontais aleatórias no vídeo da câmera. Apesar de ser algo indesejado, não atrapalhou a visualização do vídeo, pois elas apareciam de vez em quando e em baixa intensidade.

Enfim, pelo que pesquisei, isso tem relação com a alimentação, o que faz sentido já que não tive esse problema com o sistema alimentado pela rede. E uma dica que li foi adicionar capacitores em paralelo com a saída do regulador. Entretanto, mesmo fazendo isso, não observei melhoras.

Duração da bateria

Embora na lista de componentes esteja indicando uma bateria de 2000 mAh e um painel solar de 1W, esses valores não muito adequados. Para explicar o porquê vejamos cada um.

  • Painel solar:

O ideal é que, durante o dia, ele seja capaz de fornecer corrente para o ESP32 ao mesmo tempo que carrega a bateria. Como a intensidade do sol oscila ao longo do dia, é recomendável escolher um painel solar com uma potência bem acima da mínima (por exemplo 2W ou 400mA).

  • Bateria:

Teoricamente, a bateria é responsável por alimentar o ESP32 nos momentos em que uma nuvem entra na frente do sol e também durante a noite. Principalmente por conta do último ponto, seria necessário colocar várias baterias em paralelo para dar conta de manter o ESP ligado a noite toda.

Nos testes que fiz, uma bateria com supostamente 2600mAh conseguiu manter o ESP energizado por cerca de 3 a 4h. Estipulando que o período de ausência solar dura 12h, seriam necessárias 4 baterias de 2600mAh em paralelo. Tenha em mente que não tenho certeza se a capacidade da minha bateria é de fato 2600 mAh. Tendo em vista o tempo que ela durou, acredito que é bem menos.

Estrutura

Conforme comentei, resolvi fazer a estrutura na impressora 3D. Para isso, utilizei o Tinkercad e o link para acesso é este. No link estão as estruturas para o projeto alimentado via rede e via energia solar.

A estrutura possui uma tampa deslizante para facilitar a montagem e os componentes podem ser apenas encaixados.

Um detalhe importante é que a tampa possui um furo para a câmera e, para evitar que água ou poeira entre na caixa pelo furo, recortei uma tira de plástico de uma garrafa PET e coloquei na parte externa da tampa. Utilizei uma super cola para fixar a tira de plástico e depois silicone para vedar as extremidades. Você também pode utilizar o silicone para vedar os outros pontos da caixa, caso ela for ficar exposta no tempo.

Montagem

Simplificadamente estes são os passos da montagem:

  1. Dessolde o regulador de tensão do ESP32.
  2. Solde um novo no lugar.
  3. Crie a estrutura.
  4. Posicione os componentes na estrutura.
  5. Solde os fios e faça as ligações conforme esquemático.
  6. Posicione a caixinha no local desejado.
    • Você pode utilizar fita dupla face (mais prático) ou criar furos na caixa e parafusar ela.
  7. Tampe a caixinha e vede de acordo com dicas no tópico anterior.

Resultados

Após seguir os passos da montagem, estes foram os resultados que obtive:

Montagem do sistema com o módulo carregador de bateria
Montagem final do sistema
ESP32 CFTV solar finalizado

Os fios cortados acima são do painel solar e eles estão assim, pois tirei essa foto depois de decidir mudar o sistema para ser alimentado via rede elétrica. O motivo da decisão tem relação com o que foi falado no tópico sobre “duração da bateria” e “linhas horizontais”.

Por fim, restou apenas acessar o IP da câmera e verificar se o projeto estava funcionando. O resultado pode ser visto abaixo. A imagem é a mesma do tópico sobre a ligação do ESP32 na rede, mas, originalmente, essa foto foi tirada quando montei o sistema solar.

CFTV em funcionamento

Observações finais

Este post buscou fornecer orientações no desenvolvimento de um projeto de vigilância caseiro que tem bastante potencial de melhoria. Então, se você for montar, customize o projeto de acordo com suas vontades. E, caso não, espero que o post tenha agregado conhecimento.