Índice:
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
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ão | ESP32-CAM |
| Terminal 1 | GPIO 13 |
| Terminal 2 | GND |
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ção | Valor |
| Placa | AI Thinker ESP32-CAM |
| Upload Speed | 115200 |
| Flash Frequency | 40 MHz |
| Partition Scheme | Huge APP (3MB No OTA), se disponível |
| Monitor Serial | 115200 baud |
| Porta | COM 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.
