Télégramme : Demander des lectures de capteurs ESP32/ESP8266

Télégramme : Demander des lectures de capteurs ESP32/ESP8266

Ce guide montre comment demander des lectures de capteurs ESP32 ou ESP8266 NodeMCU à l’aide de Telegram. Par exemple, nous demanderons des lectures de température et d’humidité à un capteur BME280. Il vous suffit d’envoyer un message à votre Telegram Bot pour surveiller vos capteurs ou entrées de n’importe où dans le monde. Les cartes ESP seront programmées à l’aide de l’IDE Arduino.

ESP32 ESP8266 NodeMCU envoyer des lectures de capteur de publication télégramme BME280 Arduino

Aperçu du projet

Dans ce didacticiel, nous allons créer un projet simple qui demande des lectures de température et d’humidité ESP32 ou ESP8266 NodeMCU à l’aide de l’application Telegram. Nous utiliserons un capteur BME280, mais vous pouvez utiliser n’importe quel autre capteur.

ESP32 ESP8266 NodeMCU Telegram Request BME280 Sensor Readings Présentation du projet
  • Vous allez créer un bot Telegram pour votre carte ESP32 ou ESP8266 NodeMCU ;
  • Vous pouvez démarrer une conversation avec le bot ;
  • Lorsque vous envoyez le message/lectures au bot, la carte ESP reçoit le message et répond avec les lectures de température et d’humidité actuelles ;
  • Vous pouvez envoyer le message /start pour recevoir un message de bienvenue avec les commandes pour contrôler la carte.

Il s’agit d’un projet simple, mais montre comment vous pouvez utiliser Telegram dans vos projets IoT et domotique. L’idée est d’appliquer les concepts appris dans vos propres projets.

Présentation de l’application Telegram

Télégramme Messenger est un service de messagerie instantanée et de voix sur IP basé sur le cloud. Vous pouvez facilement l’installer sur votre smartphone (Android et iPhone) ou votre ordinateur (PC, Mac et Linux). C’est gratuit et sans publicité. Telegram vous permet de créer des bots avec lesquels vous pouvez interagir.

« Les bots sont des applications tierces qui s’exécutent dans Telegram. Les utilisateurs peuvent interagir avec les bots en leur envoyant des messages, des commandes et des requêtes en ligne. Vous contrôlez vos bots en utilisant des requêtes HTTPS vers l’API Telegram Bot“.

L’ESP32/ESP8266 interagira avec le bot Telegram pour recevoir et gérer les messages, et envoyer des réponses. Dans ce didacticiel, vous apprendrez à utiliser Telegram pour envoyer des messages à votre bot afin de demander des lectures de capteurs de n’importe où (vous avez juste besoin de Telegram et d’un accès à Internet).

Création d’un bot télégramme

Allez sur Google Play ou App Store, téléchargez et installez Telegram.

Installez et téléchargez l'application Telegram sur votre smartphone Android ou iOS

Ouvrez Telegram et suivez les étapes suivantes pour créer un bot Telegram. Tout d’abord, recherchez « botfather » et cliquez sur BotFather comme indiqué ci-dessous. Ou ouvrez ce lien t.me/botfather dans votre smartphone.

botpère

La fenêtre suivante devrait s’ouvrir et vous serez invité à cliquer sur le bouton de démarrage.

Telegram Démarrer BotFather pour créer un nouveau Bot

Tapez /newbot et suivez les instructions pour créer votre bot. Donnez-lui un nom et un nom d’utilisateur.

Telegram BotFather Créer un nouveau bot

Si votre bot est créé avec succès, vous recevrez un message avec un lien pour accéder au bot et au jeton de bot. Enregistrez le jeton du bot car vous en aurez besoin pour que l’ESP32/ESP8266 puisse interagir avec le bot.

Telegram BotFather Obtenir un jeton de bot

Obtenez votre ID utilisateur Telegram

