Introducció a la robòtica en trenta-una classes/Trenta-unè dia: enviar un telegram amb el Wemos

Amb aquest muntatgem podrem rebre avisos en qualsevol lloc, si tenim accés a internet.

Avui el que hem fet és apendre una manera en què el wemos ens avisi si detecta moviment. El dia anterior vam veure com demanar-li informació a ell quan nosaltres volíem, però avui volem que sigui ell qui ens avisi en funció del que detecta.

Com a exemple, hi hem muntat el sensor ultrassònic de distància que ja vam fer servir dies enrera. A la imatge veiem les connexions.

Per una banda, el programa mira si detecta objectes més a prop de dos metres, i si és així, ens avisarà.

La menera que ens pugui avisar, sense haver de fer programa pel mòbil, hauria de ser amb un missatge instantani. El més conegut de tots, és el whats. La política del whats, però no és gens oberta a que es pugui fer servir fora del telèfon que té el sim amb què ens hem donat d’alta, i no es tracta de comprar un telèfon amb un sim dedicat només a aquest experiment.

Tenim una alternativa, però, es tracta de Telegram. Telegram es declara obert, i ho és.

Una vegada tinguem un compte de Telegram, podem rebre i enviar misstages des de i a qualsevol dispositiu que tingui navegador, sigui tauleta, ordinador, raspberry pi, amb ios, windows, linux... I pel que fa al nostre objectiu, fins i tot des del wemos.

Sí, llegiu bé: el nostre wemos ens farà un Telegram a nosaltres, o fins i tot a un grup sencer que tinguem al Telegram.

A continuació, un tutorial que creiem ho inclou tot, pas a pas: El primer que ens cal, si encara no el tenim és instal.lar-nos el Telegram en el telèfonmòbil. Son els mateixos passos que amb el whatsapp. Una vegada instal.lat ens demana el número de telèfon, li donem, rebem un missatge amb un codi, el posem al Telegram, i ja tenim el Telegram en marxa.

Després, el que ens cal per al nostre wemos, és el que en argot de Telegram anomenen bots, que serien com robots, o usuaris automatitzats. Aquests bots poden enviar i rebre missatges, i poden ser membres de grups on hi hagi usuaris humans i bots alhora. Per a crear un bot, ens cal “contactar” amb el BotFather, que seria com el pare de tots els bots, que també és un bot. Anem al cercador de contactes, i escrivim @BotFather. Només ens hauria d’aparèixer un contacte, el cliquem, se’ns presenta amb un missatge del que li podem demanar. Li escrivim /newbot, per a crear el nostre primer bot. Ens demana un nom per al nostre bot, i llavors un nom d’usuari per a aquest bot, que haurà d’acabar sempre en bot. Si ja existeix aquest nom d’usuari, ens demanarà que en fem un altre.

Quan ja s’hagi creat, ens donarà un token, una clau, que és la que haurà de fer servir el nostre wemos quan vulgui parlar en nom seu, té la forma 335421312:AAGzfHlKhW1f-2T4u5ZN9IekGpFegqY-woI.

Per a poder fer que el bot envii missatges, ens cal saber la id del destinari, que serem nosaltres o un grup sencer que hàgim fet per a rebre els missatges del wemos. Posem el nom del nostre bot al cercador de contactes, i li enviem un missatge qualsevol. Després, en un navegador posem l’adreça https://api.telegram.org/bot, seguidament i sense espais el token que ens ha donat, i després /getUpdates. Per al token que us donàvem d’exemple, seria https://api.telegram.org/bot335421312:AAGzfHlKhW1f-2T4u5ZN9IekGpFegqY-woI/getUpdates

En la resposta, que dirà quelcom com message from… cercarem un id: amb un número de vuit xifres si és d’un usuari, o bé un id negatiu si és d’un grup, i que serà el destinatari que haurem de posar per a rebre els seus missatges.

Per a veure si funciona bé el bot del Telegram, i que tenim bé tan el token com el destinatari, anirem a un navegador i hi posarem, canviant el token i el id pels que hem obtingut abans:

https://api.telegram.org/bot335421312:AAGzfHlKhW1f-2T4u5ZN9IekGpFegqY-woI/SendMessage?text=”prova”&chat_id=46882146

Hauríem de rebre un Telegram en poc temps, que vingués de part del nostre bot i que digués prova.

Ara, ens cal muntar el sensor de distància tal com es veu a la imatge de dalt: VCC a 5V, GND a GND, Trig a D1 i Echo a D2. Ja que volem penjar Telegrams, el wemos necessita accés a internet. Per tant, hem de donar-li internet del wifi de casa. En el programa d’exemple que segueix, haurem de posar el nom o SSID del wifi de casa, i la paraula clau també del wifi de casa. També haurem de canviar el token i el id pels del nostre bot. Si tot va bé, rebrem un Telegram cada vegada que algú s’acosti al sensor a menys de dos metres…

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

const char* ssid = "SSIDdeCasa";
const char* password = "PasswordDelWifiDeCasa";

long durada, distancia;

#define trigPin D1 // Trigger Pin
#define echoPin D2 // Echo Pin

const char* host = "api.telegram.org";
const int httpsPort = 443;

const char* fingerprint = "CF 05 98 89 CA FF 8E D8 5E 5C E0 C2 E4 F7 E6 C3 C7 50 DD 5C";

void setup() {
    pinMode(trigPin, OUTPUT);
    String url = "/bot335421312:AAGzfHlKhW1f-2T4u5ZN9IekGpFegqY-woI/SendMessage?text=%22Engegant%22&chat_id=46882146";
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }
    // Use WiFiClientSecure class to create TLS connection
    WiFiClientSecure client;
    if (!client.connect(host, httpsPort)) {
        return;
    }

    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
     "Host: " + host + "\r\n" +
     "User-Agent: BuildFailureDetectorESP8266\r\n" +
    "Connection: close\r\n\r\n");

    while (client.connected()) {
        String line = client.readStringUntil('\n');
        if (line == "\r") {
            break;
        }
    }
    String line = client.readStringUntil('\n');
}

void loop() {
    String url = "/bot335421312:AAGzfHlKhW1f-2T4u5ZN9IekGpFegqY-woI/SendMessage?text=%22Moviment%22&chat_id=46882146";
    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); 
 
    digitalWrite(trigPin, LOW);
    durada = pulseIn(echoPin, HIGH);
 
    distancia = durada/58.2;

    if (distancia<200){
        WiFiClientSecure client;
        if (!client.connect(host, httpsPort)) {
            return;
        }

        client.print(String("GET ")+ url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");
    
        while (client.connected()) {
            String line = client.readStringUntil('\n');
            if (line == "\r") {
                break;
            }
        }
        String line = client.readStringUntil('\n');
        delay(6000);
    }
}