Câmera IP: Cuide do seu bebê com o ESP32-CAM 34

Para o dia das mães trouxemos um projeto para dar uma ajudinha para as mamães makers! O projeto consiste em uma câmera IP para supervisionar crianças, utilizando o módulo ESP32-CAM. É uma ótima escolha para mamães makers (e papais makers também!) que precisam de liberdade para fazerem suas atividades em casa, mas gostam de estar sempre de olho nas crianças. As imagens podem ser visualizadas através do navegador de computadores, celulares e tablets. O módulo ESP32-CAM realizada a conexão via Wifi, exigindo assim um menor número de fios no projeto. Disponibilizamos também um compartimento em forma de cachorrinho, para ser impresso em uma impressora 3D, onde o ESP32-CAM pode ser encaixado.

Características do ESP32-CAM

O módulo ESP32-CAM com Câmera OV2640 2MP tem como principais características: Bluetooth BLE 4.2, suporte para cartão SD, antena embutida, wireless padrão 802.11 b/g/n e conexão Wifi 2.4 GHz. Possui 16 portas GPIO com as funções PWM, IC2, SPI e UART, sendo que 10 delas são de entrada e saída e 6 estão relacionadas a energia. A tensão de alimentação é de 5V.

Além disso possui um tamanho reduzido e sua operação é independente de outras plataformas*. 

*OBS: O módulo ESP32-CAM não possui entrada USB, portanto para sua configuração/programação inicial é necessário utilizar um Conversor USB para serial. Feito isso, o módulo ESP32-CAM não necessita de nenhum outro dispositivo auxiliar para seu funcionamento, apenas uma fonte de alimentação ou bateria.

Neste projeto iremos usar os seguintes materiais:

Configuração da Arduino IDE para o ESP32-CAM

Já mostramos como programar o módulo ESP32 com a Arduino IDE. O procedimento para o ESP32-CAM é parecido, veja abaixo:

Abra a Arduino IDE. Clique em Arquivo > Preferências.

preferências Arduino IDE

No campo URLs Adicionais para Gerenciador de Placas digite o link https://dl.espressif.com/dl/package_esp32_index.json e depois clique em OK.

URLs da câmera IP

Importante: Se você já possui a URL de outras placas ESP, você pode separar as URLs com uma vírgula da seguinte forma:

https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json

Feito isso, clique em Ferramentas > Placa > Gerenciador de Placas…placa para câmera IP

Na caixa de busca, digite esp32. Clique em Instalar.

instalação esp32 para câmera IP

Após alguns minutos as placas da linha ESP32 estarão disponíveis.

Programação da câmera IP

Copie o seguinte código na Arduino IDE:

/* 
Programa da câmera IP baseado no programa original desenvolvido por Rui Santos

  IMPORTANTE!!! 
   - Em Placa selecione "ESP32 Wrover Module"
   - Em Partion Scheme selecione "Huge APP (3MB No OTA)"
   - Para carregar o código é necessário que o GPIO 0 esteja conectado ao GND
*/

#include "esp_camera.h"
#include <WiFi.h>
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" 
#include "soc/rtc_cntl_reg.h"
#include "dl_lib.h"
#include "esp_http_server.h"

//Configuração da rede WiFi
const char* ssid = "nome-da-rede-wifi";
const char* password = "senha-da-rede-wifi";

#define PART_BOUNDARY "123456789000000000000987654321"

// Configuração do modelo de câmera (CAMERA_MODEL_AI_THINKER)
  #define PWDN_GPIO_NUM     32
  #define RESET_GPIO_NUM    -1
  #define XCLK_GPIO_NUM      0
  #define SIOD_GPIO_NUM     26
  #define SIOC_GPIO_NUM     27
  #define Y9_GPIO_NUM       35
  #define Y8_GPIO_NUM       34
  #define Y7_GPIO_NUM       39
  #define Y6_GPIO_NUM       36
  #define Y5_GPIO_NUM       21
  #define Y4_GPIO_NUM       19
  #define Y3_GPIO_NUM       18
  #define Y2_GPIO_NUM        5
  #define VSYNC_GPIO_NUM    25
  #define HREF_GPIO_NUM     23
  #define PCLK_GPIO_NUM     22

static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";

httpd_handle_t stream_httpd = NULL;

static esp_err_t stream_handler(httpd_req_t *req){
  camera_fb_t * fb = NULL;
  esp_err_t res = ESP_OK;
  size_t _jpg_buf_len = 0;
  uint8_t * _jpg_buf = NULL;
  char * part_buf[64];

  res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  if(res != ESP_OK){
    return res;
  }

  while(true){
    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      res = ESP_FAIL;
    } else {
      if(fb->width > 400){
        if(fb->format != PIXFORMAT_JPEG){
          bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
          esp_camera_fb_return(fb);
          fb = NULL;
          if(!jpeg_converted){
            Serial.println("JPEG compression failed");
            res = ESP_FAIL;
          }
        } else {
          _jpg_buf_len = fb->len;
          _jpg_buf = fb->buf;
        }
      }
    }
    if(res == ESP_OK){
      size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
      res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
    }
    if(res == ESP_OK){
      res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
    }
    if(fb){
      esp_camera_fb_return(fb);
      fb = NULL;
      _jpg_buf = NULL;
    } else if(_jpg_buf){
      free(_jpg_buf);
      _jpg_buf = NULL;
    }
    if(res != ESP_OK){
      break;
    }
    //Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
  }
  return res;
}

