Apprenez à contrôler un ESP32 depuis l’application Telegram sur votre téléphone. Avec ce code, vous pouvez par exemple allumer des lumières et demander l’état des capteurs ou interrupteurs en envoyant des messages depuis votre application Telegram à un ESP32.
Le code de démonstration vous montrera comment allumer et éteindre une LED, ainsi que lire l’état d’un interrupteur connecté à votre ESP32.
Pièces requises
Voici les composants nécessaires. J’ai utilisé une ancienne carte ESP32, qui n’est plus commercialisée mais reste disponible à très bas prix. Cependant, n’importe quel autre ESP32 fonctionnera tout aussi bien.
Vous aurez aussi besoin d’une LED, d’une résistance de 220 Ohms et d’un interrupteur ou bouton-poussoir.

ESP32 lite

Câble USB de données

Jeu de fils Dupont

Plaque d’essai (breadboard)

Kit résistance & LED
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Connexion de la LED et de l’interrupteur à l’ESP32
Nous voulons utiliser l’application Telegram sur notre téléphone pour contrôler ou lire les broches GPIO d’un ESP32. Pour démontrer cela, nous allons connecter une LED et un interrupteur à l’ESP32. L’image suivante montre le circuit :

La LED est connectée au GPIO 33 et l’interrupteur au GPIO 14. Vous pouvez choisir d’autres broches, mais assurez-vous d’ajuster les constantes dans le code en conséquence. La photo ci-dessous montre comment je l’ai câblé sur une breadboard :

Créer un Bot Telegram
Avant de pouvoir envoyer des messages depuis l’application Telegram sur votre téléphone vers un ESP32, vous devez créer un bot Telegram. Si vous ne l’avez jamais fait, le ESP32 send Telegram Message tutoriel l’explique en détail.
Le plus important est que nous aurons besoin du token du bot, qui ressemble à ceci 1234567811:fakeIodw9023sjjoj982qe23dSSDCDDDSSxx, ainsi que de votre ID utilisateur, qui ressemble à ceci 7221435846. Ces deux constantes seront nécessaires dans le code et seront spécifiques à votre bot.
Réinitialiser le Bot
Si vous avez déjà créé un bot et souhaitez réinitialiser son historique de chat, ouvrez le menu en haut à droite et cliquez sur Effacer l’historique:

Cela ouvrira une boîte de dialogue où vous devrez confirmer l’action. Le nom de mon bot est Marvin4, comme vous pouvez le voir dans la capture d’écran suivante :

Ensuite, le bot affiche un bouton Démarrer en bas sur lequel vous pouvez cliquer. Une fois démarré, le bot affichera à nouveau les commandes disponibles.

Code pour contrôler l’ESP32 via Telegram
Avant de pouvoir exécuter le code suivant sur l’ESP32, vous devez installer la UniversalTelegramBot Library. Elle simplifie le code nécessaire à la communication entre Telegram et l’ESP32.
Pour installer la bibliothèque, ouvrez le LIBRARY MANAGER de l’IDE Arduino, cherchez ‘UniversalTelegramBot’ puis cliquez sur le bouton INSTALL. Après une installation réussie, vous devriez voir la bibliothèque installée :

