meta data de esta página
  •  

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
electronica:wemos:boton_ayuda [2016/12/19 00:03] lcelectronica:wemos:boton_ayuda [2023/01/18 14:36] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 {{tag>wemos telegram botón}} {{tag>wemos telegram botón}}
 ===== Botón de emergencia con Wemos ===== ===== Botón de emergencia con Wemos =====
-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 con la ayuda de telegram, ya que me permite tanto recibir como enviar comandos y obtener respuestas.  +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 telegram en vez de gmail y añadiendole la posibilidad de recibir enviar comandos para ejecutar acciones. 
-De momento sólo tengo creado un pequeño código de  ejemplo, pero la lista de comandos se puede ampliar muy fácilmente para leer o interactuar con otros sensores conectados al Wemos.+ 
 +De momento sólo tengo implementado algunos comandos, pero la lista de acciones se puede ampliar muy fácilmente para leer o interactuar con otros sensores conectados al Wemos.
  
 Para realizar este proyecto sólo necesitamos un Wemos y un Button Shield  Para realizar este proyecto sólo necesitamos un Wemos y un Button Shield 
Línea 13: Línea 14:
  
 Alimentamos el Wemos y cargamos el siguiente código: Alimentamos el Wemos y cargamos el siguiente código:
-<sxh> +<sxh c
-df+/* 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
 </sxh> </sxh>
 +
 +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 y en cuanto tenga en mi poder el módulo de GPS y un transceiver con **Lora** intentaré ampliar el código de ejemplo, para obtener las coordenadas de posición y a su vez utilizar Lora en vez de una conexión Wifi.