Télégramme : contrôler les sorties ESP32/ESP8266 avec Arduino IDE

Télégramme : contrôler les sorties ESP32/ESP8266 avec Arduino IDE

Ce guide montre comment contrôler les GPIO ESP32 ou ESP8266 NodeMCU depuis n’importe où dans le monde à l’aide de Telegram. Par exemple, nous contrôlerons une LED, mais vous pouvez contrôler n’importe quelle autre sortie. Il vous suffit d’envoyer un message à votre Telegram Bot pour définir vos sorties HIGH ou LOW. Les cartes ESP seront programmées à l’aide de l’IDE Arduino.

ESP32 ESP8266 Sorties de contrôle NodeMCU Télégramme LED Arduino

Aperçu du projet

Dans ce didacticiel, nous allons créer un projet simple qui vous permet de contrôler les GPIO ESP32 ou ESP8266 NodeMCU à l’aide de Telegram. Vous pouvez également contrôler un module de relais.

Vue d'ensemble des sorties de contrôle de télégramme ESP32 ESP8266 NodeMCU
  • Vous allez créer un bot Telegram pour votre carte ESP32/ESP8266 ;
  • Vous pouvez démarrer une conversation avec le bot ;
  • Lorsque vous envoyez le message /conduit sur au bot, la carte ESP reçoit le message et active GPIO 2 ;
  • De même, lorsque vous envoyez le message /led_offil éteint GPIO 2 ;
  • De plus, vous pouvez également envoyer le message /Etat pour demander l’état actuel du GPIO. Lorsque l’ESP reçoit ce message, le bot répond avec l’état GPIO actuel ;
  • Vous pouvez envoyer le /début message 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 du télégramme

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 à l’aide de 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 contrôler les sorties ESP 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 Télégramme.

Installer et télécharger Telegram

Ouvrez Telegram et suivez les étapes suivantes pour créer un bot Telegram. Tout d’abord, recherchez « botpère » et cliquez sur le 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 début bouton.

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

Taper /nouveaubot 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 le jeton de robot. 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. Sauf que ID de l’utilisateurcar 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. Aller à Esquisser > Inclure la bibliothèque > Ajouter.Bibliothèque ZIP...
  3. Ajoutez la bibliothèque que vous venez de télécharger.

Et c’est tout. La bibliothèque est installée.

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. Aller à Esquisse > 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.

1643556249 121 Telegramme controler les sorties ESP32ESP8266 avec Arduino IDE

Pièces requises

Pour cet exemple, nous allons contrôler les LED embarquées de l’ESP :

Contrôler les sorties à l’aide d’un télégramme – Esquisse ESP32/ESP8266

Le code suivant vous permet de contrôler vos GPIO ESP32 ou ESP8266 NodeMCU en envoyant des messages à 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-control-esp32-esp8266-nodemcu-outputs/
  
  Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
  Example based on the Universal Arduino Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/examples/ESP8266/FlashLED/FlashLED.ino
*/

#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>

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

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

// 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"

#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;

const int ledPin = 2;
bool ledState = LOW;

// 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 commands to control your outputs.\n\n";
      welcome += "/led_on to turn GPIO ON \n";
      welcome += "/led_off to turn GPIO OFF \n";
      welcome += "/state to request current GPIO state \n";
      bot.sendMessage(chat_id, welcome, "");
    }

    if (text == "/led_on") {
      bot.sendMessage(chat_id, "LED state set to ON", "");
      ledState = HIGH;
      digitalWrite(ledPin, ledState);
    }
    
    if (text == "/led_off") {
      bot.sendMessage(chat_id, "LED state set to OFF", "");
      ledState = LOW;
      digitalWrite(ledPin, ledState);
    }
    
    if (text == "/state") {
      if (digitalRead(ledPin)){
        bot.sendMessage(chat_id, "LED is ON", "");
      }
      else{
        bot.sendMessage(chat_id, "LED is OFF", "");
      }
    }
  }
}

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

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
  
  // 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 (il est basé sur la bibliothèque Universal Arduino Telegram Bot Exemple). 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>

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";

Définir la sortie

Définissez le GPIO que vous souhaitez contrôler. Dans notre cas, nous allons contrôler GPIO 2 (LED intégrée) et son état est MEUGLER par défaut.

const int ledPin = 2;
bool ledState = LOW;

Noter: si vous utilisez un ESP8266, la LED intégrée fonctionne avec une logique inversée. Vous devez donc envoyer un MEUGLER signal pour allumer la LED et un HAUT signal pour l’éteindre.

Jeton de robot de télégramme

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

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

