Aprende a controlar un ESP32 desde la Telegram app en tu teléfono. Con este código puedes, por ejemplo, encender luces y solicitar el estado de sensores o interruptores enviando mensajes desde tu app de Telegram a un ESP32.
El código de demostración te mostrará cómo encender y apagar un LED, y cómo leer el estado de un interruptor conectado a tu ESP32.
Piezas necesarias
A continuación encontrarás los componentes requeridos. Usé una placa ESP32 antigua, que ya está obsoleta pero aún puedes conseguirla a muy bajo precio. Sin embargo, cualquier otro ESP32 funcionará perfectamente.
También necesitarás un LED, una resistencia de 220 Ohmios y un interruptor o pulsador.

ESP32 lite

Cable USB de datos

Juego de cables Dupont

Protoboard

Kit de resistencias y 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.
Conexión del LED y el interruptor al ESP32
Queremos usar la app de Telegram en nuestro teléfono para configurar o leer pines GPIO en un ESP32. Para demostrar cómo funciona, vamos a conectar un LED y un interruptor al ESP32. La siguiente imagen muestra el circuito:

El LED está conectado al GPIO 33 y el interruptor al GPIO 14. Puedes elegir otros pines, pero asegúrate de ajustar las constantes en el código siguiente en consecuencia. La imagen muestra cómo lo conecté en una protoboard:

Crear un bot de Telegram
Antes de poder enviar mensajes desde la app de Telegram en tu teléfono a un ESP32, necesitarás crear un bot de Telegram. Si no lo has hecho antes, el ESP32 send Telegram Message tutorial lo explica en detalle.
Lo más importante es que necesitaremos el token del bot, que tiene un formato similar a este 1234567811:fakeIodw9023sjjoj982qe23dSSDCDDDSSxx, y tu ID de usuario, que se ve así 7221435846. Ambas constantes serán necesarias en el código y serán específicas para tu bot.
Reiniciar el bot
Si ya has creado un bot y quieres reiniciar su historial de chat, abre el menú en la esquina superior derecha y haz clic en Borrar historial:

Esto abrirá un diálogo donde debes confirmar la acción. El nombre de mi bot es Marvin4, que es lo que ves en la siguiente captura del diálogo:

Después, el bot mostrará un botón de Inicio en la parte inferior que puedes pulsar. Al iniciarlo, el bot mostrará nuevamente los comandos disponibles.

Código para controlar ESP32 vía Telegram
Antes de poder ejecutar el siguiente código en el ESP32, necesitarás instalar la UniversalTelegramBot Library. Esta simplifica el código necesario para la comunicación entre Telegram y el ESP32.
Para instalar la librería, abre el LIBRARY MANAGER del Arduino IDE, busca ‘UniversalTelegramBot’ y luego haz clic en el botón INSTALL. Tras una instalación exitosa deberías ver la librería instalada:

