Aprenda a controlar um ESP32 a partir da Telegram app no seu telemóvel. Com este código pode, por exemplo, ligar luzes e pedir o estado de sensores ou interruptores enviando mensagens da app Telegram para um ESP32.
O código de demonstração mostra como ligar e desligar um LED, e como ler o estado de um interruptor ligado ao seu ESP32.
Peças Necessárias
Abaixo encontra os componentes necessários. Usei uma placa ESP32 mais antiga, que já foi descontinuada, mas ainda pode ser adquirida a um preço muito baixo. No entanto, qualquer outro ESP32 também funcionará perfeitamente.
Também vai precisar de um LED, um resistor de 220 Ohm e um interruptor ou botão de pressão.

ESP32 lite

Cabo USB de Dados

Conjunto de Fios Dupont

Breadboard

Kit de Resistores & LED
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Ligação do LED e Interruptor ao ESP32
Queremos usar a app Telegram no nosso telemóvel para definir ou ler os pinos GPIO num ESP32. Para demonstrar como isto funciona, vamos ligar um LED e um interruptor ao ESP32. A imagem seguinte mostra o circuito:

O LED está ligado ao GPIO 33 e o interruptor ao GPIO 14. Pode escolher outros pinos, mas certifique-se de ajustar as constantes no código seguinte, conforme necessário. A imagem abaixo mostra como o liguei numa breadboard:

Criar Bot Telegram
Antes de poder enviar mensagens da app Telegram no seu telemóvel para um ESP32, precisa de criar um bot Telegram. Se nunca fez isto antes, o ESP32 send Telegram Message tutorial explica em detalhe.
O mais importante é que vamos precisar do token do bot, que se parece com isto 1234567811:fakeIodw9023sjjoj982qe23dSSDCDDDSSxx e do seu user ID, que se parece com isto 7221435846. Ambas as constantes serão necessárias no código e são específicas para o seu bot.
Reiniciar o Bot
Se já criou um bot e quer reiniciar o histórico de chat, abra o menu no canto superior direito e clique em Clear History:

Isto abrirá um diálogo onde precisa de confirmar a ação. O nome do meu bot é Marvin4, que é o que vê na captura de ecrã seguinte do diálogo:

Depois disso, o bot mostra um botão Start na parte inferior que pode clicar. Quando iniciado, o bot mostrará novamente os comandos disponíveis.

Código para controlar ESP32 via Telegram
Antes de poder executar o código seguinte no ESP32, precisa de instalar a UniversalTelegramBot Library. Esta biblioteca simplifica o código necessário para a comunicação entre o Telegram e o ESP32.
Para instalar a biblioteca, abra o LIBRARY MANAGER do Arduino IDE, pesquise por ‘UniversalTelegramBot’ e clique no botão INSTALL. Após uma instalação bem-sucedida, deverá ver a biblioteca instalada:

