Botón De Ayuda (Help Button) Wemos + WIFI + Telegram

Después de leer el artículo de jeanotP1314 sobre como construir un botón de ayuda para personas mayores, decidí hacer algo similar pero utilizando un móvil con telegram y añadiéndole la posibilidad de recibir o enviar comandos para ejecutar acciones.

De momento sólo tengo implementado algunos comandos, pero la lista de acciones se puede ampliar muy fácilmente para interactuar con otros sensores conectados al Wemos.

El proyecto original, así como otros que he ido creando se puede encontrar en mi wiki -> wiki.intrusos.info

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Paso 1: Materiales

Como materiales de este proyecto sólo necesitamos un Wemos D1 mini, un Buttom Shield y un buzzer.

Además debemos de crearnos un bot en telegram para poder enviar y recibir los mensajes. Si no sabes como hacerlo está explicado aquí

Step 2: Paso 2: Conexiones

La forma de conectar el conjunto es poniendo el Button Shield encima del Wemos, teniendo en cuenta que coincidan las patillas numeradas de cada dispositivo.

El buzzer deberá de estar conectado entre la patilla D1 (GPIO5) y masa.

Para hacer pruebas bastará con alimentar el Wemos con el cable usb.

Step 3: Paso 3: Programación

Conectamos el Wemos al ordenador y después de añadir el dispositivo al IDE introducimos el siguiente programa:

/* Código original de la conexión con telegram de  https: //github.com/gusman126/arduino_telegram_bot
  Modificado por LC (wiki.intrusos.info) 
*/
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include "DHT.h"
 
 
// Iniciamos la conexión con el router
const char *ssid = "ssid de la wifi";   // no puede ser mayor de 32 caracteres
const char *pass = "contraseña de la wifi";   // la contraseña de la WIFI
int status = WL_IDLE_STATUS;
 
// Datos del Bot de Telegram
String BOTtoken = "bot26621579:AAE1X6V2MHVxOVC-iK_a_4dUi6f0Xf603vh";  //cambiar por el token de tu bot
String Chat_id = "205215515"; // cambiar por tu Chat_id,
String Texto_enviar = "";
String Texto_recibido = "";
String Update_id = "";
String anterior_upd = "";
String Nueva_upd = "";
String Respuesta = "";
 
// Variables de tiempo
int Inicio;
int Termino;
int Intervalo = 15000;
unsigned long elapsed = 0;
unsigned long previous;
boolean respondio = false;
 
//variables de estado
int estadoboton = 0;
 
// Pin del wemos al que está conectado el botón
const int botonpin = D3;
const int ledpin = BUILTIN_LED;
 
WiFiClientSecure client; // inicio del cliente seguro
IPAddress server(149, 154, 167, 200); // IP de api.telegram.org telegram
 
 
void setup() {
 
  Serial.begin(115200);
  WiFi.begin(ssid, pass); // Conexion a Wifi
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Conectado a la red WiFi");
  Serial.println("Dirección IP: ");
  Serial.println(WiFi.localIP());
 
  // Comprobamos la conexión a Telegram
  if (client.connect(server, 443)) {
    Serial.println(".... conectado a Telegram");
  }
  // y enviamos el texto de inicio
  Enviar_texto(" Inicio del Sistema .......");
 
  //Comprobamos el último mensaje
  Ultimo_msg();
  previous = millis();
 
  // inicializamos el led pin
  pinMode(ledpin, OUTPUT);
 
  // inicializamos el botón pin
  pinMode  (botonpin, INPUT);
 
  //inicializamos el led
  digitalWrite(ledpin, HIGH); //Con HIGH el led está apagado
 
  //Inicializamos el buzzer
  pinMode (5, OUTPUT);   //es la conexión D1->GPIO5
 
}
 
 
void loop() {
  estadoboton = digitalRead(botonpin);
 
  if (estadoboton == LOW) {            //Cuando presionamos el botón
    digitalWrite(ledpin, LOW);
    Enviar_texto("Necesito Ayuda");
    Serial.println("Necesito ayuda");
  }
 
  while (estadoboton == LOW ) {  //Una vez pulsado el botón está a la espera de nuestros mensajes
 
    elapse();
    Leer_msg(); // leemos el último mensaje
 
 
    // Comprobamos que haya pasado xx seg desde la última vez
    if (elapsed > 500) {
    }
    anterior_upd = Update_id; // Guardamos la anterior Update
    Ultimo_msg (); // comprobamos el último mensaje
    delay(1000); // Esperamos a recibir los datos
    Leer_msg(); // Leemos los datos
    busca_upd_id(Respuesta); // buscamos la Update_id y la guardamos
    busca_texto(Respuesta); // Buscamos el Texto del mensaje
 
    // Si ha cambiado la Update_id seguimos con el código
    if (anterior_upd != Nueva_upd) {
      Responder_mensaje(Texto_recibido);
    } else {
    } // No hacemos nada si es el mismo Upd_id
  }
} // Fin Loop
 
 
// Orden para buscar el texto del mensaje
void busca_texto( String Rsp ) {
  Texto_recibido = "";
  int  start = Rsp.indexOf("text") + 7 ; // Buscamos el índice ( número ) de la palabra "text" y le añadimos 7
  int  fin = Rsp.indexOf("}}]}") - 1; // Buscamos el índice del texto }}]} y le restamos uno
  Texto_recibido = (Rsp.substring(start, fin)); // Guardamos el resultado en la variable
}
 
