image edited Saravati

Campainha Inteligente com ESP32-CAM e Telegram

Imagine transformar uma campainha convencional em um dispositivo inteligente que, ao ser acionado, tira uma fotografia de quem está na porta e envia automaticamente para seu celular pelo Telegram.

Neste projeto, vamos desenvolver essa solução utilizando a ESP32-CAM, um botão de pressão, uma conexão Wi-Fi e a API do Telegram.

O projeto é uma excelente aplicação prática de Internet das Coisas (IoT), integrando eletrônica, programação, comunicação sem fio e serviços na nuvem.

1. Como funciona o projeto?

O funcionamento é simples: ao pressionar o botão da campainha, a ESP32-CAM captura uma fotografia e a envia ao Telegram utilizando a conexão Wi-Fi da residência.

Fluxo do projeto: acionamento, captura e envio da imagem pela internet.

A ESP32-CAM permanece ligada e conectada à rede Wi-Fi. Quando o botão é pressionado, o programa identifica o acionamento, captura uma imagem com a câmera OV2640 e envia um arquivo JPEG ao bot do Telegram.

No celular, o usuário recebe uma mensagem acompanhada da fotografia.

2. Materiais necessários

ESP32-CAM AI Thinker

Adaptador ESP32-CAM-MB

Botão de pressão normalmente aberto

Também serão necessários fios de conexão, cabo micro-USB, fonte de 5 V adequada e acesso a uma rede Wi-Fi de 2,4 GHz.

Para os testes, utilizaremos o computador e a Arduino IDE.

3. Ligação elétrica do botão

A ESP32-CAM possui diversos pinos de entrada e saída. Neste projeto utilizaremos o GPIO 13, que está disponível quando não utilizamos o cartão microSD.

A ligação é bastante simples.

Terminal do botãoESP32-CAM
Terminal 1GPIO 13
Terminal 2GND

Diagrama funcional da ligação do botão. Use as identificações GPIO 13 e GND impressas na sua placa.

O botão não necessita de resistor externo, pois utilizaremos o resistor de pull-up interno da ESP32.

No programa, configuramos:

#define BOTAO 13

pinMode(BOTAO, INPUT_PULLUP);

Com isso, o comportamento será:

  • Botão solto: nível lógico HIGH (1).
  • Botão pressionado: nível lógico LOW (0).

Importante: não utilize o botão IO0 do adaptador ESP32-CAM-MB como campainha, pois esse pino participa do processo de inicialização e programação da placa.

4. Configurando a Arduino IDE

Antes de carregar o programa, precisamos instalar o pacote de placas ESP32.

Abra a Arduino IDE e acesse Arquivo → Preferências.

No campo de URLs adicionais do Gerenciador de Placas, adicione:

https://espressif.github.io/arduino-esp32/package_esp32_index.json

Depois, abra o Gerenciador de Placas, pesquise por esp32 e instale o pacote esp32 by Espressif Systems.

Nas configurações da placa, selecione:

ConfiguraçãoValor
PlacaAI Thinker ESP32-CAM
Upload Speed115200
Flash Frequency40 MHz
Partition SchemeHuge APP (3MB No OTA), se disponível
Monitor Serial115200 baud
PortaCOM correspondente à ESP32-CAM-MB

As opções disponíveis podem variar conforme a versão instalada do pacote ESP32.

5. Testando o botão

Antes de integrar a câmera e o Telegram, é interessante verificar se a ligação do botão está funcionando corretamente.

Carregue este programa:

#define BOTAO 13

void setup() {

  Serial.begin(115200);

  pinMode(BOTAO, INPUT_PULLUP);

  Serial.println("ESP32-CAM iniciada!");

}

void loop() {

  if (digitalRead(BOTAO) == LOW) {

    Serial.println("Campainha pressionada!");

    delay(300);

  }

}

Abra o Monitor Serial em 115200 baud.

Ao pressionar o botão, deverá aparecer: Campainha pressionada!

Se essa mensagem aparecer, a ligação está funcionando.

6. Criando o bot do Telegram

Para receber as fotografias, vamos criar um bot utilizando o Telegram.

