Neste artigo iremos utilizar uma biblioteca, compatível com Arduino, que possibilita a comunicação de maneira fácil e rápida de um microcontrolador(no caso deste artigo o ESP32) com um robô(ou bot) criado com o aplicativo de mensagens Telegram. A ideia é utilizar um sensor de presença que através de uma interrupção configurado no ESP32, informa ao microcontrolador a detecção de movimento e o mesmo comunica-se, por uma conexão com a internet, com o bot e a mensagem pode ser visualizada pelo usuário.
Telegram
O Telegram é um aplicativo de mensagens disponível para Android e IOS. Para prosseguir, você pode baixar o aplicativo na loja de aplicativos do seu sistema operacional e criar uma conta. Uma funcionalidade bastante interessante presente no Telegram é a possibilidade de criação e programação de Bots que podem realizar diversas tarefas como: informar valor de algum ativo na bolsa de valores, enviar lembretes, Tweetar mensagens e etc…
O Bot utilizado neste artigo apenas replicará a mensagem recebida pelo microcontrolador. A seguir apresentaremos o procedimento para a criação e configuração do Bot utilizado.
Criação do Bot do Telegram
Os Bots são criados a partir de uma ferramenta chamada botfather. Após abrir o aplicativo, utilize a ferramenta de busca para encontrar o “@BotFather”.
A seguir envie o comando “/newbot”, na próxima mensagem forneça o nome do Bot e depois escolha um username para o bot(este nome deve necessariamente terminar com “bot”).
Após a criação um token será disponibilizado, salve-o, pois ele será necessário para a inicialização da biblioteca que fará a comunicação com o Bot. A figura a seguir ilustra onde localizar o Token gerado.
Pronto! Seu Bot já está criado e pronto para ser utilizado. A seguir apresentaremos o microcontrolador utilizado para a comunicação com o Bot.
ESP32/8266 + Arduino IDE
A biblioteca utilizada para a comunicação com o Bot é compatível com o Arduino IDE e foi desenvolvida para microcontroladores das famílias ESP32 e ESP8266. Para que seja possível a programação dessas famílias de microcontroladores pelo ambiente Arduino, algumas configurações são necessárias, para isto basta seguir a sessão “Instalação do pacote ESP32 para Arduino” deste artigo do Embarcados: https://embarcados.com.br/franzininho-wifi-primeiros-passo-na-arduino-ide/ .
Para este tutorial utilizaremos a placa de desenvolvimento DO IT DEVKIT WROOVER.
Sensor de Presença
Para a detecção de movimento utilizaremos o módulo HC-SR501 que utiliza um sensor PIR, capaz de detectar a variação de emissão de luz infravermelha emitida por um corpo.
Figura 5: Módulo sensor de movimento(HC-SR501) utilizado
O módulo pode ser alimentado com 5V e gera uma saída em 3V3, portanto compatível com o nível lógico utilizado pelo ESP32/ESP8266(3V3).
Diagrama das Conexões
O circuito utilizado é relativamente simples, a placa de desenvolvimento será alimentada pela USB(5V) e o pino “Vin” irá alimentar o módulo HC-SR501 e sua saída será ligada ao pino 27 da placa que será configurado como interrupção.
Firmware
A seguir serão descritas as bibliotecas necessárias para o correto funcionamento do código e o próprio código explicado linha a linha.
Bibliotecas
A biblioteca utilizada para o gerenciamento do Bot pode ser baixada pelo link https://github.com/shurillu/CTBot ou pelo gerenciador de bibliotecas da própria Arduino IDE, como indicado na próxima imagem.
Outra biblioteca necessária para o correto funcionamento da aplicação é a ArduinoJson que pode ser baixada pelo link https://github.com/bblanchon/ArduinoJson ou pelo gerenciador de bibliotecas da Arduino IDE. Neste tutorial está sendo utilizada a versão 5.13.5 desta biblioteca, mas como indicado na descrição da biblioteca “CTBot” ela possui suporte tanto para a versão 5 quanto para a versão 6 da ArduinoJson.
Código
Em linhas gerais o código apresentado envia mensagens ao Bot quando uma interrupção é detectada, indicando a presença ou movimento no cômodo. O código-fonte completo segue abaixo, leia com atenção os comentários para o completo entendimento do mesmo.
/*
Descrição: Sensor de presença informando presença em determinado cômodo a um Bot do Telegram.
Autor: Paulo Fernando.
*/
//Biblioteca para gerenciar comunicação com o Bot
#include "CTBot.h"
//Pino de interrupção utilizado com o módulo HC-SR501
#define PIR 27
//Inicializa objeto da biblioteca
CTBot myBot;
//Flag que será tratada na rotina de interrupção
bool pir_presence_flag = false;
//Função responsável pelo envia de mensagens ao Bot
void msgTelegramBot(void);
//Substituir pelo SSID de sua rede WiFi
String ssid = "";
//Substituir pela senha de sua rede WiFi
String pass = "";
//Substituir pelo Token do Bot criado.Este valor é recebido após a criação do Bot com o "@BotFather"
String token = "";
//Função chamada quando há interrupção,manter mais curta o possível
void IRAM_ATTR ISR_0(){
pir_presence_flag = true;
}
//SetUp
void setup(){
//Pino de interrupção incializado em Pull Down
pinMode(PIR, INPUT_PULLDOWN);
//Seta o pino como entrada, associa a interrupção a borda de subida e indica o nome da função que irá tratar a interrupção
attachInterrupt(PIR, ISR_0, RISING);
//Inicializa a porta serial para debug
Serial.begin(115200);
Serial.println("Iniciando TelegramBot...");
//Inicia conexão com WiFi
myBot.wifiConnect(ssid, pass);
//Configura o Token do Bot
myBot.setTelegramToken(token);
//Testa conexão com o Bot
if(myBot.testConnection())
Serial.println("\nTeste de Conexão OK");
else
Serial.println("\nTeste de Conexão NOK");
delay(500);
//Inicia
msgTelegramBot();
}
void loop(){
//Nada a fazer
}
//Verifica conexão com o Bot.Sai dessa função apenas quando a conexão é estabelecida.
bool reconnectTelgramBot(){
while(!myBot.testConnection()){
Serial.println("");
//Tenta conexão com WiFi
if(myBot.wifiConnect(ssid, pass)){
Serial.println("Conexão estabelecida");
}
else{
Serial.println("");
}
}
return true;
}
void msgTelegramBot(){
//Variable para armazenar mensagens vinda do Bot
TBMessage msg;
while(1){
//Verifica se chegou alguma mensagem - Uma primeira mensagem é necessária ser enviada para iniciar o Bot
if(CTBotMessageText == myBot.getNewMessage(msg)){
//Envia mensagem de volta ao Bot
myBot.sendMessage(msg.sender.id, msg.text);
//Quando a primeira mensagem é recebida o MCU começa a monitorar o sensor de presença para enviar mensagens ao Bot
while(1){
//Movimento detectado
if(pir_presence_flag){
//Sinaliza que ocorreu a interrupção
Serial.println("FLAG!");
//Reseta o valor da Flag
pir_presence_flag = false;
//Envia mensagem ao Bot
if(!myBot.sendMessage(msg.sender.id, "Presença Detectada!")){
//Falha no envio da mensagem
Serial.println("Falha no envio da mensagem.");
//Verifica a conexão com o Bot
while(!reconnectTelgramBot()){
delay(10);
}
}
//Aguarda 10 segundos para verificar novamente se a flag mudou de valor.
delay(10000);
}
delay(10);
}
}
delay(10);
}
}






