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.
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.
- 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.
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.
La fenêtre suivante devrait s’ouvrir et vous serez invité à cliquer sur le bouton de démarrage.
Tapez /newbot et suivez les instructions pour créer votre bot. Donnez-lui un nom et un nom d’utilisateur.
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.
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.
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.
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.
- Cliquez ici pour télécharger la bibliothèque Universal Arduino Telegram Bot.
- Allez dans Esquisse > Inclure la bibliothèque > Add.ZIP Library…
- 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.
- Accédez à Skech > Inclure la bibliothèque > Gérer les bibliothèques.
- Recherchez « ArduinoJson ».
- Installez la bibliothèque.
Nous utilisons la version 6.15.2 de la bibliothèque ArduinoJson.
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.
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.
Après avoir installé les bibliothèques, redémarrez votre IDE Arduino.
Pièces requises
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 !
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).
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).
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();
}
}
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.
En même temps, sur le Serial Monitor, vous devriez voir que l’ESP32 ou l’ESP8266 reçoit les messages.
Si vous essayez d’interagir avec votre bot à partir d’un autre compte, vous recevrez le message « 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 :