ID utilisateur de télégramme

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

#define CHAT_ID "XXXXXXXXXX"

Créez un nouveau client WiFi avec WiFiClientSécurisé.

WiFiClientSecure client;

Créer un robot 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 le botRequestDelay variable.

int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

handleNouveauxMessages()

le handleNouveauxMessages() La fonction 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 le chat_id variable. L’ID de chat nous permet d’identifier qui a envoyé le message.

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

Si la 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 le texte variable et vérifiez son contenu.

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

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

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

S’il reçoit le /début message, 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 commands to control your outputs.\n\n";
  welcome += "/led_on to turn GPIO ON \n";
  welcome += "/led_off to turn GPIO OFF \n";
  welcome += "/state to request current GPIO state \n";
  bot.sendMessage(chat_id, welcome, "");
}

Envoyer un message au bot est très simple. Il vous suffit d’utiliser le envoyer le message() méthode sur la robot objet et passez 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 particulier, nous enverrons le message à l’ID stocké sur le chat_id variable (qui correspond à la personne qui a envoyé le message) et envoie le message enregistré sur le Bienvenue variable.

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

S’il reçoit le /conduit sur message, allumez la LED et envoyez un message confirmant que nous avons reçu le message. Aussi, mettez à jour le étatled variable avec le nouvel état.

if (text == "/led_on") {
  bot.sendMessage(chat_id, "LED state set to ON", "");
  ledState = HIGH;
  digitalWrite(ledPin, ledState);
}

Faites quelque chose de similaire pour le /led_off message.

if (text == "/led_off") {
  bot.sendMessage(chat_id, "LED state set to OFF", "");
  ledState = LOW;
  digitalWrite(ledPin, ledState);
}

Noter: si vous utilisez un ESP8266, la LED intégrée fonctionne avec une logique inversée. Vous devez donc envoyer un MEUGLER signal pour allumer la LED et un HAUT signal pour l’éteindre.

Enfin, si le message reçu est /Etat, vérifiez l’état GPIO actuel et envoyez un message en conséquence.

if (text == "/state") {
  if (digitalRead(ledPin)){
    bot.sendMessage(chat_id, "LED is ON", "");
  }
  else{
    bot.sendMessage(chat_id, "LED is OFF", "");
  }
}

mettre en place()

Dans le mettre en place()initialisez le moniteur série.

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 pour l’ESP8266, ils disent : « C’est le moyen le plus simple pour que cela fonctionne. Si vous transmettez des informations sensibles ou contrôlez quelque chose d’important, veuillez utiliser certStore ou au moins client.setFingerPrint“.

Définissez la LED comme sortie et réglez-la sur LOW lorsque l’ESP démarre pour la première fois :

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);

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..");
}

boucler()

Dans le boucler()vérifiez l’arrivée de nouveaux messages toutes les secondes.

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 le handleNewMessages une fonction.

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 ESP32 ou ESP8266. N’oubliez pas d’aller à Outils > Conseil et sélectionnez la carte que vous utilisez. Aller à 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é ESP32/ESP8266 pour qu’il commence à exécuter le code. Ensuite, vous pouvez ouvrir 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 :

  • /début affiche le message de bienvenue avec les commandes valides.
  • /conduit sur allume la LED.
  • /led_off éteint la LED.
  • /Etat demande l’état actuel de la LED.
Contrôle ESP32 ESP8266 Sorties Télégramme

La LED embarquée doit s’allumer et s’éteindre en conséquence (la LED embarquée ESP8266 fonctionne en sens inverse, elle s’éteint lorsque vous envoyez /conduit sur et quand vous envoyez /led_off).

Carte ESP32 LED intégrée allumée HIGH

En même temps, sur le moniteur série, vous devriez voir que l’ESP reçoit les messages.

Control ESP32 ESP8266 Sorties Telegram Serial Monitor Démonstration

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

Contrôle ESP32 ESP8266 Sorties Télégramme Utilisateur non autorisé

Conclusion

Dans ce didacticiel, vous avez appris à créer un bot Telegram pour interagir avec l’ESP32 ou l’ESP8266. Avec ce bot, vous pouvez utiliser votre compte Telegram pour envoyer des messages à l’ESP et contrôler ses sorties. L’ESP peut également interagir avec le bot pour envoyer des réponses.

Nous vous avons montré un exemple simple sur la façon de contrôler une sortie. L’idée est de modifier le projet pour ajouter plus de commandes pour exécuter d’autres tâches. Par exemple, vous pouvez demander des lectures de capteur ou envoyer un message 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.