Por Fernando Koyanagi
Intenção da Aula
Criar um bot no ESP8266/ESP32 para servir
de contato no Telegram.
Modificar/verificar o estado de um relê e
verificar a temperatura e umidade de acordo
com mensagens que enviamos para ele.
Demonstração
Seu e-mail
Em [Link]
[Link]
Instagram
fernandok_oficial
Telegram
fernandok_oficial
6
Montagem
Atualizar o core do ESP8266
Em caso de problemas com o ESP8266, na IDE do Arduino vá em:
Ferramentas->Placa->Gerenciar de Placas...
Atualize o ESP8266 (no caso utilizamos a versão 2.4.2)
Funcionou com 2.4.2
Estava dando Exception (29) na versão anterior
Biblioteca ArduinoJson
Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale ArduinoJson (no caso utilizamos a versão 5.13.2)
Biblioteca UniversalTelegramBot
Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale UniversalTelegramBot
Biblioteca SimpleDHT
Na IDE do Arduino vá em Sketch->Incluir Biblioteca->Gerenciar Bibliotecas...
Instale SimpleDHT
Criando um Bot no Telegram
Abra o Telegram e pesquise por botfather. Selecione o com a marca azul
Selecione este
Criando um Bot no Telegram
Nesta tela clique em COMEÇAR
Clique aqui
Criando um Bot no Telegram
O BotFather te mostrará algumas opções
Criando um Bot no Telegram
Digite /newbot
Criando um Bot no Telegram
Digite o nome que queira para seu bot
Criando um Bot no Telegram
Digite o nome de usuário para seu bot. Deve terminar com bot (Exemplo: TesteFKBot).
Guarde o token gerado para substituir
no código fonte .ino
Clique aqui para conversar
com o bot
Guarde este TOKEN para
substituir no código fonte
[Link]
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <SimpleDHT.h>
//Pino onde está o Relê
#define RELAY_PIN 5
//Pino onde está o DHT22
#define DHT_PIN 4
//Intervalo entre as checagens de novas mensagens
#define INTERVAL 1000
//Token do seu bot. Troque pela que o BotFather te mostrar
#define BOT_TOKEN "000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
//Troque pelo ssid e senha da sua rede WiFi
#define SSID "SSID"
#define PASSWORD "12345678"
[Link]
//Comandos aceitos
const String LIGHT_ON = "ligar a luz";
const String LIGHT_OFF = "desligar a luz";
const String CLIMATE = "clima";
const String STATS = "status";
const String START = "/start";
//Objeto que realiza a leitura da temperatura e umidade
SimpleDHT22 dht;
//Estado do relê
int relayStatus = LOW;
//Cliente para conexões seguras
WiFiClientSecure client;
//Objeto com os métodos para comunicarmos pelo Telegram
UniversalTelegramBot bot(BOT_TOKEN, client);
//Tempo em que foi feita a última checagem
uint32_t lastCheckTime = 0;
//Quantidade de usuários que podem interagir com o bot
#define SENDER_ID_COUNT 2
//Ids dos usuários que podem interagir com o bot.
//É possível verificar seu id pelo monitor serial ao enviar uma mensagem para o bot
String validSenderIds[SENDER_ID_COUNT] = {"123456789","223456789"};
[Link]
void setup()
{
[Link](115200);
//Inicializa o WiFi e se conecta à rede
setupWiFi();
//Coloca o pino do relê como saída e enviamos o estado atual
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, relayStatus);
}
[Link]
void setupWiFi()
{
[Link]("Connecting to SSID: ");
[Link](SSID);
//Inicia em modo station e se conecta à rede WiFi
[Link](WIFI_STA);
[Link](SSID, PASSWORD);
//Enquanto não estiver conectado à rede
while ([Link]() != WL_CONNECTED)
{
[Link](".");
delay(500);
}
//Se chegou aqui está conectado
[Link]();
[Link]("Connected");
}
[Link]
void loop()
{
//Tempo agora desde o boot
uint32_t now = millis();
//Se o tempo passado desde a última checagem for maior que o intervalo
determinado
if (now - lastCheckTime > INTERVAL)
{
//Coloca o tempo de última checagem como agora e checa por mensagens
lastCheckTime = now;
int numNewMessages = [Link](bot.last_message_received + 1);
handleNewMessages(numNewMessages);
}
}
[Link]
void handleNewMessages(int numNewMessages)
{
for (int i=0; i<numNewMessages; i++) //para cada mensagem nova
{
String chatId = String([Link][i].chat_id); //id do chat
String senderId = String([Link][i].from_id); //id do contato
[Link]("senderId: " + senderId); //mostra no monitor serial o id de quem mandou a mensagem
//verifica se é o id de um remetente da lista de remetentes válidos
boolean validSender = validateSender(senderId);
if(!validSender) //se não for um remetente válido
{
//Envia mensagem que não possui permissão
[Link](chatId, "Desculpe mas você não tem permissão", "");
//continua para a próxima iteração do for (vai para próxima mensagem, não executa o código abaixo)
continue;
}
String text = [Link][i].text; //texto que chegou
if ([Link](START))
{
handleStart(chatId, [Link][i].from_name); //mostra as opções
}
[Link]
else if ([Link](LIGHT_ON))
{
handleLightOn(chatId); //liga o relê
}
else if([Link](LIGHT_OFF))
{
handleLightOff(chatId); //desliga o relê
}
else if([Link](CLIMATE))
{
handleClimate(chatId); //envia mensagem com a temperatura e umidade
}
else if ([Link](STATS))
{
handleStatus(chatId); //envia mensagem com o estado do relê, temperatura e umidade
}
else
{
handleNotFound(chatId); //mostra mensagem que a opção não é válida e mostra as opções
}
}//for
}
[Link]
boolean validateSender(String senderId)
{
//Para cada id de usuário que pode interagir com este bot
for(int i=0; i<SENDER_ID_COUNT; i++)
{
//Se o id do remetente faz parte do array retornamos que é válido
if(senderId == validSenderIds[i])
{
return true;
}
}
//Se chegou aqui significa que verificou todos os ids e não encontrou no
array
return false;
}
[Link]
void handleStart(String chatId, String fromName)
{
//Mostra Olá e o nome do contato seguido das mensagens válidas
String message = "<b>Olá " + fromName + ".</b>\n";
message += getCommands();
[Link](chatId, message, "HTML");
}
[Link]
String getCommands()
{
//String com a lista de mensagens que são válidas e explicação sobre o que
faz
String message = "Os comandos disponíveis são:\n\n";
message += "<b>" + LIGHT_ON + "</b>: Para ligar a luz\n";
message += "<b>" + LIGHT_OFF + "</b>: Para desligar a luz\n";
message += "<b>" + CLIMATE + "</b>: Para verificar o clima\n";
message += "<b>" + STATS + "</b>: Para verificar o estado da luz e a
temperatura";
return message;
}
[Link]
void handleLightOn(String chatId)
{
//Liga o relê e envia mensagem confirmando a operação
relayStatus = HIGH;
digitalWrite(RELAY_PIN, relayStatus);
[Link](chatId, "A luz está <b>acesa</b>", "HTML");
}
[Link]
void handleLightOff(String chatId)
{
//Desliga o relê e envia mensagem confirmando a operação
relayStatus = LOW;
digitalWrite(RELAY_PIN, relayStatus);
[Link](chatId, "A luz está <b>apagada</b>", "HTML");
}
[Link]
void handleClimate(String chatId)
{
//Envia mensagem com o valor da temperatura e da umidade
[Link](chatId, getClimateMessage(), "");
}
[Link]
String getClimateMessage()
{
//Faz a leitura da temperatura e da umidade
float temperature, humidity;
int status = dht.read2(DHT_PIN, &temperature, &humidity, NULL);
//Se foi bem sucedido
if (status == SimpleDHTErrSuccess)
{
//Retorna uma string com os valores
String message = "";
message += "A temperatura é de " + String(temperature)+ " °C e ";
message += "a umidade é de " + String(humidity) + "%";
return message;
}
//Se não foi bem sucedido retorna um mensagem de erro
return "Erro ao ler temperatura e umidade";
}
[Link]
void handleStatus(String chatId)
{
String message = "";
//Verifica se o relê está ligado ou desligado e gera a mensagem de acordo
if(relayStatus == HIGH)
{
message += "A luz está acesa\n";
}
else
{
message += "A luz está apagada\n";
}
//Adiciona à mensagem o valor da temperatura e umidade
message += getClimateMessage();
//Envia a mensagem para o contato
[Link](chatId, message, "");
}
[Link]
void handleNotFound(String chatId)
{
//Envia mensagem dizendo que o comando não foi encontrado e mostra opções
de comando válidos
String message = "Comando não encontrado\n";
message += getCommands();
[Link](chatId, message, "HTML");
}
Interagindo com o Bot no Telegram
Vá até o BotFather e clique no link para conversar com o bot
Clique aqui para conversar
com o bot
Interagindo com o Bot no Telegram
Clique em COMEÇAR
Clique aqui
Interagindo com o Bot no Telegram
Envie os comandos e verifique as mensagens que o bot retorna
Interagindo com o Bot no Telegram
Em [Link]
Download arquivos PDF e INO do código fonte
38