void startCameraServer(){
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  config.server_port = 80;

  httpd_uri_t index_uri = {
    .uri       = "/",
    .method    = HTTP_GET,
    .handler   = stream_handler,
    .user_ctx  = NULL
  };
  
  //Serial.printf("Starting web server on port: '%d'\n", config.server_port);
  if (httpd_start(&stream_httpd, &config) == ESP_OK) {
    httpd_register_uri_handler(stream_httpd, &index_uri);
  }
}

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
 
  Serial.begin(115200);
  Serial.setDebugOutput(false);
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; 
  config.frame_size = FRAMESIZE_UXGA;
  config.jpeg_quality = 10;
  config.fb_count = 2;
  
  // Iniciação da câmera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  // Conexão WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Início da transmissão no servidor Web
  startCameraServer();
  Serial.print("Camera Stream Ready! Go to: http://");
  Serial.print(WiFi.localIP());
}

void loop() {
  delay(1);
}

Insira o nome da sua rede Wifi e a senha da sua rede Wifi na seguinte parte do código:

//Configuração da rede WiFi
const char* ssid = "nome-da-rede-wifi";
const char* password = "senha-da-rede-wifi";

Como comentado anteriormente, o ESP32-CAM não possui entrada USB. Por esse motivo, nessa etapa é necessário utilizar o conversor USB para serial – FTDI FT232RL para fazer a comunicação entre o computador e o módulo. Faça a seguinte conexão entre ESP32-CAM, conversor USB para serial e a fonte de alimentação externa:

Note que nessa etapa é necessário conectar o GPIO0 no GND.

Conecte o conversor USB para serial no computador. A fonte de alimentação também deve estar ligada.

Na Arduino IDE vá em Ferramentas > Placa. Selecione ESP32 Wrover Module.

Depois, vá em Ferramentas > Partition Scheme. Selecione Hige APP (3MB No OTA).

Vá em Ferramentas > Porta. Selecione a porta a qual o ESP32-CAM está conectado.

configurações esp32 para câmera IP

Clique no botão de RESET na parte de trás da placa (o flash irá piscar uma vez).

Por fim, carregue o código (esse processo pode algum tempo).

Transmissão de vídeo

Desconecte o pino GPIO0 do GND.

Abra o Monitor Serial da Arduino IDE.

Configure para “nova linha” e “velocidade 115200”.

serial monitor para câmera IP

Clique novamente no botão de RESET na parte de trás da placa (o flash irá piscar uma vez).

O endereço IP aparecerá em seguida. 

IP da câmera

Digite o endereço IP no seu navegador.

Compartimento para a câmera IP

Com o objetivo de proteger e dar um bom posicionamento para a câmera do ESP32-CAM, fizemos um compartimento em forma de cachorrinho. Assim, além de câmera IP para o supervisão de crianças o projeto também servirá como decoração para o ambiente. O cachorrinho foi impresso em PLA e o arquivo da modelagem 3D pode ser baixado nesse link.

A câmera fica posicionada no focinho do cachorro.

Além de um câmera IP para o cuidado de crianças, o módulo ESP32-CAM pode ser usado em diversas aplicações, tais como: reconhecimento de rostos, detecção de movimento, transmissão de vídeo ao vivo, leitor de código de barras e QR-Code, entre outros. Em breve teremos mais tutoriais sobre outras aplicações do ESP32-CAM! 

Gostou? Ajude nosso blog a ficar cada vez melhor deixando seu comentário logo abaixo. E se quiser postar seu projeto, acesse nosso fórum.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

