Bot Telegram com ESP8266 NodeMCU
Neste tutorial vamos mostrar como criar um Bot Telegram com ESP8266 NodeMCU permitindo que você, de qualquer lugar do mundo (onde tenha conexão internet), envie comandos para o microcontrolador.
O nosso bot Telegram vai funcionar com comandos pré-definidos, mas o programa é facilmente adaptável para acionar outras portas do ESP8266, assim como obter e enviar dados de sensores ou acionar relés por exemplo.
Criando o Bot ESP8266 usando BotFather
Antes de mais nada vamos criar o perfil do nosso módulo ESP8266 no Telegram. Por meio desse perfil vamos enviar comandos para controlar suas portas e também receber mensagens de aviso.
Para criar o perfil vamos usar o BotFather. Entre no Telegram e procure por BotFather, adicionando-o conforme imagem abaixo:
Ao adicionar este perfil, será mostrada uma mensagem de boas vindas do BotFather. Clique em START para continuar.
Vamos criar o nosso bot enviando a mensagem /newbot. O BotFather retorna uma mensagem perguntando qual será o nome do seu bot. Escolhi ArduinoeCia_ESP8266, e esse vai ser o nome que aparecerá no perfil desse usuário.
O BotFather pede também que você selecione um nome de usuário para o seu bot. Este nome deve terminar como “bot”, então selecionei ArduinoeCia_ESP8266_bot:
A criação do bot é então finalizada e o BotFather fornece para você um token (conforme destacado na imagem abaixo). Anote esse token pois sem ele a comunicação entre o ESP e o Telegram não vai funcionar:
Você também pode adicionar uma descrição para o seu bot e criar uma imagem de perfil, entre outras opções. Digite /help no botFather para visualizar todos os comandos disponíveis.
Circuito de testes ESP8266 com Telegram
Para os testes de controle do Bot Telegram com ESP8266 vamos usar o módulo ESP8266 NodeMCU e dois leds que serão acesos de acordo com os comandos enviados pelo aplicativo:
O led vermelho está conectado na porta 4 e o verde na porta 3. Não utilizei resistores nos testes, liguei direto, ok?
Programa de controle ESP8266
A programação do NodeMCU será feita pela IDE do Arduino. Para utilizar esta placa, entre no menu Arquivo e em seguida em Preferências. No campo URLs Adicionais para Gerenciadores de Placas coloque o seguinte endereço:
Clique em OK e vá agora até o menu Ferramentas -> Placa -> Gerenciador de Placas e na tela do gerenciador, procure por ESP8266 e selecione o esp8266 by ESP8266 Community, clicando em seguida em Instalar:
Agora você terá as placas da linha ESP8266 na lista de placas disponíveis na IDE. Selecione NodeMCU 1.0:
Para o programa vamos usar duas bibliotecas: a ArduinoJson e a CTBot. Ambas podem ser instaladas à partir da IDE do Arduino.
Instalamos primeiro a CTBot. Entre no menu Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas e procure por CTBot, clicando em seguida em Instalar:
Faremos o mesmo procedimento para a biblioteca ArduinoJson mas nesse caso MUITA ATENÇÃO pois o CTBot exige uma versão específica da ArduinoJson, a 5.13.5. Então antes de clicar em instalar selecione a versão correta:
Finalizada a instalação das duas bibliotecas, carregue o programa abaixo no ESP8266. Atenção para as linhas 8, 9 e 10 onde você deve colocar, respectivamente, o nome da sua rede wifi, a senha da rede e por último o token que você anotou durante a instalação do BotFather:
//Programa: Bot Telegram com ESP8266 NodeMCU //Autor: Arduino e Cia #include "CTBot.h" CTBot myBot; //Definicoes da rede wifi e conexao String ssid = "NOME_WIFI"; //Nome da sua rede wifi String pass = "SENHA_WIFI"; //Senha da sua rede wifi String token = "881505328:AAFWpkKFuq2cAFDDERE-1kKDg"; //Token bot Telegram //Pinos dos leds uint8_t led1 = D4; uint8_t led2 = D3; void setup() { Serial.begin(115200); Serial.println("Inicializando bot Telegram..."); //Conexao na rede wifi myBot.wifiConnect(ssid, pass); //Define o token myBot.setTelegramToken(token); //Verifica a conexao if (myBot.testConnection()) Serial.println("nConexao Ok!"); else Serial.println("nFalha na conexao!"); //Define os pinos dos leds como saida e apaga os leds pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); } void loop() { //Variavel que armazena a mensagem recebida TBMessage msg; //Verifica se chegou alguma mensagem if (myBot.getNewMessage(msg)) { //Verifica se foi recebia a mensagem "Liga 1" if (msg.text.equalsIgnoreCase("LIGA 1")) { //Liga o led 1 (vermelho) digitalWrite(led1, LOW); //Retorna uma pensagem informando que o led foi aceso myBot.sendMessage(msg.sender.id, "LED 1 Aceso!"); } else if (msg.text.equalsIgnoreCase("DESLIGA 1")) { digitalWrite(led1, HIGH); myBot.sendMessage(msg.sender.id, "LED 1 Apagado!"); } else if (msg.text.equalsIgnoreCase("LIGA 2")) { digitalWrite(led2, LOW); myBot.sendMessage(msg.sender.id, "LED 2 Aceso!"); } else if (msg.text.equalsIgnoreCase("DESLIGA 2")) { digitalWrite(led2, HIGH); myBot.sendMessage(msg.sender.id, "LED 2 Apagado!"); } else { //Caso receba qualquer outro comando, envia uma //mensagem generica/informativa String reply; reply = (String)"Ola " + msg.sender.username + (String)"! Acesse www.arduinoecia.com.br e confira mais posts sobre ESP8266, Arduino e IoT!"; myBot.sendMessage(msg.sender.id, reply); } } delay(500); }
Após o carregamento do programa, aguarde alguns segundos até que o módulo faça a conexão com a internet. Você pode acompanhar esse processo pelo Serial Monitor, que vai mostrar se tudo está funcionando corretamente.
Controlando o ESP8266 com Telegram
Agora é só adicionar o seu bot na lista de contatos do Telegram e enviar os comandos para ligar os leds. Os comandos Liga 1 e Liga 2 acionam respectivamente os leds vermelho e verde. Para desligar os leds, utilize os comandos Desliga 1 e Desliga 2.
Veja como fica a tela do Telegram usando um smartphone com Android:
O ESP8266 vai receber os comandos e também responder com mensagens como Led 1 Aceso ou Led 2 Apagado, por exemplo. Você pode customizar essas mensagens de acordo com as suas necessidades.
Gostou? Confira também o post Painel de Avisos acionado por Bot Telegram, onde uso o mesmo princípio para mostrar as mensagens em um painel matriz de leds 8×8.
Muito obrigado por este tutorial, não sabe o quando vc me ajudou a estudar nesta área de IoT, mas gostaria de saber se há uma possibilidade de estar colocando tipo um login e senha para acessar o bot? Como ao entrar no bot no telegram ele já peça login e senha para continuar os comandos, para que eu possa ter certeza que outras pessoas não acessarão ele. Agradeço de novo pelo tutorial.
Oi João!
Eu realmente desconheço como fazer isso, mas se você fizer a programação para que ele só aceite seus próprios comandos, por exemplo, ao invés de "Liga 1" você colocaria "L1g@1", por exemplo. É muito difícil a pessoa descobrir os comandos que funcionariam no seu módulo.
Abraço!
Adilson
Ola pessoal do Arduino e Cia. ola a todos.
Parabens pelo projeto.muito bom.
mas gostaria que vcs me descem uma dica.
gravei o programa na ide do arduino. tudo ok.
criei o Bot e coloquei TOKEN,SSID,SENHA.
Mas na serial só aparece: Conexao Ok! mas nao aceita os comandos. nao responde nada.
conferi com um APP de scan IP ma rede o SP8266 está conectado.
obrigado
Oi Luiz,
Legal. O "conexão OK" significa que o seu módulo conseguiu se conectar na rede wifi. Veja se o token foi inserido corretamente.
Abraço!
Adilson
Boa noite!!
na hora que vai gravar no esp8266 da um fatal erro
esptool.fatalerror:failed to connect to ESP8266
O que devo fazer??
[…] Bot Telegram com ESP8266 NodeMCU: Neste post eu mostro como acionar as portas do ESP8266 usando um Bot Telegram, ligando e desligando leds […]
Ola< tudo bem? muito boa a sua publicacao, parabens pelo conteudo…….Eu queria saber se funciona tbm com IOS?
Oi Ivan,
Muito obrigado. Funciona no IoS sim… 🙂
Abraço!
Adilson
gostei muito, da explicação, obrigado.
Muito obrigado! 🙂
Abraço!
Adilson
Olá.
Implementei seu método, funcionou ok.
Dúvida de segurança.
Este Bot é “encontrável”, ou “público”, ou seja, qualquer pessoa pode achar ele pelo nome e interagir com ele?
Preciso implementar alguma autenticação para prevenir isto?
Grato
Oi Lissandro,
Sim, até onde eu sei o bot é público e acessível a qualquer um, por isso eu recomendo que vc coloque algum nome “diferente” no bot. Uma outra opção é você colocar alguma palavra chave secreta junto ao comando de ligar e desligar para tornar mais difícil o acionamento por “acidente”.
Abraço!
Adilson
Show de bola o tutorial, queria usar como alerta tem como definir por exemplo para ele envia mensagens a um grupo ? e responder perguntas do gupo por exemplo qual a temperatura no momento ? e que se passar de x da temperatura ele envie um alerta neste grupo
Oi Edson,
Eu ainda não usei essa função de mandar msg para um grupo, mas realmente é interessante. Dê uma olhada nesse artigo, por favor: https://stackoverflow.com/questions/38565952/how-to-receive-messages-in-group-chats-using-telegram-bot-api/38566728
Abraço!
Adilson
Entao ate consegui com este detalhe acertar la agora preciso enviar a menssagen para o grupo como faço tentei
myBot.sendMessage(grupo, “OLA TUDO BEM”); mas ele deu erro
Olá, estou tendo dificuldades em fazer o programa me enviar uma mensagem por telegram toda vez que é ligado. Alguém já fez isso;?
Me ajudou muito!
Olá me ajudou muito parabens ,consegui tranferir para esp 01 com 4 rele
queria fazer um quando alarme residencial disparesse ele me avise no telegram
Oi Denilton!
Valeu! Sim, com algumas adaptações é possível acionar relés e enviar mensagens para o Telegram.
Abraço!
Adilson
Boa noite como resolver isso fala que o d4 nao esta declarado no scopo
/Pinos dos leds
uint8_t led1 = D4;
uint8_t led2 = D3;
void setup()
exit status 1
‘D4’ was not declared in this scope
Oi Eules,
Você está selecionando a placa correta na hora de compilar? Se você não selecionar a NodeMCU, vai dar erro.
Abraço!
Adilson
Olá. é possível comandar o esp8266 de outra rede utilizando o app inventor?
Boa tarde,
É possível sim. De outra rede, da internet, etc.
Abraço!
Adilson
Há alguma maneira de fazer um programa como esse rodar em alguma placa Arduino ou Esp com cabo ethernet ao invés de Wifi ?