Toute personne connaissant le nom d’utilisateur de votre bot peut interagir avec celui-ci. Pour vous assurer que nous ignorons les messages qui ne proviennent pas de notre compte Telegram (ou de tout utilisateur autorisé), vous pouvez obtenir votre ID utilisateur Telegram. Ensuite, lorsque votre robot télégramme reçoit un message, l’ESP peut vérifier si l’ID de l’expéditeur correspond à votre ID utilisateur et traiter le message ou l’ignorer.

Dans votre compte Telegram, recherchez « IDBot » ou ouvrez ce lien t.me/myidbot dans votre smartphone.

Télégramme Obtenez un ID de chat avec IDBot

Démarrez une conversation avec ce bot et tapez /getid. Vous recevrez une réponse avec votre ID utilisateur. Enregistrez cet ID utilisateur, car vous en aurez besoin plus tard dans ce didacticiel.

Telegram Obtenir un ID de chat avec IDBot getid

Préparation de l’IDE Arduino

Nous programmerons le ESP32 et ESP8266 cartes utilisant l’IDE Arduino, alors assurez-vous de les avoir installées dans votre IDE Arduino.

Bibliothèque universelle de robots Telegram

Pour interagir avec le bot Telegram, nous utiliserons le Bibliothèque universelle de robots Telegram créé par Brian Lough qui fournit une interface simple pour l’API Telegram Bot.

Suivez les étapes suivantes pour installer la dernière version de la bibliothèque.

  1. Cliquez ici pour télécharger la bibliothèque Universal Arduino Telegram Bot.
  2. Allez dans Esquisse > Inclure la bibliothèque > Add.ZIP Library…
  3. Ajoutez la bibliothèque que vous venez de télécharger.

Important : n’installez pas la bibliothèque via le gestionnaire de bibliothèque Arduino car il pourrait installer une version obsolète.

Pour tous les détails sur la bibliothèque, jetez un œil à la bibliothèque Universal Arduino Telegram Bot GitHub page.

Bibliothèque ArduinoJson

Vous devez également installer le ArduinoJson bibliothèque. Suivez les étapes suivantes pour installer la bibliothèque.

  1. Accédez à Skech > Inclure la bibliothèque > Gérer les bibliothèques.
  2. Recherchez « ArduinoJson ».
  3. Installez la bibliothèque.

Nous utilisons la version 6.15.2 de la bibliothèque ArduinoJson.

Installer la bibliothèque ArduinoJson Arduino IDE

Bibliothèques de capteurs BME280

Pour obtenir des lectures du module de capteur BME280, nous utiliserons le Bibliothèque Adafruit_BME280. Vous devez également installer le Bibliothèque Adafruit_Sensor. Suivez les étapes suivantes pour installer les bibliothèques dans votre IDE Arduino :

1. Ouvrez votre IDE Arduino et accédez à Sketch > Inclure la bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.

2. Recherchez « adafruit bme280 » dans la zone de recherche et installez la bibliothèque.

Installation de la bibliothèque BME280 dans l'IDE Arduino

Pour utiliser la bibliothèque BME280, vous devez également installer le Capteur unifié Adafruit. Suivez les étapes suivantes pour installer la bibliothèque dans votre IDE Arduino :

3. Recherchez « Adafruit Unified Sensor » dans la zone de recherche. Faites défiler vers le bas pour trouver la bibliothèque et installez-la.

Installation de la bibliothèque Adafruit Unified Sensor Driver

Après avoir installé les bibliothèques, redémarrez votre IDE Arduino.

Pièces requises

1677833533 306 Telegramme Demander des lectures de capteurs ESP32ESP8266

Pour cet exemple, nous obtiendrons les lectures du capteur du capteur BME280. Voici une liste des pièces dont vous avez besoin pour construire le circuit pour ce projet :

Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !

1677833533 979 Telegramme Demander des lectures de capteurs ESP32ESP8266