Le sketch Arduino ci-dessous montre comment utiliser un ESP32 pour communiquer avec un bot Telegram capable de contrôler une LED et de lire l’état d’un interrupteur à distance via des messages Telegram.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
const char* SSID = "xxxx";
const char* PASSWORD = "xxxx";
const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx";
const String CHAT_ID = "xxxx";
const byte LED_PIN = 33;
const byte SW_PIN = 14;
const char* info =
"Commands:\n\n"
"/led_on set LED on\n"
"/led_off set LED off\n"
"/led_toggle toggle LED\n"
"/sw_state get switch state\n";
WiFiClientSecure client;
UniversalTelegramBot bot(BOT_TOKEN, client);
int getNumMessages() {
return bot.getUpdates(bot.last_message_received + 1);
}
void handleNewMessages(int numMessages) {
for (int i = 0; i < numMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID) continue;
String text = bot.messages[i].text;
Serial.println(text);
if (text == "/start") {
bot.sendMessage(chat_id, info, "");
}
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED is ON", "");
digitalWrite(LED_PIN, HIGH);
}
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED is OFF", "");
digitalWrite(LED_PIN, LOW);
}
if (text == "/led_toggle") {
bool state = digitalRead(LED_PIN);
const char* message = state ? "LED off" : "LED on";
bot.sendMessage(chat_id, message, "");
digitalWrite(LED_PIN, state ? LOW : HIGH);
}
if (text == "/sw_state") {
bool state = digitalRead(SW_PIN);
const char* message = state ? "Switch is ON" : "Switch is OFF";
bot.sendMessage(chat_id, message, "");
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(SW_PIN, INPUT_PULLUP);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(100);
}
void loop() {
while (int numMessages = getNumMessages()) {
handleNewMessages(numMessages);
}
delay(1000);
}
Inclusion des bibliothèques requises
Les premières lignes du code incluent les bibliothèques nécessaires :
#include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h>
Elles sont essentielles pour que l’ESP32 se connecte au Wi-Fi et communique avec Telegram de manière sécurisée via HTTPS. WiFi.h est utilisée pour la connexion au réseau sans fil, WiFiClientSecure.h permet la communication sécurisée HTTPS, et UniversalTelegramBot.h fournit une interface pratique pour interagir avec l’API du bot Telegram.
Définition des identifiants et des broches
Le code définit ensuite les identifiants Wi-Fi, le token du bot Telegram et l’ID de chat Telegram :
const char* SSID = "xxxx"; const char* PASSWORD = "xxxx"; const String BOT_TOKEN = "xxxxxxxx:xxxxxxxxxxxxxxxxxxxx"; const String CHAT_ID = "xxxx";
Remplacez ces valeurs par votre nom et mot de passe Wi-Fi réels, votre token de bot et l’ID de chat correspondant à votre ID utilisateur.
Ensuite, nous définissons les broches GPIO pour la LED et l’interrupteur. Le GPIO 33 est configuré en sortie pour la LED, et le GPIO 14 est utilisé en entrée avec une résistance pull-up pour l’interrupteur.
const byte LED_PIN = 33; const byte SW_PIN = 14;
La chaîne suivante contient un message d’aide qui sera affiché lorsque la commande /start sera reçue. Comme vous pouvez le voir, nous aurons des commandes pour allumer, éteindre ou basculer la LED et pour obtenir l’état de l’interrupteur :
const char* info = "Commands:\n\n" "/led_on set LED on\n" "/led_off set LED off\n" "/led_toggle toggle LED\n" "/sw_state get switch state\n";
Initialisation du Bot
Le bot est créé avec le token et un client sécurisé :
WiFiClientSecure client; UniversalTelegramBot bot(BOT_TOKEN, client);
WiFiClientSecure permet au bot de communiquer de manière sécurisée avec les serveurs Telegram via HTTPS.
Récupération des nouveaux messages
La fonction getNumMessages() vérifie si de nouveaux messages ont été reçus par le bot :
int getNumMessages() {
return bot.getUpdates(bot.last_message_received + 1);
}
La méthode bot.getUpdates() récupère toutes les mises à jour à partir du dernier message reçu, garantissant que les messages sont traités une seule fois.
Gestion des commandes
La fonction handleNewMessages() est responsable du traitement de chaque nouveau message. Seuls les messages provenant de l’CHAT_ID prédéfini sont traités pour éviter tout accès non autorisé.
void handleNewMessages(int numMessages) {
for (int i = 0; i < numMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID) continue;
Le bot compare ensuite le texte de la commande et effectue les actions correspondantes :
if (text == "/start") {
bot.sendMessage(chat_id, info, "");
}
Lorsque l’utilisateur envoie /start, le bot répond avec la liste des commandes disponibles.

Dans les lignes suivantes, nous gérons les différentes commandes.
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED is ON", "");
digitalWrite(LED_PIN, HIGH);
}
La commande /led_on allume la LED et confirme l’action par un message.
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED is OFF", "");
digitalWrite(LED_PIN, LOW);
}
De même, la commande /led_off éteint la LED.
if (text == "/led_toggle") {
bool state = digitalRead(LED_PIN);
const char* message = state ? "LED off" : "LED on";
bot.sendMessage(chat_id, message, "");
digitalWrite(LED_PIN, state ? LOW : HIGH);
}
La commande /led_toggle combine essentiellement les commandes /led_on et /led_off. Elle lit l’état actuel de la LED et l’inverse. Elle envoie ensuite un message de statut à l’utilisateur.
if (text == "/sw_state") {
bool state = digitalRead(SW_PIN);
const char* message = state ? "Switch is ON" : "Switch is OFF";
bot.sendMessage(chat_id, message, "");
}
Enfin, la commande /sw_state lit l’état de l’interrupteur et informe l’utilisateur si l’interrupteur est ouvert (HIGH) ou appuyé (LOW, interprété comme ÉTEINT à cause du pull-up).
Vous pouvez cliquer sur les liens dans la liste des commandes pour exécuter ces actions. La capture d’écran suivante montre à quoi ressemble une conversation envoyant des commandes via Telegram à l’ESP32 :

Vous pouvez voir les commandes que j’envoie via Telegram à droite et les réponses de l’ESP32 à gauche.
Fonction Setup
Dans la fonction setup(), la communication série est initialisée pour le débogage :
Serial.begin(115200);
Ensuite, les broches GPIO sont configurées :
pinMode(LED_PIN, OUTPUT); pinMode(SW_PIN, INPUT_PULLUP);
La broche de l’interrupteur utilise INPUT_PULLUP, ce qui signifie que nous n’avons pas besoin d’une résistance pull-up externe lors de la connexion de l’interrupteur.
Le certificat pour Telegram est défini afin d’assurer une communication HTTPS sécurisée :
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
Puis le Wi-Fi est connecté dans une boucle bloquante :
WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) delay(100);
Cela garantit que l’appareil ne continue pas tant qu’il n’a pas établi une connexion réseau.
Boucle principale
La fonction loop() vérifie constamment la présence de nouveaux messages :
while (int numMessages = getNumMessages()) {
handleNewMessages(numMessages);
}
delay(1000);
Elle récupère les nouveaux messages Telegram, les traite, puis attend 1 seconde avant de vérifier à nouveau.
Conclusion
Dans cet article, vous avez appris à contrôler une LED et à lire l’état d’un interrupteur en envoyant des messages depuis votre application Telegram sur votre téléphone mobile vers un ESP32.
Si cela vous semble un peu complexe, jetez un œil à notre ESP32 send Telegram Message tutoriel, qui explique plus en détail les bases de l’envoi et de la réception de messages via Telegram.
Si vous avez des questions, n’hésitez pas à les poser dans la section commentaires.
Bon bricolage ; )

