codigo bien explicado
/*************************************************
* ESP32 - CONTROL DE LED Y PULSADOR CON TELEGRAM
* Código educativo y fácil de explicar
* Repositorio de la librería Telegram usada:
* https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
* https://t.me/botfather
* Bot para obtener tu Chat ID:
* https://t.me/myidbot → escribe /getid
* Repositorio de ArduinoJson:
* https://github.com/bblanchon
*************************************************/
// ---------- LIBRERÍAS ----------
// Librería para manejar la conexión WiFi del ESP32
#include <WiFi.h>
// Librería para manejar conexiones seguras HTTPS (necesaria para Telegram)
#include <WiFiClientSecure.h>
// Librería para interactuar con bots de Telegram
#include <UniversalTelegramBot.h>
// ---------- WIFI ----------
// Nombre de la red WiFi a la que se conectará el ESP32
const char* ssid = "NOMBRE_DE_TU_WIFI";
// Contraseña de la red WiFi
const char* password = "CONTRASEÑA_DE_TU_WIFI";
// ---------- TELEGRAM ----------
// Token del bot de Telegram (entregado por BotFather)
#define BOT_TOKEN "AQUI_TU_TOKEN"
// ID del chat autorizado para controlar el ESP32
#define CHAT_ID "AQUI_TU_CHAT_ID"
// Cliente seguro para comunicación HTTPS
WiFiClientSecure client;
// Objeto bot que manejará la comunicación con Telegram
UniversalTelegramBot bot(BOT_TOKEN, client);
// ---------- PINES ----------
// Pin donde está conectado el LED (GPIO 2)
const int ledPin = 2;
// Pin donde está conectado el pulsador (GPIO 4)
const int buttonPin = 4;
// ---------- VARIABLES ----------
// Guarda el estado anterior del botón (HIGH = no presionado)
bool estadoBotonAnterior = HIGH;
// Variable para controlar el tiempo entre lecturas de Telegram
unsigned long lastTime = 0;
// Intervalo de tiempo para revisar mensajes (1000 ms = 1 segundo)
const unsigned long intervalo = 1000;
// ---------- FUNCIÓN SETUP ----------
void setup() {
// Inicializa la comunicación serial para depuración
Serial.begin(115200);
// Configura el pin del LED como salida
pinMode(ledPin, OUTPUT);
// Configura el pin del pulsador como entrada con resistencia pull-up interna
pinMode(buttonPin, INPUT_PULLUP);
// Asegura que el LED inicie apagado
digitalWrite(ledPin, LOW);
// Mensaje en el monitor serial indicando inicio de conexión WiFi
Serial.print("Conectando a WiFi");
// Inicia la conexión WiFi con SSID y contraseña
WiFi.begin(ssid, password);
// Espera hasta que el ESP32 se conecte al WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500); // Espera 500 ms
Serial.print("."); // Muestra puntos mientras conecta
}
// Indica que la conexión WiFi fue exitosa
Serial.println("\n WiFi conectado");
// Muestra la IP asignada al ESP32
Serial.println(WiFi.localIP());
// Desactiva la verificación del certificado HTTPS (simplifica el uso de Telegram)
client.setInsecure();
// Envía un mensaje inicial al chat de Telegram indicando que el ESP32 está listo
bot.sendMessage(
CHAT_ID,
"🤖 ESP32 listo\n"
"Comandos:\n"
"/on Encender LED\n"
"/off Apagar LED",
""
);
}
// ---------- FUNCIÓN LOOP ----------
void loop() {
// ---------- REVISAR MENSAJES DE TELEGRAM ----------
// Verifica si ya pasó el intervalo de tiempo definido
if (millis() - lastTime > intervalo) {
// Obtiene los nuevos mensajes desde el último recibido
int numMensajes = bot.getUpdates(bot.last_message_received + 1);
// Mientras existan mensajes pendientes
while (numMensajes) {
// Procesa los mensajes recibidos
manejarMensajes(numMensajes);
// Vuelve a verificar si llegaron más mensajes
numMensajes = bot.getUpdates(bot.last_message_received + 1);
}
// Actualiza el tiempo de la última revisión
lastTime = millis();
}
// ---------- REVISAR PULSADOR ----------
// Lee el estado actual del pulsador
bool estadoBotonActual = digitalRead(buttonPin);
// Detecta la transición de NO presionado (HIGH) a presionado (LOW)
if (estadoBotonAnterior == HIGH && estadoBotonActual == LOW) {
// Envía un mensaje a Telegram indicando que el botón fue presionado
bot.sendMessage(CHAT_ID, "🔘 Pulsador presionado", "");
// Retardo simple para evitar rebotes del pulsador
delay(300);
}
// Guarda el estado actual del botón para la próxima lectura
estadoBotonAnterior = estadoBotonActual;
}
// ---------- FUNCIÓN PARA MANEJAR MENSAJES DE TELEGRAM ----------
void manejarMensajes(int numMensajes) {
// Recorre todos los mensajes recibidos
for (int i = 0; i < numMensajes; i++) {
// Obtiene el ID del chat que envió el mensaje
String chat_id = bot.messages[i].chat_id;
// Obtiene el texto del mensaje recibido
String texto = bot.messages[i].text;
// ---------- SEGURIDAD BÁSICA ----------
// Si el mensaje no proviene del chat autorizado
if (chat_id != CHAT_ID) {
// Envía mensaje de acceso denegado
bot.sendMessage(chat_id, "⛔ Acceso no autorizado", "");
// Salta al siguiente mensaje
continue;
}
// ---------- COMANDO /on ----------
// Si el usuario escribe "/on"
if (texto == "/on") {
// Enciende el LED
digitalWrite(ledPin, HIGH);
// Envía confirmación por Telegram
bot.sendMessage(chat_id, "💡 LED ENCENDIDO", "");
}
// ---------- COMANDO /off ----------
// Si el usuario escribe "/off"
if (texto == "/off") {
// Apaga el LED
digitalWrite(ledPin, LOW);
// Envía confirmación por Telegram
bot.sendMessage(chat_id, "🌑 LED APAGADO", "");
}
}
}