Diagramme schématique

Le module de capteur BME280 que nous utilisons communique via le protocole de communication I2C, vous devez donc le connecter aux broches ESP32 ou ESP8266 I2C.

Câblage BME280 vers ESP32

Les broches ESP32 I2C par défaut sont :

  • GPIO 22 : SCL (SCK)
  • GPIO 21 : SDA (SDI)

Alors, assemblez votre circuit comme indiqué dans le diagramme schématique suivant (Guide pour ESP32 avec serveur Web BME280 et ESP32 BME280).

Circuit de schéma de câblage de pression d'humidité de capteur ESP32 BME280

Lecture recommandée : Guide de référence du brochage ESP32

Câblage BME280 à ESP8266 NodeMCU

Les broches ESP8266 I2C par défaut sont :

  • GPIO 5 (D1): SCL (SCK)
  • GPIO 4 (D2) : SDA (SDI)

Assemblez votre circuit comme dans le schéma suivant si vous utilisez une carte ESP8266 (Guide pour ESP8266 NodeMCU avec BME280).

ESP8266 NodeMCU BME280 Capteur Température Humidité Pression Schéma de câblage Circuit

Lecture recommandée : Guide de référence du brochage ESP8266

Lectures du capteur de demande de télégramme – Code

Le code suivant vous permet de demander des lectures de capteur BME280 à partir de votre carte ESP32 ou ESP8266 en envoyant un message à un Telegram Bot. Pour que cela fonctionne pour vous, vous devez insérer vos identifiants réseau (SSID et mot de passe), le Telegram Bot Token et votre Telegram User ID.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/telegram-request-esp32-esp8266-nodemcu-sensor-readings/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

  Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
*/

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> // Universal Telegram Bot Library written by Brian Lough: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <ArduinoJson.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Use @myidbot to find out the chat ID of an individual or a group
// Also note that you need to click "start" on a bot before it can
// message you
#define CHAT_ID "XXXXXXXXXX"

// Initialize Telegram BOT
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  // your Bot Token (Get from Botfather)

#ifdef ESP8266
  X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

//Checks for new messages every 1 second.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

// BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)
// BME280 connect to ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = SCL)
Adafruit_BME280 bme;         

// Get BME280 sensor readings and return them as a String variable
String getReadings(){
  float temperature, humidity;
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  String message = "Temperature: " + String(temperature) + " ºC \n";
  message += "Humidity: " + String (humidity) + " % \n";
  return message;
}

//Handle what happens when you receive new messages
void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i=0; i<numNewMessages; i++) {
    // Chat id of the requester
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID){
      bot.sendMessage(chat_id, "Unauthorized user", "");
      continue;
    }
    
    // Print the received message
    String text = bot.messages[i].text;
    Serial.println(text);

    String from_name = bot.messages[i].from_name;

    if (text == "/start") {
      String welcome = "Welcome, " + from_name + ".\n";
      welcome += "Use the following command to get current readings.\n\n";
      welcome += "/readings \n";
      bot.sendMessage(chat_id, welcome, "");
    }

    if (text == "/readings") {
      String readings = getReadings();
      bot.sendMessage(chat_id, readings, "");
    }  
  }
}

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

  #ifdef ESP8266
    configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
    client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
  #endif
  
  // Init BME280 sensor
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  
  // Connect to Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  #ifdef ESP32
    client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
  #endif
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());
}

void loop() {
  if (millis() > lastTimeBotRan + botRequestDelay)  {
    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);
    }
    lastTimeBotRan = millis();
  }
}

Afficher le code brut

Le code est compatible avec les cartes ESP32 et ESP8266 NodeMCU. Le code chargera les bonnes bibliothèques en fonction de la carte sélectionnée.

Comment fonctionne le code

Cette section explique le fonctionnement du code. Continuer la lecture ou passer au Manifestation section.

Commencez par importer les bibliothèques requises.

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>

