domingo, 18 de enero de 2026

control y monitoreo por mensajeria de telegram curso iot con esp32 No16



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", "");
    }
  }
}