Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Enviem les lectures de temperatura i humitat directament a Telegram

Els xatbots de Telegram permeten la possibilitat d'enviar-los missatges mitjançant una ordre GET. Això ens permet enviar informació a Telegram sense necessitat de fer servir cap script. Això seria interessant per aplicacions en les que es vol avisar quan, per exemple, el valor llegit pel sensor surt fora dels límits establerts. En aquest exemple, però, enviarem les lectures cada minut perquè així el programa serà més fàcil de provar.

Per poder enviar les dades a Telegram ens caldrà l'identificador de l'usuari i el token del xatbot, que podem obtenir seguint les instruccions d'aquesta pàgina. L'ordre GET, per a uns valors concrets de temperatura i humitat, podria ser la següent:

https://api.telegram.org/bot^^34628844:AAFIpk-e7j3UZtYQYQaTduf4mPhnDqIcNXI/sendMessage?
	chat_id=^^9199456&text=T: 20,7 °C\nH: 36,4 %

Hem marcat el token en verd i l'identificador de l'usuari en groc. Els valors que s'envien són, respectivament, de 20,7 °C i 36,4 %. Hem posat el text en dues línies perquè és molt llarg però la comanda real ha d'anar tota seguida.

En aquesta comanda cal substituir alguns caràcters especials com els espais (%20), el símbol dels graus (%C2%B0), els salts de línia (canviar \n per %0A) i el signe de tant per cent (%25). Amb aquests canvis, la comanda ens quedaria així:

https://api.telegram.org/bot^^34628844:AAFIpk-e7j3UZtYQYQaTduf4mPhnDqIcNXI/sendMessage?
	chat_id=^^9199456&text=T:%2020,7%20%C2%B0C%0AH:%2036,4%20%25

I això seria el que es rebria a Telegram:

T: 20,7 °C
H: 36,4 %

Aquest serà el programa del microcontrolador. Fixem-nos que hem canviat els punts decimals per comes.

#include <SPI.h>    // Carreguem la biblioteca SPI
#include <WiFiNINA.h>    // Carreguem la biblioteca WiFiNINA
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
char server[] = "api.telegram.org";
String adre = "/bot^^34628844:AAFIpk-e7j3UZtYQYQaTduf4mPhnDqIcNXI/sendMessage?chat_id=^^9199456&text=";
char pagina[400];
float hum, temp;
String data;
unsigned long darreraConnexio = 0;
const unsigned long periodeConnexio = 60000UL;  // 60 s
int status = WL_IDLE_STATUS;
WiFiSSLClient client;
DHT dht(DHTPIN, DHTTYPE);
void setup() {    // Inicialització
    Serial.begin(9600);    // Monitor sèrie
    dht.begin();
    if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("No s'ha trobat el dispositiu Wi-Fi");
        while (true);    // Bloquegem el programa
    }
    String versio = WiFi.firmwareVersion();
    if (versio < "1.0.0") {
        Serial.println("Convindria actualitzar el firmware");
    }
    while (status != WL_CONNECTED) {
        Serial.print("Connectant a la xarxa ");
        Serial.println(idXarxa);
        status = WiFi.begin(idXarxa, contrasenya);
        delay(10000);    // Ho tornarem a intentar passats 10 s
    }
    Serial.print("Connectat a "); 
    Serial.println(WiFi.SSID());
    Serial.print("Estat de la connexió: ");
    Serial.println(WiFi.status()); 
    Serial.print("Adreç IP del dispositiu: ");
    Serial.println(WiFi.localIP()); 
    Serial.print("Intensitat del senyal: ");
    Serial.print(WiFi.RSSI()); 
    Serial.println(" dBm");
    Serial.println(); 
}
void loop() {    // Programa que es repeteix indefinidament
    if (status != WiFi.status()) {    // Mirem si ha canviat l'estat de la connexió
        status = WiFi.status();
        if (status == WL_AP_CONNECTED) {
            Serial.println("Dispositiu connectat al punt d'accés");
        } else {
            Serial.println("El dispositiu s'ha desconnectat del punt d'accés");
        }
    }
    if (millis() - darreraConnexio > periodeConnexio) {
        client.stop();
        hum = dht.readHumidity();
        temp = dht.readTemperature();
        data += "T:%20";  // "T: "
        data += temp;
        data += "%20%C2%B0C%0A";  // " °C\n"
        data += "H:%20";  // "H: "
        data += hum;
        data += "%20%25";  // " %"
        data.replace('.', ',');  // Canviem els punts per comes
        data = adre + data;
        data.toCharArray(pagina, 400);
        if (client.connect(server, 443)) {
            Serial.println("S'ha fet la connexió al servidor");
            client.print("GET ");
            client.print(pagina);
            client.println(" HTTP/1.1");
            client.print("Host: ");
            client.println(server);
            client.println("Connection: close");
            client.println();
            // Guardem quan hem fet la connexió
            darreraConnexio = millis();
        } else {
            Serial.println("connection failed");
        }
    }
}

El nostre programa de prova escriu unes quantes coses al monitor sèrie (instruccions Serial.print i Serial.println). Quan ja tinguem clar que el programa funciona, les podem eliminar quasi totes i probablement anirà una mica més ràpid.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.