28 abril 2019

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.

Bot Telegram com ESP8266

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:

Adicionando BotFather
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:

Criando Bot no BotFather

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:

Bot Telegram Token

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:

Circuito ESP8266 NodeMCU e Leds

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 do ESP8266 com Telegram


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:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

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:

ESP8266 IDE Arduino

Agora você terá as placas da linha ESP8266 na lista de placas disponíveis na IDE. Selecione NodeMCU 1.0:

NodeMCU 1.0 Board IDE Arduino

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//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.

4 comentários:

  1. 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.

    ResponderExcluir
    Respostas
    1. 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

      Excluir
  2. 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

    ResponderExcluir
    Respostas
    1. 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

      Excluir