O sketch Arduino abaixo mostra como usar um ESP32 para comunicar com um bot Telegram que pode controlar um LED e ler o estado de um interruptor remotamente via mensagens Telegram.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";
const byte LED_PIN = 33;
const byte SW_PIN = 14;
const char* info =
"Commands:\n\n"
"/led_on set LED on\n"
"/led_off set LED off\n"
"/led_toggle toggle LED\n"
"/sw_state get switch state\n";
WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);
int getNumMessages() {
return bot.getUpdates(bot.last_message_received + 1);
}
void handleNewMessages(int numMessages) {
for (int i = 0; i < numMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID) continue;
String text = bot.messages[i].text;
Serial.println(text);
if (text == "/start") {
bot.sendMessage(chat_id, info, "");
}
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED is ON", "");
digitalWrite(LED_PIN, HIGH);
}
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED is OFF", "");
digitalWrite(LED_PIN, LOW);
}
if (text == "/led_toggle") {
bool state = digitalRead(LED_PIN);
const char* message = state ? "LED off" : "LED on";
bot.sendMessage(chat_id, message, "");
digitalWrite(LED_PIN, state ? LOW : HIGH);
}
if (text == "/sw_state") {
bool state = digitalRead(SW_PIN);
const char* message = state ? "Switch is ON" : "Switch is OFF";
bot.sendMessage(chat_id, message, "");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(100);
}
void loop() {
while (int numMessages = getNumMessages()) {
handleNewMessages(numMessages);
}
delay(1000);
}
Inclusão das Bibliotecas Necessárias
As primeiras linhas do código incluem as bibliotecas necessárias:
#include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h>
Estas são essenciais para o ESP32 se ligar ao Wi-Fi e comunicar com o Telegram de forma segura usando HTTPS. WiFi.h é usada para conectar à rede sem fios, WiFiClientSecure.h permite comunicação segura via HTTPS, e UniversalTelegramBot.h fornece uma interface conveniente para interagir com a API do Telegram Bot.
Definição de Credenciais e Pinos
O código define as credenciais Wi-Fi, o token do bot Telegram e o ID do chat Telegram:
const char* SSID = "xxxx"; const char* PASSWORD = "xxxx"; const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx"; const String CHAT_ID = "xxxx";
Substitua estes espaços reservados pelo nome e senha reais do seu Wi-Fi, pelo token do seu bot e pelo ID do chat com o seu User ID.
De seguida, definimos os pinos GPIO para o LED e o interruptor. O GPIO 33 está configurado como saída para o LED, e o GPIO 14 é usado como entrada com resistor pull-up para o interruptor.
const byte LED_PIN = 33; const byte SW_PIN = 14;
A string seguinte contém uma mensagem de ajuda que será mostrada quando o /start comando for recebido. Como pode ver, teremos comandos para ligar, desligar ou alternar o LED e para obter o estado do interruptor:
const char* info = "Commands:\n\n" "/led_on set LED on\n" "/led_off set LED off\n" "/led_toggle toggle LED\n" "/sw_state get switch state\n";
Inicialização do Bot
O bot é criado com o token e um cliente seguro:
WiFiClientSecure client; UniversalTelegramBot bot(BOT_TOKEN, client);
WiFiClientSecure permite que o bot comunique de forma segura com os servidores Telegram via HTTPS.
Obter Novas Mensagens
A função getNumMessages() verifica se novas mensagens foram recebidas pelo bot:
int getNumMessages() {
return bot.getUpdates(bot.last_message_received + 1);
}
O método bot.getUpdates() busca todas as atualizações a partir da última mensagem recebida, garantindo que as mensagens são processadas uma única vez.
Processamento de Comandos
A função handleNewMessages() é responsável por processar cada nova mensagem. Apenas mensagens do CHAT_ID predefinido são processadas para evitar acessos indesejados.
void handleNewMessages(int numMessages) {
for (int i = 0; i < numMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID) continue;
O bot compara o texto do comando e executa as ações correspondentes:
if (text == "/start") {
bot.sendMessage(chat_id, info, "");
}
Quando o utilizador envia /start, o bot responde com a lista de comandos disponíveis.

Nas linhas seguintes do código tratamos os diferentes comandos.
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED is ON", "");
digitalWrite(LED_PIN, HIGH);
}
O comando /led_on liga o LED e confirma a ação via mensagem.
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED is OFF", "");
digitalWrite(LED_PIN, LOW);
}
De forma semelhante, o comando /led_off desliga o LED.
if (text == "/led_toggle") {
bool state = digitalRead(LED_PIN);
const char* message = state ? "LED off" : "LED on";
bot.sendMessage(chat_id, message, "");
digitalWrite(LED_PIN, state ? LOW : HIGH);
}
O comando /led_toggle combina essencialmente os comandos /led_on e /led_off. Lê o estado atual do LED e inverte-o. Depois envia uma mensagem de estado ao utilizador.
if (text == "/sw_state") {
bool state = digitalRead(SW_PIN);
const char* message = state ? "Switch is ON" : "Switch is OFF";
bot.sendMessage(chat_id, message, "");
}
Finalmente, o comando /sw_state lê o estado do interruptor e informa o utilizador se o interruptor está aberto (HIGH) ou pressionado (LOW, interpretado como DESLIGADO devido ao pull-up).
Pode clicar nos links da lista de comandos para executar estas ações. A captura de ecrã seguinte mostra como é uma conversa que envia comandos via Telegram para o ESP32:

Pode ver os comandos que envio via Telegram à direita e as respostas do ESP32 à esquerda.
Função Setup
Na função setup(), a comunicação serial é inicializada para depuração:
Serial.begin(115200);
Depois, os pinos GPIO são configurados:
pinMode(LED_PIN, OUTPUT); pinMode(SW_PIN, INPUT_PULLUP);
O pino do interruptor usa INPUT_PULLUP, o que significa que não precisamos de um resistor pull-up externo ao ligar o interruptor.
O certificado para o Telegram é definido para garantir comunicação segura via HTTPS:
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
Depois, o Wi-Fi é ligado num ciclo bloqueante:
WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) delay(100);
Isto garante que o dispositivo não avança até estabelecer uma ligação de rede.
Loop Principal
A função loop() verifica constantemente se há novas mensagens:
while (int numMessages = getNumMessages()) {
handleNewMessages(numMessages);
}
delay(1000);
Busca quaisquer novas mensagens Telegram, processa-as e depois espera 1 segundo antes de verificar novamente.
Conclusão
Neste artigo aprendeu a controlar um LED e a ler o estado de um interruptor enviando mensagens da sua Telegram app no seu telemóvel para um ESP32.
Se isto for um pouco complexo, dê uma vista de olhos ao nosso ESP32 send Telegram Message tutorial, que explica os conceitos básicos de enviar e receber mensagens via Telegram com mais detalhe.
Se tiver alguma dúvida, sinta-se à vontade para deixar nos comentários.
Boas experiências ; )