Informations d’identification réseau

Insérez vos informations d’identification réseau dans les variables suivantes.

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

ID utilisateur de télégramme

Insérez votre ID utilisateur. Celui que vous avez de l’IDBot.

#define CHAT_ID "XXXXXXXXXX"

Jeton de robot de télégramme

Insérez votre jeton Telegram Bot que vous avez reçu de Botfather sur la variable BOTtoken.

#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  // your Bot Token (Get from Botfather)

Créez un nouveau client WiFi avec WiFiClientSecure.

WiFiClientSecure client;

Créez un bot avec le jeton et le client définis précédemment.

UniversalTelegramBot bot(BOTtoken, client);

Le botRequestDelay et lastTimeBotRan sont utilisés pour vérifier les nouveaux messages Telegram toutes les x nombre de secondes. Dans ce cas, le code vérifiera les nouveaux messages toutes les secondes (1000 millisecondes). Vous pouvez modifier ce délai dans la variable botRequestDelay.

int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

Objet BME280

Créez un Adafruit_BME280 appelé bme. Cela crée un objet I2C sur les broches ESP I2C par défaut.

Adafruit_BME280 bme; 

getLectures()

La fonction getReadings() demande la température et l’humidité au capteur BME280 et renvoie les résultats sous forme de variable de chaîne que nous pouvons envoyer au bot Telegram.

String getReadings(){
  float temperature, humidity;
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  String message = "Temperature: " + String(temperature) + " ºC \n";
  message += "Humidity: " + String (humidity) + " % \n";
  return message;
}

Pour en savoir plus sur l’interfaçage du capteur BME280 avec l’ESP32 et l’ESP8266, lisez :

handleNouveauxMessages()

La fonction handleNewMessages() gère ce qui se passe lorsque de nouveaux messages arrivent.

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

Il vérifie les messages disponibles :

for (int i=0; i<numNewMessages; i++) {

Obtenez l’ID de chat pour ce message particulier et stockez-le dans la variable chat_id. L’ID de chat identifie qui a envoyé le message.

String chat_id = String(bot.messages[i].chat_id);

Si le chat_id est différent de votre ID de chat (CHAT_ID), cela signifie que quelqu’un (qui n’est pas vous) a envoyé un message à votre bot. Si tel est le cas, ignorez le message et attendez le message suivant.

if (chat_id != CHAT_ID){
  bot.sendMessage(chat_id, "Unauthorized user", "");
  continue;
}

Sinon, cela signifie que le message a été envoyé par un utilisateur valide. Nous allons donc l’enregistrer dans la variable text et vérifier son contenu.

String text = bot.messages[i].text;
Serial.println(text);

La variable from_name enregistre le nom de l’expéditeur.

String from_name = bot.messages[i].from_name;

S’il reçoit le message /start, nous enverrons les commandes valides pour contrôler l’ESP32/ESP8266. Ceci est utile s’il vous arrive d’oublier quelles sont les commandes pour contrôler votre carte.

if (text == "/start") {
  String welcome = "Welcome, " + from_name + ".\n";
  welcome += "Use the following command to get current readings.\n\n";
  welcome += "/readings \n";
  bot.sendMessage(chat_id, welcome, "");
}

Envoyer un message au bot est très simple. Il vous suffit d’utiliser la méthode sendMessage() sur l’objet bot et de passer comme arguments l’ID de chat du destinataire, le message et le mode d’analyse.

bool sendMessage(String chat_id, String text, String parse_mode = "")

Dans notre exemple, nous allons envoyer le message à l’ID stocké sur la variable chat_id (qui correspond à la personne qui a envoyé le message) et envoyer le message enregistré sur la variable welcome.

bot.sendMessage(chat_id, welcome, "");

S’il reçoit le message /lectures, obtenez les lectures actuelles du capteur en appelant la fonction getReadings(). Ensuite, envoyez simplement le message.

if (text == "/readings") {
  String readings = getReadings();
  bot.sendMessage(chat_id, readings, "");
}

installation()

Dans setup(), initialisez le Serial Monitor.

Serial.begin(115200);

Si vous utilisez l’ESP8266, vous devez utiliser la ligne suivante :

#ifdef ESP8266
  client.setInsecure();
#endif

Dans les exemples de bibliothèque Universal Telegram Bot Library pour l’ESP8266, il est écrit: «C’est le moyen le plus simple de faire fonctionner cela. Si vous transmettez des informations sensibles ou contrôlez quelque chose d’important, veuillez utiliser certStore ou au moins client.setFingerPrint“.

Initialiser BME280

Initialisez le capteur BME280.

if (!bme.begin(0x76)) {
  Serial.println("Could not find a valid BME280 sensor, check wiring!");
  while (1);
}

Initialiser le Wi-Fi

Initialisez le Wi-Fi et connectez l’ESP à votre réseau local avec le SSID et le mot de passe définis précédemment.

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi..");
}

