viernes, 14 de julio de 2017

Nodemcu + BOT Telegram

Que tal queridos lectores, antes de empezar esta entrada me quiero disculpar por haberme ausentado tanto tiempo, pero ya regrese y con mas ganas que nunca!!!
Bueno basta de bla, bla, bla y vamos con la practica.

Si bien ya habia hecho un post en donde desarrollabamos un BOT de Telegram para Arduino, aqui traigo una actualizacion. Si recuerdan en el post que les comento usamos Python para crear un script que se encargaba de enviar comandos a el BOT, en esta ocasion vamos a hacerlo todo desde el mismo IDE de Arduino peeeeeeero ahora usando la placa NODEMCU que tiene integrado el chip ESP8266, les dejo informacion de esta aplaca en este enlace, (http://nodemcu.com/index_en.html).

Para esta practica usaremos los siguientes materiales:

1 NODEMCU (yo en concreto uso la version 1.0).
1 LED cualquier color.
1 Sensor magnetico. (como este!)
Conexion WIFI.

Manos a la obra...

Lo primero que tenemos que hacer es descargar Telegram. En este link están todas las versiones, para móviles y Desktop.
Descarga Telegram.
En mi caso usare la aplicación para Windows.

Una vez instalada y que ya se registraron tienen que iniciar una conversación con @BotFather(es como el jefe de todos los Bots) para hacerlo solo tienen que seguir este link BotFather o bien buscarlo dentro de sus contactos en Telegram.
Cuando se abra la ventana de conversación tienen que escribir el comando /start y así iniciara la conversación con @BotFather. Enseguida les mostrara una lista de comandos.

Ahora enviaremos el comando /newbot para empezar a crear el Bot. Después de introducir este comando nos preguntara el nombre y el nickname que aparecerá en los chats, en caso de que ya exista un Bot llamado igual lo dirá y tendremos que elegir otro.

Si todo ha ido bien ya hemos creado nuestro Bot satisfactoriamente.

En el mensaje de respuesta nos dara el "TOKEN" para accesar a nuestro Bot desde la API, hay que guardarlo para su posterior uso.

Bien, dejemos a un lado Telegram para ir a programar Arduino.
El código es muy sencillo, de todas formas se los dejo explicado linea por linea.

Antes tendremos que instalar 3 librerias externas a el IDE de Arduino en caso de no tenerlas, estas son:

ESP8266WiFi.h
WiFiClientSecure.h
UniversalTelegramBot.h

Para hacerlo ve a ESTE LINK donde explico en unos cuantos pasos como lograrlo.

Diagrama de conexion:


Despues de tener las librerias instaladas vamos a cargar el siguiente sketch a nuestra placa.


Hay que asegurarnos de poner las credenciales de tu conexion WIFI asi como el Token de el BOT que se genero al momento de crearlo.

Si todo ha salido bien ya podemos empezar a interactuar con nuestro BOT.
Para empezar a hacerlo primero tenemos que escribir /start en telegram y veremos la respuesta de el BOT.
Seguido de esto escribimos /opciones para que el BOT nos muestre las opciones disponibles. El BOT nos desplegara unos botones con las opciones disponibles como se muestra en la siguiente imagen.

Otra caracteristica es que en el momento en el que el sensor magnetico se despegue, el BOT nos mandara un mensaje de advertencia.

Pueden modificar los textos que el BOT nos envia e incluso agregar mas opciones modificando el codigo.
No duden en compartir su experiencia con esta practica.

Hasta aqui este aporte, espero haberme explicado bien y recuerden que si les surge alguna duda escribanla en los comentarios para resolverla juntos.

PD: Les debo el video de demostracion!!! XD

36 comentarios:

  1. Buenisima, saludos desde el grupo de whatsapp!

    ResponderBorrar
  2. Genial!! excelente propuesta de trabajo para adaptar a la necesidad. 1000 Gracias

    ResponderBorrar
  3. Excelente tutorial. Estoy interesado en encender un led con ifttt usando el nodeMCU. Investigando en la web, ifttt se puede configurar fácilmente para publicar un twit con esp8266.

    Con ésa info. y habiendo visto éste excelente tutoríal pensé en que quizá podían solventar la idea de encender un led cuando un usuario ingresa a un área determinada mediante las recetas de localización ifttt. ¿es posible?

    ¡Gracias por la atención!

    ResponderBorrar
    Respuestas
    1. Hola. Gracias por comentar.
      Te comento que recien me ha llegado esta maravillosa placa.
      Es por eso que hare una serie de tutoriales relacionados con el IoT.
      En los cuales se encuentran practicas con IFTTT, App Inventor, Firebase, Blynk y algunas otras plataformas.
      Este atento a las siguientes entradas.

      Borrar
  4. Hola. empecé a probar tu aporte pero no logro ver/entender la ultima parte. Cargue el skecth en mi placa, con los datos de mi red y el token del bot pero no veo como seguir, donde pone /start u /opciones. donde debo poner eso? Veo que lo escribiste en arduino center. Yo debo hacer en mi propia cuenta? Cuando va a hacer algún video practico? Debo seguir a ArduinoCenter?

    ResponderBorrar
    Respuestas
    1. Hola Alejandro!
      Tienes razon tal vez omiti ese paso, despues de haber creado el BOT tienes que empezar una conversacion con el, buscandolo en tu lista de contactos de Telegram y enviando el comando /start

      Borrar
  5. Hola amigos exelente si funciona,eso si cuando tengan todo configurado y cargado en la placa nodemcu y el telegram tienen que buscar el bot que ustedes crearon ejemplo Botlaura y luego escribir /start automaticamente contesta arduino center aclara aqui en los comentarios...ojo con eso cualquier inquietud dejen su mensaje en https://electronicadelfuturo2020.jimdo.com/contacto/
    y congusto les colaboramos gracias a arduino center buena por esa...

    ResponderBorrar
  6. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  7. Porque no puedo ver el código ?

    ResponderBorrar
    Respuestas
    1. Hola. Es raro.
      Aqui te dejo el link de donde esta hospedado el codigo.
      https://pastebin.com/SSVtEjRy

      Borrar
    2. Aqui lo tienes

      /* Adaptado de el ejemplo original por Cesar Riojas
      www.arduinocentermx.blogspot.mx
      * */
      #include
      #include
      #include

      // Inicializamos la conexion WIFI con el Router
      char ssid[] = "TUSSID"; // el nombre de tu Red
      char password[] = "TUPASSWORD"; // la clave de tu Red

      // Inicializar Telegram BOT
      #define BOTtoken "TUTOKEN" // el token de tu BOT, lo obtenemos de BotFather

      WiFiClientSecure client;
      UniversalTelegramBot bot(BOTtoken, client);

      int Bot_mtbs = 50; //Tiempo medio entre el escaneo de mensajes
      long Bot_lasttime; //exploracion de el ultimo mensaje
      bool Start = false;
      String chat_id2;
      bool flag = false;

      void handleNewMessages(int numNewMessages) {
      Serial.println("handleNewMessages");
      Serial.println(String(numNewMessages));

      for (int i = 0; i < numNewMessages; i++) {
      String chat_id = String(bot.messages[i].chat_id);
      chat_id2 = chat_id;
      String text = bot.messages[i].text;

      String from_name = bot.messages[i].from_name;
      if (from_name == "") from_name = "Guest";

      if (text == "/start") {
      String welcome = "Bienvenido a el BOT de Arduino Center, " + from_name + ".\n";
      welcome += "Escribe /opciones si quieres ver lo que puedo hacer.\n\n";
      //welcome += "/send_test_action : to send test chat action message\n";
      bot.sendMessage(chat_id, welcome);
      }

      if (text == "/opciones") {
      String keyboardJson = "[[\"/ledOn\", \"/ledOff\"],[\"/sensor\"]]";
      bot.sendMessageWithReplyKeyboard(chat_id, "Selecciona una de las siguientes opciones:", "", keyboardJson, true);
      }

      if (text == "/ledOn") {
      digitalWrite(13, HIGH);
      bot.sendMessage(chat_id, "Led Encendido!");
      }

      if (text == "/ledOff") {
      digitalWrite(13, LOW);
      bot.sendMessage(chat_id, "Led Apagado!");
      }

      if (text == "/sensor") {
      if (digitalRead(4) == 0) {
      bot.sendMessage(chat_id, "Sensor en Reposo!");
      } else {
      bot.sendMessage(chat_id, "Sensor Activado!!");
      }
      }
      }
      }


      void setup() {
      Serial.begin(115200);

      // Establecer el modo WiFi y desconectarse de un AP si fue Anteriormente conectada
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();
      delay(100);

      // Intentar conectarse a la red
      Serial.print("Conectando al Wifi: ");
      Serial.println(ssid);
      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(500);
      }

      Serial.println("");
      Serial.println("WiFi conectada");
      pinMode(13, OUTPUT);
      pinMode(4, INPUT_PULLUP);
      }

      void loop() {
      if (millis() > Bot_lasttime + Bot_mtbs) {
      int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

      while (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
      }

      if (digitalRead(4) == 1) {
      if (flag == false) {
      bot.sendMessage(chat_id2, "Se Activo el Sensor!!!");
      flag = true;
      }
      } else {
      flag = false;
      }


      Bot_lasttime = millis();
      }
      }

      Borrar
  8. Gran tutorial!!! Pregunta: En la ultima imagen, la del chat con el bot, veo tres botones grises con las leyendas /ledOn , /ledOff y /Sensor. Como se habilitan las mismas dado que son muy prácticas para evitar tipear los comandos? Gracias por el aporte

    ResponderBorrar
    Respuestas
    1. Hola gracias por comentar!!
      Esos botones se habilitan escribiendo el comando /opciones
      Las mismas que puedes modificar a tu gusto desde el codigo del NodeMCU
      Saludos

      Borrar
  9. me aprarece esto al compilarlo
    exit status 1
    Error compilación en tarjeta NodeMCU 1.0 (ESP-12E Module).

    ResponderBorrar
  10. A mi me pasa lo mismo, me dice el fichero o archivo UniversalTelegramBot no existe

    ResponderBorrar
  11. Hola amigo, gracias pro el post, he intentado ejecutar el codigo que presentas pero no compila tengo un PhotonH 8266 y me salen estos errores en la compilacion jsonBuffer y KeyboardBuffer, alguna idea para encontrar alguna solucion gracias

    ResponderBorrar
  12. O meu só apresenta este erro.


    In file included from /home/pi/Desktop/telegramBotNodemcu/telegramBotNodemcu.ino:6:0:
    /home/pi/Arduino/libraries/UniversalTelegramBot/src/UniversalTelegramBot.h:26:25: fatal error: ArduinoJson.h: No such file or directory
    #include
    ^
    compilation terminated.
    exit status 1
    Erro compilando para a placa NodeMCU 1.0 (ESP-12E Module)

    ResponderBorrar
  13. Tranquilo já resolvi estava faltando incluir a biblioteca ArduinoJson.h
    está rodando tranquilo, mas fiz a comunicação com a automação do meu aquário partindo da sketch de exemplo da biblioteca FlashLed.
    De qualquer forma muito obrigado pelo tutorial.

    ResponderBorrar
  14. Otra falla puede ser la versión del ArduinoJson, evitar la beta

    ResponderBorrar
  15. el loop no me funciona. no me envia mensaje si esta en high

    ResponderBorrar
  16. No empieza a mandar mensajes el bot hasta que no se inicie una conversación con el, es decir alimento el bot y pulso el pulsador y no manda ningún mensaje, despues de tener el chat creado /start el teclado con la opciones en el telefono cargado, si no le mando algun comando no empieza a mandarme las alarmas del pulsador?

    ResponderBorrar
    Respuestas
    1. x2 luego de un corte de energía , no envía la información del sensor...

      Borrar
  17. hola buenas noches, quiero preguntarte como podría hacer para modificar el scketch para poder leer 2 sensores y que depende del sensor oprimido me muestre un mensaje en particular

    ResponderBorrar
  18. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  19. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  20. Hola. Que buen tutorial...comprare el modulo para realizar este proyecto y les comentare.

    Saludos

    ResponderBorrar
  21. Hola, buen dia, tengo inconveniente para que me envie mensaje a mi telegram. No se si me falta definir algo. te copio el codigo. El chat_id que puse es de un canal

    /* Adaptado de el ejemplo original por Cesar Riojas
    www.arduinocentermx.blogspot.mx
    * */
    #include
    #include
    #include

    // Inicializamos la conexion WIFI con el Router
    char ssid[] = "Wifiarduino"; // el nombre de tu Red
    char password[] = "Nico5691"; // la clave de tu Red
    String chat_id = "-1001367444876";
    // Initialize Telegram BOT
    #define BOTtoken "xxxxxxxxxxxxxxxxxx" // el token de tu BOT, lo obtenemos de BotFather
    // SENSOR DE GAS:
    int redLed = D7; // Output pin for LED
    int greenLed = D6; // Output pin for LED
    int buzzer = D3; // Output pin for Buzzer
    int smokeA0 = A0;
    int sensorPin = D5; // Pin de entrada de Sensor de incendio

    // Tu valor limite
    int sensorThres = 500;
    WiFiClientSecure client;
    UniversalTelegramBot bot(BOTtoken, client);


    void setup() {
    Serial.begin(9600);

    // Establecer el modo WiFi y desconectarse de un AP si fue Anteriormente conectada
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);

    // Intentar conectarse a la red
    Serial.print("Conectando al Wifi: ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
    }

    Serial.println("");
    Serial.println("WiFi conectada");

    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(smokeA0, INPUT);
    pinMode(sensorPin, INPUT);
    }

    void loop() {
    int analogSensor = analogRead(smokeA0);
    Serial.print("************Medicion de GAS: ************");
    Serial.println(analogSensor);
    // Comprueba si ha alcanzado el valor limite
    if (analogSensor > sensorThres){
    Serial.println("GAS DETECTADO! ");
    //digitalWrite(redLed, HIGH);
    digitalWrite(greenLed, HIGH);
    tone(buzzer, 70000, 2000);
    // bot.getUpdates(bot.last_message_received + 1);
    bot.sendMessage("-1001367444876", "Se Activo el Sensor!!!");
    delay(1000);
    }
    else
    {
    digitalWrite(greenLed, LOW);
    noTone(buzzer);
    }
    delay(300);
    // aca termina el codigo del sensor de gas
    Serial.println("************Medicion de INCENDIO: ************");
    int digitalSensor = digitalRead(sensorPin);
    Serial.println(digitalSensor);

    if (digitalSensor == LOW)
    {
    digitalWrite(redLed, HIGH);
    Serial.println("FUEGO DETECTADO");
    // digitalWrite(greenLed, LOW);
    tone(buzzer, 70000, 2000);
    //bot.getUpdates(bot.last_message_received + 1);
    bot.sendMessage("-1001367444876", "Se Activo el Sensor!!!");
    delay(1000);
    }
    else
    {
    digitalWrite(redLed, LOW);
    noTone(buzzer);
    }

    // aca termina el codigo del sensor de incendio*/


    delay(300);// prepare for next data ...

    }

    ResponderBorrar
  22. La libreria ArduinoJson debes terner instala la version 5.13.2

    ResponderBorrar
  23. Nunca pensé usar telegram para eso, muy buen artículo, gracias.

    ResponderBorrar
  24. Que buena, me servirá de mucha ayuda, gracias y un saludo

    ResponderBorrar