Boa tarde a todos, estou com um problema que está me consumindo os neuronios, estou enviando 05 mensagens seguidas a Telegram, gostaria de estar quebrando ou pulando linha entre uma mensagem e outra para melhorar a leitura e ficar menos poluido, já tentei colocar \n em todos os pontos da minha linha de comando. Será que isso é possivel? Já pesquisei a exaustão sobre o assunto sem sucesso, tentei por conta proprio sem sucesso. Alguém ai tem a solução? OBRIGADO!
Muito bom, rodou aqui legal.
Ele só se comunica com um usuário? Tem como se comunicar com mais?
Show Marcelo! Do jeito que configuramos o bot e programamos o ESP, você pode compartilhar o nome do seu Bot com qualquer usuário e o mesmo pode interagir com o bot. Para garantir que o ESP apenas responda ao seu usuário, você pode encontrar o seu ID do Telegram e garantir, no código, que o ESP apenas interaja com o seu usuário. É possível sim criar um grupo onde o Bot pode ser adicionado e as pessoas do grupo podem interagir com o Bot, esse tutorial do Random Nerd Tutorials mostra um exemplo bem interessante: https://randomnerdtutorials.com/telegram-group-esp32-esp8266/
Muito bom! Uma versão 2 desse projeto poderia ser o uso do ESP32 cam (com Câmera) para envio de foto pro Telegram no momento de detecção do sensor de presença…. Seria ou não seria ótimo!? Parabéns pelo belo trabalho! 🙂
Valeu Breno. Muito boa a ideia, assim que eu conseguir um ESP-CAM farei um upgrade neste projeto. Abraços.