O bot será responsável por receber a imagem enviada pela ESP32-CAM e entregá-la na conversa do seu celular.

Passo 1 — Criar o bot

Abra o Telegram e pesquise por @BotFather.

Envie o comando:

/newbot

O BotFather solicitará um nome para o bot e um nome de usuário terminado em bot.

Exemplo:

  • Nome: Campainha Inteligente
  • Usuário: MinhaCampainhaCasa_bot

Se o nome estiver disponível, o Telegram criará o bot e fornecerá um Token de acesso.

Esse Token é uma credencial privada. Guarde-o e não o publique.

Passo 2 — Iniciar uma conversa

Pesquise pelo bot que acabou de criar e abra a conversa.

Clique em Iniciar ou envie:

/start

Depois envie uma mensagem simples, como:

teste

Passo 3 — Descobrir o Chat ID

Abra o navegador do computador ou celular e acesse:

https://api.telegram.org/botSEU_TOKEN/getUpdates

Substitua SEU_TOKEN pelo Token fornecido pelo BotFather.

O Telegram retornará uma resposta semelhante a:

{

"ok": true,

  "result": [

    {

      "message": {

        "chat": {

          "id": 123456789,

          "type": "private"

        },

        "text": "teste"

      }

    }

  ]

}

O número em chat.id é o identificador da conversa.

No exemplo, o Chat ID é 123456789, mas você deve utilizar o número retornado pelo seu próprio bot.

Se aparecer “result”:[], envie uma nova mensagem ao bot e atualize a página. Se continuar vazio, verifique se há um webhook configurado consultando o método getWebhookInfo.

Com o Token e o Chat ID em mãos, podemos programar a ESP32-CAM.

7. Código completo da campainha inteligente

O código abaixo integra todos os recursos do projeto:

  • Conexão com Wi-Fi.
  • Inicialização da câmera OV2640.
  • Leitura do botão no GPIO 13.
  • Captura de fotografia JPEG.
  • Envio da imagem para o Telegram.
  • Proteção simples contra acionamentos repetidos.
  • Mensagens de diagnóstico no Monitor Serial.

Antes de carregar, altere as informações de Wi-Fi, Token e Chat ID no início do programa.

#include "esp_camera.h"

#include <WiFi.h>

#include <WiFiClientSecure.h>

// ==========================================

// CONFIGURACOES - PREENCHA AQUI

// ==========================================

const char* ssid = "SEU_WIFI";

const char* password = "SUA_SENHA";

String botToken = "SEU_TOKEN_TELEGRAM";

String chatID = "SEU_CHAT_ID";

// Botao conectado entre GPIO 13 e GND

#define BOTAO 13

// ==========================================

// PINOS ESP32-CAM 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

// ==========================================

// VARIAVEIS

// ==========================================

WiFiClientSecure client;

bool estadoAnterior = HIGH;

bool cameraPronta = false;

unsigned long ultimoAcionamento = 0;

const unsigned long intervaloMinimo = 2000;

// ==========================================

// INICIALIZAR CAMERA

// ==========================================

bool iniciarCamera() {

  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_sccb_sda = SIOD_GPIO_NUM;

  config.pin_sccb_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;

  if (psramFound()) {

    config.frame_size = FRAMESIZE_VGA;

    config.jpeg_quality = 12;

    config.fb_count = 2;

    config.grab_mode = CAMERA_GRAB_LATEST;

  } else {

    config.frame_size = FRAMESIZE_QVGA;

    config.jpeg_quality = 15;

    config.fb_count = 1;

    config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;

  }

  esp_err_t err = esp_camera_init(&config);

  if (err != ESP_OK) {

    Serial.printf(

      "Erro ao iniciar camera: 0x%x\n",

      err

    );

    return false;

  }

  Serial.println("Camera inicializada!");

  return true;

}

// ==========================================

// CONECTAR WIFI

// ==========================================

