O ESP32 Projeto Telegram é um recurso que vem crescendo bastante nos últimos tempos, normalmente utilizamos o Aplicativo Telegram para o envio de mensagem apenas, porém hoje vamos explorar um pouco mais este recurso.
Quando trabalhamos com Automação Residencial normalmente encontramos algumas barreiras que inviabilizam o nosso projeto, ou é a complexibilidade dos códigos que precisamos utilizar ou até mesmo a inviabilidade da parte física.
Através do ESP32 Projeto Telegram existe a facilidade de realizarmos o projeto de Automação com apenas um módulo que é o próprio Microcontrolador e nos preocupamos neste caso, apenas com o código, que não necessita de linguagens extras de comunicação.
Telegram
O Telegram é um aplicativo gratuito disponível para Android, Windows Phone, iOS e Web bastante semelhante com o famoso Whatsapp, que possibilita ao usuário enviar mensagens de texto, fotos e vídeos, emoticons e stickers.
Com um sistema de funcionamento semelhante ao Whatsapp, o Telegram também utiliza e classifica os contatos através da rede telefônica, possibilitando a criação de um perfil e posterior utilização.
Qual a diferença entre o Telegram e o Whatsapp?
Uma das vantagens que o Telegram possui e que consequentemente o destaca em relação ao seu concorrente é a possibilidade de utilização de bots (robots – robôs), mecanismo que realiza diversos serviços de forma gratuita e diferenciada.
Telegram Bot
O Telegram oferece além de todas as suas vantagens uma série de recursos com perfis automáticos que são operados via software e que realizam diversos serviços de forma totalmente gratuita.
Estes recursos são encontrados através do sistema de pesquisa do próprio aplicativo e funcionam de forma individual e de diferentes modos, cada com qual as suas características e funcionalidade.
Através dos bots podemos obter informações do clima, convertes arquivos para PDF, traduzir textos e diversos outros recursos que não se limitam apenas a isto, podemos por exemplo, criar nosso próprio bot e atribuímos através do ESP32 diversas funções vinculadas.
Como Criar um Bot no Telegram?
Para criarmos um Bot e trabalharmos com ele precisamos antes de mais nada falar com o “The Botfather”, uma plataforma disponibilizada para a criação de Perfis únicos e exclusivos para as mais diversificadas aplicações.
O processo para criação de um Bot é extremamente simples e pode ser obtido seguindo os passos abaixo:
1 – Em primeiro lugar vamos baixar o Telegram em nossos dispositivos e então buscar por @BotFather com o selo de verificação original ao lado, veja:
2 – Após termos aberto o perfil do BotFather vamos clicar em Começar, com isto vamos receber uma mensagem com diversas funções e então retornaremos com o seguinte comando: “/newbot”. Após enviada a mensagem recebermos a seguinte mensagem:
- Alright, a new bot. How are we going to call it? Please choose a name for your bot.
- “Tudo bem, um novo bot. Como vamos chamá-lo? Por favor, escolha um nome para o seu bot.”
3 – Agora inserimos o nome do nosso Bot, que pode ser qualquer um, utilizei “Teste do Bot” e após enviar a mensagem recebe-se o seguinte retorno:
- Good. Now let’s choose a username for your bot. It must end in
bot
. Like this, for example: TetrisBot or tetris_bot. - “Boa. Agora vamos escolher um nome de usuário para o seu bot. Deve terminar em
bot
. Assim, por exemplo: TetrisBot ou tetris_bot.”
4 – Neste momento devemos inserir o Usuário Bot, este nick deve ser único e terminar com “Bot”, caso receba uma mensagem de erro infelizmente o nick inserido já está sendo usado, caso contrário, ao final do processo você obterá um resultado semelhante a este:
Tendo isto finalizado junto com a mensagem teremos o link para o seu Bot gerado e a chave de acesso API que iremos usar posteriormente no desenvolvimento do código.
Produtos Utilizados no ESP32 Projeto Telegram
– NodeMCU ESP32 Iot com WiFi e Bluetooth – 38 Pinos;
– Cabo Micro USB 1,2m para Nodemcu ESP32;
– Módulo Relé 5V 10A 4 Canais com Optoacopladores;
– 6 Jumper Premium para Protoboard Macho-Fêmea 20 cm.
Esquema de Ligação ESP32 Projeto Telegram
O esquema de ligação do projeto é extremamente simples, a inclusão de um módulo relé possibilita o controle de, por exemplo, até 4 dispositivos elétricos como lâmpadas, cafeteiras, TV e outros.
Como vemos a baixo o esquema de ligação é extremamente simples, lembrando que os testes podem ser desenvolvidos sem a necessidade do modo relé apenas com o aplicativo, ou até mesmo com módulos com menos relés.
Vale lembrar que para o funcionamento do projeto o ESP32 precisa estar constantemente alimentado, então após a programação é recomendado que o mesmo seja atribuído a uma fonte de alimentação.
Código de Funcionamento ESP32 Projeto Telegram
O código de funcionamento é parcialmente simples, porém tem algumas partes que precisam ser alteradas antes do carregamento e que iremos verificar logo abaixo e também algumas bibliotecas precisam ser incluídas para o sucesso do carregamento.
Biblioteca WiFiClientSecure DOWNLOAD AQUI.
Biblioteca UniversalTelegramBot DOWNLOAD AQUI.
O código completo deste projeto você consegue observar logo, veja:
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
// ESP32 Projeto Telegram #include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> char ssid[] = "REDE_WIFI"; char password[] = "SENHA_WIFI"; #define BOTtoken "0000000000:000000000000000000000000000000000" #define Quarto1 0 #define Quarto2 15 #define Sala 2 #define Cozinha 4 WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); int Bot_mtbs = 1000; long Bot_lasttime; String id, text; unsigned long tempo; void setup() { Serial.begin(115200); pinMode(Quarto1, OUTPUT); pinMode(Quarto2, OUTPUT); pinMode(Sala, OUTPUT); pinMode(Cozinha, OUTPUT); Serial.print("Connecting Wifi: "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { if (millis() - tempo > 2000) { if (WiFi.status() != WL_CONNECTED) { WiFi.begin("ssid", "password"); delay(2000); } tempo = millis();//Reseta o tempo int newmsg = bot.getUpdates(bot.last_message_received + 1); for (int i = 0; i < newmsg; i++) { id = bot.messages[i].chat_id; text = bot.messages[i].text; text.toUpperCase(); // Acende a luz if (text.indexOf("ON1") > -1) { digitalWrite(Quarto1, HIGH); bot.sendMessage(id, "Luz do Quarto 1 Acesa", ""); } // Acende a luz else if (text.indexOf("ON2") > -1) { digitalWrite(Quarto2, HIGH); bot.sendMessage(id, "Luz do Quarto 2 Acesa", ""); } // Acende a luz else if (text.indexOf("ON3") > -1) { digitalWrite(Sala, HIGH); bot.sendMessage(id, "Luz da Sala Acesa", ""); } // Acende a luz else if (text.indexOf("ON4") > -1) { digitalWrite(Cozinha, HIGH); bot.sendMessage(id, "Luz da Cozinha Acesa", ""); } // Apaga a luz else if (text.indexOf("OFF1") > -1) { digitalWrite(Quarto1, LOW); bot.sendMessage(id, "Luz do Quarto 1 Apagada", ""); } // Apaga a luz else if (text.indexOf("OFF2") > -1) { digitalWrite(Quarto2, LOW); bot.sendMessage(id, "Luz do Quarto 2 Apagada", ""); } // Apaga a luz else if (text.indexOf("OFF3") > -1) { digitalWrite(Sala, LOW); bot.sendMessage(id, "Luz da Sala Apagada", ""); } // Apaga a luz else if (text.indexOf("OFF4") > -1) { digitalWrite(Cozinha, LOW); bot.sendMessage(id, "Luz da Cozinha Apagada", ""); } // Acende todas as luzes else if (text.indexOf("ON") > -1) { digitalWrite(Quarto1, HIGH); digitalWrite(Quarto2, HIGH); digitalWrite(Sala, HIGH); digitalWrite(Cozinha, HIGH); bot.sendMessage(id, "Todas Luzes Acesas", ""); } // Apaga todas as luzes else if (text.indexOf("OFF") > -1) { digitalWrite(Quarto1, LOW); digitalWrite(Quarto2, LOW); digitalWrite(Sala, LOW); digitalWrite(Cozinha, LOW); bot.sendMessage(id, "Todas Luzes Apagadas", ""); } else if (text.indexOf("START") > -1) { bot.sendSimpleMessage(id, id, ""); } else { bot.sendSimpleMessage(id, "Comando Invalido", ""); } } } } |
Neste momento vamos verificar algumas informações que precisam ser alteradas, começando com os dados da rede WiFi através das seguintes funções:
1 2 3 |
char ssid[] = "REDE_WIFI"; char password[] = "SENHA_WIFI"; |
Após alterarmos esta rede, o próximo valor a ser alterado é a API, que pode ser verificada através da seguinte variável, enquanto que o local para obtenção de dados é elencado logo abaixo através da imagem em anexo.
1 |
#define BOTtoken "0000000000:000000000000000000000000000000000" |
Com estes dados em ordem e de acordo com os dados da rede de internet e o Bot criado através do Telegram, já é possível carregar o código junto ao ESP32 para os devidos testes.
Teste de Funcionamento ESP32 Projeto Telegram
O funcionamento deste projeto junto ao aplicativo Telegram é feito através do Bot que criamos e pode ser obtido através do seguinte Link encontrado em nossa última mensagem recebida pelo BotFather, veja:
Após abrirmos o link vamos ter acesso à nossa área de envio e recebimento de dados, iniciada após clicarmos na primeira vez no botão começas, vale lembrar que após isto, esta função não precisa ser mais executada.
Como vimos junto ao código, temos as funções ON1, ON2, ON3 e ON4 que acionam de maneira isolada cada um dos relés do módulo e estão hipoteticamente associados à lâmpada de um cômodo residencial com as respectivas funções OFF1, OFF2, OFF3 e OFF4 com função inversa.
Além destas funções temos uma função geral responsável por ligar todas as lâmpadas que é o ON e uma função para desligar todas estas lâmpadas que é a função OFF. Um breve teste do funcionamento deste projeto junto ao aplicativo pode ser observado abaixo:
Caso não esteja recebendo retorno ao receber uma imagem, isto pode representar uma rede WiFi preenchida de maneira incorreta ou até mesmo o código API com algum símbolo, letra ou número inserido com algum caractere faltando.
Conclusão
Trabalhar com o Telegram é algo extremamente novo e funcional, são diversas possibilidades e funções que podem ser implementadas, é um aplicativo de fácil obtenção, disponível para download de forma gratuita e que facilita além da programação o acesso as informações.
Além da função de automação utilizada para o acionamento de Relés, é possível utilizarmos o sistema Bot para a obtenção de informações externas via sensor de temperatura, por exemplo, ou até mesmo associado a um sensor de presença para notificação de movimentos em um dado local.
Se você gostou deste projeto ou tem alguma sugestão para nossos próximos Artigos não esqueça de deixar o seu comentário abaixo. Até a Próxima!
Não consigo sair desse erro
error: ‘keyboardBuffer’ was not declared in this scope
DynamicJsonBuffer keyboardBuffer;
Bom Dia Marco! Infelizmente não reconheço a variável “keyboardBuffer” nem sua aplicação uma vez que não a utilizei no meu projeto, verifique a sua aplicação, ao que parece o Arduino não reconhece como um elemento declarado, ele não foi introduzido antes da sua utilização.
Boa noite, amigo posso usar ESP8266 no lugar do NodeMCU ESP32
Boa Tarde Marcelo! É possível realizar devidos ajustes para utilização do ESP8266, porém alguns detalhes do projeto irão mudar também.
Caso eu queria fazer uma automação, como limito outros usuários a não usar bot QUE CRIEI? Existe possibilidade?
Boa Tarde Diego! Ao criar um Bot, ele é unicamente utilizado por você, tanto que para criar um, ninguém pode ter utilizado este nome antes.
Bom dia Matheus ficou ótima e funcional a automação 🙂
Tenho um caso que gostaria que vc me desse uma LUZ(literalmente),
qdo os interruptores da cas tem que funcionar estao em conjunto, exemplo luz da cozinha, pensei em interruptores
paralelos, blz funcionou com o rele, mas neste caso como saber se a LUZ ja esta acesa ?
Ai é que a coisa engrena, vc teria uma idea de como fazer? Pensei em um sensor de corrente..
Boa Tarde Joel! A utilização de uma ligação em paralelo neste caso é muito útil, porém realmente retira a nossa autonomia de controle. Uma das opção mais viáveis provavelmente seja a inclusão de um sensor de corrente ou até mesmo de um sensor de tensão para a verificação do dado desejado, porém vale verificar o local de instalação e demais detalhes de compatibilidade.
Bom dia Matheus, testei o seu código e verifiquei que a resposta aos comandos são sempre em duplicado. Alguma explicação?
Obrigado.
OFF1
Luz do Quarto 1 Apagada
Luz do Quarto 1 Apagada
ON2
Luz do Quarto 2 Acesa
Luz do Quarto 2 Acesa
Bom Dia Carlos! Estranho isto estar acontecendo, se observar o print que inclui no projeto, isto não aconteceu comigo quando desenvolvi o projeto, você não fez nenhuma alteração no código base?
Bom dia Matheus, estou fazendo um projeto com boia de nível de água que preciso ser avisando quando um pino receber um sinal alto, ou seja quando a boia for acionada. Qual mudança eu deveria fazer?
Olá Ulysses! Temos um projeto que executa quase a mesma coisa que necessita, caso queira adaptá-lo para utilizar com Telegram, deverá realizar os devidos ajustes, mas o projeto citado é o que segue: https://www.usinainfo.com.br/blog/sensor-de-nivel-de-agua-arduino-para-automacao-com-rele-e-display/
Eu fiz este projeto e deu algumas mensagem de erro, que acreditei que fosse defeito da placa e enviei ela para a loja onde comprei e não era defeito e montei novamente e não deu certo. Talvez seja por que estou usando um módulo de dois relés. Me ajudem aí, as mensagens de erro são: Arduino: 1.8.13 (Windows 10), Placa:”NodeMCU 1.0 (ESP-12E Module), 80 MHz, Serial, 115200, 4M (1M SPIFFS)”
In file included from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/static_array.hpp:11:0,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/FloatTraits.hpp:14,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/convertNumber.hpp:18,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Variant/VariantData.hpp:9,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Variant/SlotFunctions.hpp:8,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Array/ArrayIterator.hpp:7,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Array/ArrayRef.hpp:8,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.hpp:17,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.h:9,
from C:\Users\Altamiro\Documents\Arduino\libraries\CTBot\src/CTBotInlineKeyboard.h:15,
from C:\Users\Altamiro\Documents\Arduino\libraries\CTBot\src/CTBot.h:7,
from C:\Users\Altamiro\Documents\Arduino\COMUNICAwifi\COMUNICAwifi.ino:1:
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp: In function ‘typename ArduinoJson6173_D1::enable_if<ArduinoJson6173_D1::is_pointer::value, T>::type ArduinoJson6173_D1::pgm_read(const void*)’:
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp:14:44: error: there are no arguments to ‘pgm_read_ptr’ that depend on a template parameter, so a declaration of ‘pgm_read_ptr’ must be available [-fpermissive]
return reinterpret_cast(pgm_read_ptr(p));
^
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp:14:44: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
In file included from C:\Users\Altamiro\Documents\Arduino\COMUNICAwifi\COMUNICAwifi.ino:14:0:
C:\Users\Altamiro\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.1.0\libraries\ESP8266WiFi\src/WiFiClientSecure.h: At global scope:
C:\Users\Altamiro\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.1.0\libraries\ESP8266WiFi\src/WiFiClientSecure.h:34:3: error: ‘WiFiClientSecure::~WiFiClientSecure()’ marked override, but does not override
~WiFiClientSecure() override;
^
C:\Users\Altamiro\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.1.0\libraries\ESP8266WiFi\src/WiFiClientSecure.h:49:10: error: ‘size_t WiFiClientSecure::peekBytes(uint8_t*, size_t)’ marked override, but does not override
size_t peekBytes(uint8_t *buffer, size_t length) override;
^
C:\Users\Altamiro\Documents\Arduino\COMUNICAwifi\COMUNICAwifi.ino: In function ‘void setup()’:
COMUNICAwifi:45:8: error: ‘class WiFiClass’ has no member named ‘mode’
WiFi.mode(WIFI_STA);
^
COMUNICAwifi:45:13: error: ‘WIFI_STA’ was not declared in this scope
WiFi.mode(WIFI_STA);
^
In file included from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/static_array.hpp:11:0,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/FloatTraits.hpp:14,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Numbers/convertNumber.hpp:18,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Variant/VariantData.hpp:9,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Variant/SlotFunctions.hpp:8,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Array/ArrayIterator.hpp:7,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Array/ArrayRef.hpp:8,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.hpp:17,
from C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson.h:9,
from C:\Users\Altamiro\Documents\Arduino\libraries\CTBot\src/CTBotInlineKeyboard.h:15,
from C:\Users\Altamiro\Documents\Arduino\libraries\CTBot\src/CTBot.h:7,
from C:\Users\Altamiro\Documents\Arduino\COMUNICAwifi\COMUNICAwifi.ino:1:
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp: In instantiation of ‘typename ArduinoJson6173_D1::enable_if<ArduinoJson6173_D1::is_pointer::value, T>::type ArduinoJson6173_D1::pgm_read(const void*) [with T = const __FlashStringHelper*; typename ArduinoJson6173_D1::enable_if<ArduinoJson6173_D1::is_pointer::value, T>::type = const __FlashStringHelper*]’:
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Deserialization/DeserializationError.hpp:103:12: required from here
C:\Users\Altamiro\Documents\Arduino\libraries\ArduinoJson\src/ArduinoJson/Polyfills/pgmspace_generic.hpp:14:44: error: ‘pgm_read_ptr’ was not declared in this scope
return reinterpret_cast(pgm_read_ptr(p));
^
exit status 1
‘class WiFiClass’ has no member named ‘mode’
Este relatório teria mais informações com
“Mostrar a saida detalhada durante a compilação”
opção pode ser ativada em “Arquivo -> Preferências”
Olá Altamiro! Pelo que pude observar você está utilizando a configuração “Placa: NodeMCU 1.0 (ESP-12E Module)” porém para projetos com o ESP32, o correto seria utilizar a “Porta: ESP32 Dev Module”. Verifique esta configuração e tente novamente, acredito que irá resolver o problema.
Boa noite Matheus
o telegram não est´funcionando
sabe me dizer a respeito??
Olá Italo! A princípio não estou sabendo de nenhuma atualização que tenha desabilitado as funções, se já utilizava antes e agora começou a dar defeito, sugiro desinstalar e instalar de novo ou verificar a necessidade de alguma atualização por parte do aplicativo.
Olá Matheus. Primeiramente obrigado por compartilhar conosco essa solução. Preciso implementar um trabalho para o projeto de fim de ano da minha escola. Você conhece algum módulo que eu possa medir a força de atrito? Queria colocar um objeto sob uma rampa e o dados fosse compartilhados via telegram.
Olá Sandro! Infelizmente nunca realizei nenhum projeto com base neste estudo de cálculo, porém recomendo estudar aplicações de fórmulas em soluções práticas, como verificar o tempo de deslocamento de um objeto de massa conhecida em uma superfície inclinada e aplicação de fórmulas, este procedimento seria facilmente executado através de um sensor ultrassônico, por exemplo, diferentes variáveis podem ser obtidas de diferentes formas, espero que esta informação tenha sido útil para um direcionamento ao seu projeto, ao menos.
Boa tarde antes de mais nada parabens pelo projeto , teria como acrescentar neste projeto 2 sensores de temperatura
Olá Marcelo! Algumas alterações teriam que ser feitas no código, porém acredito que seja possível, claro que existem fatores de compatibilidade que precisam ser verificados.
Bom dia, o esp32 tem sinal de 3.3V nas portas mas o rele trabalha com sinal de 5V.
Via acionar de boa ou não seria melhor um rele de 3V?
olá.
queria saber se tem como enviar mensagens para mais de um celular.
exe. um sensor na porta, eu e minha esposa seriamos notificados caso a porta fosse aberta
Olá André Costa.
Sim é possível modificar o código para isto, pode utilizar a ajuda de uma IA como o Chat GPT para ajudar a adaptar o código.