boucle()

Dans la boucle (), vérifiez les nouveaux messages chaque seconde.

void loop() {
  if (millis() > lastTimeBotRan + botRequestDelay)  {
    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);
    }
    lastTimeBotRan = millis();
  }
}

Lorsqu’un nouveau message arrive, appelez la fonction handleNewMessages.

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

C’est à peu près comme ça que le code fonctionne.

Manifestation

Téléchargez le code sur votre carte ESP, ouvrez le menu Outils > Carte et sélectionnez la carte que vous utilisez. Allez dans Outils > Port et sélectionnez le port COM auquel votre carte est connectée.

Après avoir téléchargé le code, appuyez sur le bouton EN/RST embarqué ESP pour qu’il commence à exécuter le code. Ensuite, ouvrez le moniteur série pour vérifier ce qui se passe en arrière-plan.

Accédez à votre compte Telegram et ouvrez une conversation avec votre bot. Envoyez les commandes suivantes et voyez le bot répondre :

  • /start affiche le message de bienvenue avec les commandes valides.
  • /lectures renvoie les relevés de température et d’humidité actuels du capteur BME280.
Demander une démonstration de télégramme de lecture de capteur ESP32 ESP8266

En même temps, sur le Serial Monitor, vous devriez voir que l’ESP32 ou l’ESP8266 reçoit les messages.

ESP32 ESP8266 Requête de télégramme Lectures du capteur Moniteur série

Si vous essayez d’interagir avec votre bot à partir d’un autre compte, vous recevrez le message « Utilisateur non autorisé ».

Contrôle ESP32 ESP8266 Sorties Requête de relevés de capteur Application de télégramme Utilisateur non autorisé

Conclusion

Dans ce tutoriel, vous avez appris à créer un Telegram Bot pour interagir avec les cartes ESP32 ou ESP8266 NodeMCU. Avec ce bot, vous pouvez utiliser votre compte Telegram pour surveiller les capteurs et contrôler les sorties.

Nous vous avons montré un exemple simple sur la façon de demander des lectures de capteur à partir d’un capteur BME280. L’idée est de modifier le projet pour ajouter plus de commandes pour exécuter d’autres tâches. Par exemple, vous pouvez envoyer un message Telegram pour contrôler les sorties ou envoyer un message à votre compte lorsqu’un mouvement est détecté.

L’avantage d’utiliser Telegram pour contrôler vos cartes ESP, c’est que tant que vous avez une connexion Internet (et vos cartes aussi), vous pouvez les contrôler et les surveiller de n’importe où dans le monde.

Nous espérons que vous avez trouvé ce projet intéressant. Apprenez-en plus sur l’ESP32 et l’ESP8266 avec nos ressources :

Merci d’avoir lu.

Cette vidéo vous emmène dans l’histoire de Raspberry Pi :

YouTube video