//Orden para buscar la Update_id
void busca_upd_id( String Rsp ) {
  anterior_upd = Update_id; // Guardamos la anterior Update_id para comprobar
  int  start = Rsp.indexOf("update_id") + 11 ; // Buscamos el índice del texto y le añadimos 11
  int  fin = Rsp.indexOf("message") - 2; // Buscamos el índice del texto y le restamos 2
  Update_id = Rsp.substring(start, fin); // Guardamos la Update_id
  Nueva_upd = Rsp.substring(start, fin); // Volvemos a guardar la Update_id pero en la variable de nueva
}
 
// Orden para pedir el ultimo mensaje, vemos que se usa el Offset=-1&limit=1 para mostrar sólo el último
void Ultimo_msg () {
  if (client.connect(server, 443)) {
    // client.println("GET /botxxxx/getUpdates?offset=-1&limit=1");
    client.println("GET /" + BOTtoken + "/getUpdates?offset=-1&limit=1");
  }
  previous = millis(); // Guardamos los milisegundos para comprobar que haya pasado X tiempo entre lecturas
}
 
//Leemos el mensaje completo y lo añadimos a una variable carácter por carácter
void Leer_msg () {
  Respuesta = ""; // Vaciamos la variable
  while (client.available()) { // Mientras no lo lea todo seguirá leyendo
    char inChar = client.read(); // Lee el carácter
    Respuesta += inChar; // Añadimos carácter a carácter el mensaje
  }
}
 
//Orden para comprobar el tiempo entre lecturas
void elapse() {
  elapsed = millis() - previous;
}
 
 
// Función para hacer sonar el Buzzer
  void beep(unsigned char pausa)
        {
            analogWrite(5, 20);
            delay(pausa);                 // Espera
            analogWrite(5, 0);            // Apaga
            delay(pausa);                 // Espera
        }
 
//Orden para enviar cualquier texto a Telegram
void Enviar_texto( String Texto_enviar ) {
  if (client.connect(server, 443)) {
    client.println("GET /" + BOTtoken + "/sendMessage?chat_id=" + Chat_id + "&text=" + Texto_enviar + "");
    Serial.println("GET /" + BOTtoken + "/sendMessage?chat_id=" + Chat_id + "&text=" + Texto_enviar + "");
  }
}
 