bool conectarWiFi() {

  if (WiFi.status() == WL_CONNECTED) {

    return true;

  }

  WiFi.mode(WIFI_STA);

  WiFi.begin(ssid, password);

  Serial.print("Conectando ao WiFi");

  unsigned long inicio = millis();

  while (WiFi.status() != WL_CONNECTED &&

         millis() - inicio < 20000) {

    Serial.print(".");

    delay(500);

  }

  if (WiFi.status() == WL_CONNECTED) {

    Serial.println();

    Serial.println("WiFi conectado!");

    Serial.print("IP: ");

    Serial.println(WiFi.localIP());

    return true;

  }

  Serial.println();

  Serial.println("Falha na conexao WiFi!");

  return false;

}

// ==========================================

// ENVIAR FOTO PARA TELEGRAM

// ==========================================

bool enviarFotoTelegram() {

  if (!cameraPronta) {

    Serial.println("Camera indisponivel!");

    return false;

  }

  if (!conectarWiFi()) {

    return false;

  }

  Serial.println("Capturando foto...");

  camera_fb_t* fb = esp_camera_fb_get();

  if (!fb) {

    Serial.println("Erro ao capturar foto!");

    return false;

  }

  Serial.print("Foto capturada: ");

  Serial.print(fb->len);

  Serial.println(" bytes");

  // Prototipo: TLS sem validacao

  // do certificado do servidor.

  client.setInsecure();

  client.setTimeout(15000);

  Serial.println("Conectando ao Telegram...");

  if (!client.connect("api.telegram.org", 443)) {

    Serial.println("Falha ao conectar ao Telegram!");

    esp_camera_fb_return(fb);

    return false;

  }

  String boundary = "ESP32CAMBoundary";

  String head = "";

  head += "--" + boundary + "\r\n";

  head += "Content-Disposition: form-data; ";

  head += "name=\"chat_id\"\r\n\r\n";

  head += chatID + "\r\n";

  head += "--" + boundary + "\r\n";

  head += "Content-Disposition: form-data; ";

  head += "name=\"caption\"\r\n\r\n";

  head += "Campainha acionada! ";

  head += "Alguem esta na sua porta.\r\n";

  head += "--" + boundary + "\r\n";

  head += "Content-Disposition: form-data; ";

  head += "name=\"photo\"; ";

  head += "filename

8. Conclusão

Neste projeto, mostramos como transformar uma simples ESP32-CAM em uma campainha inteligente capaz de fotografar visitantes e enviar notificações diretamente para o Telegram.

Utilizando poucos componentes e uma programação relativamente simples, conseguimos integrar diferentes tecnologias em uma única aplicação: eletrônica, programação de microcontroladores, comunicação Wi-Fi, captura de imagens e Internet das Coisas (IoT).

Uma das grandes vantagens dessa solução é o baixo custo e a possibilidade de personalização. Diferentemente de muitas campainhas inteligentes comerciais, nosso projeto permite modificar o funcionamento conforme a necessidade, sem depender de assinaturas mensais para o envio das fotografias pelo Telegram.

Além disso, podemos evoluir o sistema acrescentando novas funcionalidades, como gravação de vídeos, detecção de movimento, envio de notificações para vários celulares e até integração com sistemas de automação residencial.

Mais do que construir uma campainha, este projeto demonstra como a eletrônica e a programação podem transformar ideias simples em soluções inteligentes para problemas do dia a dia.

E esse é justamente um dos principais objetivos da Sara Educação: mostrar que aprender eletrônica vai muito além da teoria. É colocar a mão na massa, desenvolver projetos reais e adquirir conhecimentos que podem ser aplicados em diferentes oportunidades profissionais.

Agora é sua vez! Monte o projeto, experimente novas funcionalidades e continue explorando as possibilidades da ESP32-CAM.

Saiba mais sobre a parceria Saravati e Sara Educação

Este “Guia de Montagem” é uma colaboração especial entre a Saravati e a Sara Educação, criado pelo Professor Felipe Rosa. Nosso objetivo é enriquecer a comunidade de entusiastas da eletrônica, IoT e automação com recursos educacionais de alta qualidade. Através dessa parceria, buscamos inspirar e capacitar criadores em seus projetos, disponibilizando esses guias em nosso blog e nas redes sociais.

@saravatirobotica no Instagram e Tiktok

@sara.educacao no Instagram e Tiktok

Leave a Reply

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