34 Comentários

  1. Boa noite, a minha esp32- cam, ainda não chegou mas pelo o que eu pude perceber no programa, tem alguma alteração que possa ser feito para utilizar outro metodo de visualização da imagem da camera que não seja por wifi (web) ? Algum que teria suporte para isso

    1. Olá Julio,

      Como você pensou em fazer isso? Via USB?

      Abraço!
      Rosana – Equipe FilipeFlop

      1. Pensei em via USB, tem como? o wifi esquenta muito e tem muita latencia

  2. Boa tarde, notei que a primeira imagem está apresentando erro 404, poderiam checar? obg!

    1. Olá Alexandre,

      Veja se agora está tudo ok!

      Abraço!
      Rosana – Equipe FilipeFlop

        1. Olá Alexandre,

          Verifiquei que o problema estava ocorrendo apenas no Firefox, não Chrome o problema não ocorria.
          Mas pode ficar tranquilo que a “imagem” não fazia parte do post.
          Muito obrigada pelo aviso 😀

          Abraço!
          Rosana – Equipe FilipeFlop

  3. é possível, com essa placa e câmera, implementar o protocolo ONVIF? Estou pensando em montar uma rede de monitoramento na minha casa e esse protocolo me pareceu bastante versátil e amigável.

    1. Olá Alexandre,

      Não tenho certeza, mas acho que é possível sim.

      Abraço!
      Rosana – Equipe FIlipeFlop

  4. Rosana,

    esse ESP já envia o áudio tbm ou só imagem?

    1. Olá Joni,

      Infelizmente não :/

      Abraço!
      Rosana – Equipe FilipeFlop

  5. Boa noite. Estou tentando conectar mas esta dando erro.
    A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header

    o que pode ser?

    1. Olá Raphael,

      Você está utilizando uma fonte de alimentação externa? Se não estiver usando, recomendo fortemente que use.

      Abraço!
      Rosana – Equipe FilipeFlop

  6. Alow Rosana, Eu somente consegui fazer a câmera funcionar, conectando uma fonte de 5VCC mas também conectando os 3.3 VCC da placa FTDI.. Apanhei bastante antes de conseguir que funcionasse . Abç. Ótimos tutoriais do FilipeFlop

    1. Roberto,

      Que bom que você conseguiu!

      Abraços!
      Diogo – Equipe FilipeFlop

  7. É possivel fazer tratamento da imagem? tipo, reconhecer um carro se fosse posta na porta da garagem?

    1. Olá, Fernando,

      Reconhecer de que forma?

      Abraços!
      Diogo – Equipe FilipeFlop

      1. Boa tarde, assim, estou com um problemas em mãos que se resume por exemplo, uma câmera na frente de uma garagem, então essa câmera se reconhecer o veículo irá acionar a cancela e liberar o acesso. Aí não sei se seria possível com o ESP32CAM, e se fosse como o fazer, pois há pouco material sobre.

        Abraços.

        1. Fernando,

          Teria que ter algum programa específico para identificar contorno de automóvel para aquela imagem. No caso, teria de ser planejado um software pra isso. A câmera serviria apenas para entregar as imagens para seu software.

          Abraços!
          Diogo – Equipe FilipeFlop

          1. Bom dia, fico contente que o meu projeto seja útil e que o utilizem, mas podiam incluir um link no post para o meu código original?

  8. Olá. Para alimentar o esp32 CAM (5v), posso usar um segundo node mcu, usando o gnd e o pino vin ? os 2 estão na mesma protoboard

    1. Olá, Sidi,

      Não é aconselhável fazer isso. Pode danificar sua NodeMCU.

      Abraços!
      Diogo – Equipe FilipeFlop

  9. O meu esp32 cam foi gravado conforme acima mas a parte do reconhecimento facial nao funciona de maneira nenhuma? Sera que alguem me da uma luz para solucionar o problema?

    1. Olá, Carlúcio!

      Para usar o reconhecimento facial é necessário que utilize outra programação!

      Abraços!
      Diogo – Equipe FilipeFlop

  10. Boa tarde, não consigo compilar, diz não possuir a biblioteca “dl_lib.h”. onde baixo ela?

    1. Erinton,

      Existe duas opções:
      1. Você pode comentar a linha que vai compilar ok;
      2. Você pode fazer o downgrade da versão da sua placa para a 1.02 (já que isso é um erro referente a versão 1.03 da placa).

      Abraços!
      Diogo – Equipe FilipeFlop

  11. Como faço para tivar o flash do esp32Cam?

    Leo Sousa Santiago de Oliveira
  12. Boa noite pessoal, apos a transferencia do sketch ele conecta na rede, mostra o IP, aceita o PING porem ao chamar o IP no navegador fica so carregando e nao carrega. Alguem ja teve este problema?

    1. Usei outro sketch e ele carregou a pagina, porem a imagem da camera nao aparece

      1. Mario,

        Utilize as configurações da câmera do post no seu novo sketch para testar.

        Abraços!
        Diogo – Equipe FilipeFlop

        1. Engracado que com este sketch do post ele nao esta nem carregando a pagina. Voce usou este sketch?

          1. Sim, aqui funciona, Mario.

            Pode enviar o código para que eu dê uma olhada (no seu que funciona).

            Abraços!
            Diogo – Equipe FilipeFlop

          2. Estou testando com o sketch que vem nos exemplos .

            Qual versão do Arduino vc está usando e qual versão da placa Esp32 (1.0.2, 1.0.3, 1.0.4)

            Testei com Arduino 1.8.10 e placa Esp32 1.0.4

          3. Mario,

            Arduino 1.8.21 e ESP32 1.0.4

            Abraços!
            Diogo – Equipe FilipeFlop