El sketch de Arduino a continuación te muestra cómo usar un ESP32 para comunicarte con un bot de Telegram que puede controlar un LED y leer el estado de un interruptor remotamente vía mensajes de 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);
}
Incluir librerías necesarias
Las primeras líneas del código incluyen las librerías necesarias:
#include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h>
Estas son esenciales para que el ESP32 se conecte a Wi-Fi y se comunique con Telegram de forma segura usando HTTPS. WiFi.h se usa para conectar a la red inalámbrica, WiFiClientSecure.h habilita la comunicación segura HTTPS, y UniversalTelegramBot.h proporciona una interfaz conveniente para interactuar con la API del bot de Telegram.
Definir credenciales y pines
Luego el código define las credenciales Wi-Fi, el token del bot de Telegram y el ID de chat de Telegram:
const char* SSID = "xxxx"; const char* PASSWORD = "xxxx"; const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx"; const String CHAT_ID = "xxxx";
Reemplaza estos marcadores con el nombre y contraseña reales de tu Wi-Fi, tu token de bot y el ID de chat con tu ID de usuario.
A continuación definimos los pines GPIO para el LED y el interruptor. GPIO 33 está configurado como salida para el LED, y GPIO 14 se usa como entrada con resistencia pull-up para el interruptor.
const byte LED_PIN = 33; const byte SW_PIN = 14;
La siguiente cadena contiene un mensaje de ayuda que se mostrará cuando se reciba el/startcomando. Como ves, tendremos comandos para encender, apagar o alternar el LED y para obtener el estado del 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";
Inicializar el bot
El bot se crea con el token y un cliente seguro:
WiFiClientSecure client; UniversalTelegramBot bot(BOT_TOKEN, client);
WiFiClientSecure permite que el bot se comunique de forma segura con los servidores de Telegram vía HTTPS.
Obtener nuevos mensajes
La getNumMessages() función verifica si el bot ha recibido nuevos mensajes:
int getNumMessages() {
return bot.getUpdates(bot.last_message_received + 1);
}
El método bot.getUpdates() obtiene todas las actualizaciones desde el último mensaje recibido, asegurando que los mensajes se procesen una sola vez.
Procesar comandos
La handleNewMessages() función se encarga de procesar cada mensaje nuevo. Solo se procesan mensajes del CHAT_ID predefinido para evitar accesos no deseados.
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;
Luego el bot compara el texto del comando y realiza las acciones correspondientes:
if (text == "/start") {
bot.sendMessage(chat_id, info, "");
}
Cuando el usuario envía /start, el bot responde con la lista de comandos disponibles.

En las siguientes líneas de código manejamos los diferentes comandos.
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED is ON", "");
digitalWrite(LED_PIN, HIGH);
}
El comando /led_on enciende el LED y confirma la acción mediante un mensaje.
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED is OFF", "");
digitalWrite(LED_PIN, LOW);
}
De forma similar, el comando /led_off apaga el 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);
}
El comando /led_toggle combina esencialmente los comandos /led_on y /led_off. Lee el estado actual del LED y lo invierte. Luego envía un mensaje de estado al usuario.
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, el comando /sw_state lee el estado del interruptor e informa al usuario si el interruptor está abierto (HIGH) o presionado (LOW, interpretado como APAGADO debido al pull-up).
Puedes hacer clic en los enlaces de la lista de comandos para ejecutar estas acciones. La siguiente captura muestra cómo se ve un chat que envía comandos vía Telegram al ESP32:

Puedes ver los comandos que envío vía Telegram a la derecha y las respuestas del ESP32 a la izquierda.
Función setup
En la función setup() se inicializa la comunicación serial para depuración:
Serial.begin(115200);
Luego se configuran los pines GPIO:
pinMode(LED_PIN, OUTPUT); pinMode(SW_PIN, INPUT_PULLUP);
El pin del interruptor usa INPUT_PULLUP, lo que significa que no necesitamos una resistencia pull-up externa al conectar el interruptor.
Se establece el certificado para Telegram para asegurar la comunicación HTTPS segura:
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
Luego se conecta al Wi-Fi en un bucle bloqueante:
WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) delay(100);
Esto asegura que el dispositivo no continúe hasta que haya establecido una conexión de red.
Bucle principal
La función loop() verifica constantemente si hay nuevos mensajes:
while (int numMessages = getNumMessages()) {
handleNewMessages(numMessages);
}
delay(1000);
Obtiene cualquier mensaje nuevo de Telegram, los procesa y luego espera 1 segundo antes de volver a comprobar.
Conclusión
En este post aprendiste a controlar un LED y a leer el estado de un interruptor enviando mensajes desde tu Telegram app en tu móvil a un ESP32.
Si esto te parece un poco complejo, echa un vistazo a nuestro ESP32 send Telegram Message tutorial, que explica con más detalle los conceptos básicos de enviar y recibir mensajes vía Telegram.
Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.
¡Feliz bricolaje ; )