//Aquí añadiremos las ordenes de respuesta del arduino
void Responder_mensaje ( String mensaje ) {
 
  if (mensaje == "Gps") {
    Enviar_texto("Las coordenadas son");
    respondio = true;
  }
  else if (mensaje == "Alarma") {
    Enviar_texto("Avisando");
    beep(500);
    respondio = true;
  }
  else if (mensaje == "Cerrar") {
    Enviar_texto("Aviso terminado");
    Serial.println("Aviso terminado");
    respondio = true;
    digitalWrite(ledpin, HIGH);
    estadoboton = 1;
  }
 
  if (respondio == true) { // mostramos el texto que se ha entendido
    Serial.println("El Texto : " + mensaje + " Lo he entendido perfectamente");
  }
  else {
    Serial.println("El Texto : " + mensaje + " No lo he entendido");
 
  }
  respondio = false ; // Dejamos en falso que entendió el mensaje
}
 
////////// Fin del código

Step 4: Paso 4: Funcionamiento

En este ejemplo cuando se presiona el botón se envía un mensaje pidiendo ayuda y se entra en un bucle para ejecutar los comandos que le enviamos por mensajes de telegram hasta que le llegue un mensaje de Cerrar .

Para hacer pruebas he conectado un buzzer al PIN D1 (GPIO5) para hacerlo sonar como aviso. Mi idea es utilizar un módulo de GPS de forma que se puedan solicitar las coordenadas mediante un comando y utilizar un transceiver con Lora (RFM95) para no depender de la conexión WIFI.

Be the First to Share

    Recommendations

    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    8 Discussions

    0
    None
    dj55nava

    8 months ago

    Por mas que intento cargar el programa en ide de arduino me sale el siguiente error:
    Arduino:1.6.9 (Windows 7), Tarjeta:"WeMos D1 R1, 80 MHz, Flash, 4M (1M SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 921600"
    Opciones de compilación cambiadas, reconstruyendo todo
    C:\Users\dj55nava\AppData\Local\Temp\arduino_modified_sketch_961891\token.txt.ino:6:17: fatal error: DHT.h: No such file or directory
    #include "DHT.h"
    ^
    compilation terminated.
    exit status 1
    Error compilación en tarjeta WeMos D1 R1.
    Me podeis ayudar? , gracias

    5 replies
    0
    None
    luiscarlosdj55nava

    Reply 8 months ago

    Seguramente no tengas las librerías necesarias instaladas en el Arduino IDE

    0
    None
    dj55navaluiscarlos

    Reply 8 months ago

    He instalado las que se supone que llevan dht.h pero sigo sin poder , sabes que librería es exactamente? Gracias

    0
    None
    luiscarlosdj55nava

    Reply 8 months ago

    En teoría debe de ser alguna de estas tres que no tienes cargadas en el IDE.
    #include <WiFiClientSecure.h>
    #include <ESP8266WiFi.h>
    #include "DHT.h"
    Supongo que lo sabes, pero por si las moscas , no basta con ponerlas en
    el programa previamente debes debajarte dichas librerías y cargarlas en el IDE.
    Igual también puede ser que las librerias han cambiado . Si puedo lo intentaré revisar y te comento

    0
    None
    dj55navaluiscarlos

    Reply 8 months ago

    Hola Luiscarlos , gracias por tus comentarios , ya lo tengo funcionando. El problema esta en las tarjetas. Solo me ha funcionado cargando la versión 2.3.0 de ESP8266 community.
    Por si alguien tiene el problema de que no cargan las librerías o una vez cargadas no responde bien a las ordenes , en el IDE de arduino cargar la versión 2.3.0

    IDE arduino \ herramientas \ placa \ gestor de tarjetas \ buscar ESP8266 community \ \ \ version2.3.0
    A mi me ha funcionado con la tarjeta WeMos D1

    0
    None
    dj55navadj55nava

    Reply 8 months ago

    solo tengo un problema ,todo funciona correctamente pero cada par de horas me envia a telegram el texto `` _???????´´.
    lo he quitado de la alimentacion a bateias y lo he conectado a una fuente pero sigue igual , cada cierto tiempo me manda este mensaje y claro te crees que ha saltado la alarma. Un saludo

    0
    None
    Edy.ar

    2 years ago

    LuisCarlos

    Se puede implementar con la placa grande D1 de Wemos, el codigo seria el mismo ??

    0
    None
    Swansong

    2 years ago

    Buena idea :)