Bot Telegram ESP32 : alertes, LED et relais depuis ton téléphone
Crée un bot Telegram avec l'ESP32 : token BotFather, chat ID, UniversalTelegramBot, alertes mouvement et gaz, relais par commande et réponse à ton seul ID.
Un bot Telegram ESP32 permet à la carte ESP32 de ta maison de t'envoyer des messages sur ton téléphone et d'exécuter les commandes que tu lui renvoies. Quand il y a du mouvement devant la porte ou du gaz dans la cuisine, une notification tombe aussitôt dans ta poche ; tu écris "/ac" et un relais allume la lampe, tu écris "/kapat" et il l'éteint. Pas besoin de coder ta propre appli, d'ouvrir un port sur ta box ni de payer un service cloud : la Bot API gratuite de Telegram et le Wi-Fi intégré de l'ESP32 suffisent.
Dans ce guide, tu vas monter un système fonctionnel à partir de zéro : tu créeras un bot avec BotFather et récupéreras son token, tu trouveras ton propre chat ID, tu installeras les bibliothèques UniversalTelegramBot et ArduinoJson et tu enverras ton premier message depuis l'ESP32. Ensuite, tu ajouteras des alertes de mouvement et de gaz avec un capteur PIR et un capteur de gaz MQ-2, puis le contrôle d'une LED et d'un relais par commandes Telegram. On verra aussi comment faire répondre le bot à ton seul ID, le réglage du certificat, les différences sur l'ESP8266 et le Raspberry Pi Pico W et les erreurs les plus fréquentes.

Bot Telegram ESP32 : qu'est-ce que c'est et comment ça marche ?
Sur Telegram, un bot est un compte spécial piloté par un programme au lieu d'une personne ; dans notre projet, c'est l'ESP32 qui exécute ce programme. L'ESP32 et ton téléphone ne se connectent jamais directement l'un à l'autre : tous deux parlent au serveur Telegram. Quand tu écris "/ac" au bot depuis ton téléphone, le message attend sur le serveur. Chaque seconde, l'ESP32 envoie une requête HTTPS chiffrée (getUpdates) à api.telegram.org pour demander "y a-t-il de nouveaux messages pour moi ?", récupère le message et l'exécute. Pour envoyer une alerte, il fait une requête sendMessage dans l'autre sens. Comme c'est toujours l'ESP32 qui ouvre la connexion, pas besoin de redirection de port ni d'IP fixe : la carte fonctionne sur n'importe quel réseau Wi-Fi 2,4 GHz relié à internet.
| Notion | À quoi ça sert ? | Exemple |
|---|---|---|
| BotFather | Le bot de Telegram pour créer et gérer des bots | /newbot, /setcommands, /revoke |
| Token du bot | Le mot de passe du bot ; ton code se connecte à Telegram avec | 1234567890:AAE... (nombre, deux-points, longue chaîne) |
| Chat ID | Le numéro de la personne ou du groupe qui reçoit le message | Personne : 123456789, groupe : -1001234567890 |
| getUpdates | Récupère sur le serveur les nouveaux messages envoyés au bot | bot.getUpdates(...) |
| sendMessage | Envoie un message au chat ID indiqué | bot.sendMessage(CHAT_ID, "Bonjour") |
| Commande | Message court commençant par / que le bot comprend | /ac, /kapat, /durum |
Pourquoi Telegram ? Comparaison avec les autres moyens de notification
| Méthode | Avantages | Inconvénients | Idéal pour |
|---|---|---|---|
| Bot Telegram | Gratuit, alertes instantanées, commandes dans les deux sens, aucun port à ouvrir | Pas de graphiques ni de tableau de bord tout prêt | Alarmes et contrôle à distance simple |
| Blynk IoT | Boutons, jauges et graphiques prêts à l'emploi | Limites de messages et d'appareils en offre gratuite | Tableaux de bord de suivi de capteurs |
| E-mail (SMTP) | Fonctionne sur tous les téléphones, accepte de longs rapports | Avec du retard, difficile de recevoir des commandes | Rapports quotidiens |
| SMS (SIM800L) | Ni Wi-Fi ni internet nécessaires | Coût de la carte SIM et des SMS, module en plus | Maison de campagne ou entrepôt sans internet |
| Serveur web sur l'ESP32 | Entièrement local et gratuit | En général accessible seulement depuis le même réseau, pas d'alertes | Tableau de commande à la maison |
En résumé, Telegram est la solution la plus simple et la moins chère pour les projets du type "préviens-moi quand il se passe quelque chose et fais ceci quand je t'envoie une commande". Si tu veux suivre les données de tes capteurs sous forme de graphiques, le tutoriel Blynk ESP32 te conviendra mieux ; si tu as besoin d'alertes depuis un endroit sans Wi-Fi, jette un œil au guide du module GSM SIM800L.
Étape 1 : créer le bot avec BotFather et obtenir le token
- Ouvre Telegram sur ton téléphone ou ton ordinateur, tape BotFather dans la recherche et choisis le compte officiel, celui avec la coche bleue à côté du nom. Méfie-toi des faux comptes aux noms ressemblants.
- Appuie sur Démarrer (Start) et envoie la commande /newbot.
- BotFather te demande d'abord le nom affiché du bot ; tape le nom que tu veux, par exemple "Alarme Maison".
- Il te demande ensuite un nom d'utilisateur. Il doit être unique, ne contenir que des lettres latines, des chiffres et des tirets bas, et se terminer par bot, par exemple alarme_maison_bot. S'il est déjà pris, ajoute un chiffre à la fin et réessaie.
- BotFather répond par "Done! Congratulations on your new bot." avec le lien vers ton bot et son token. Le token a la forme 1234567890:AAE... : un nombre, deux-points et une longue chaîne de caractères. Copie-le en entier et garde-le en lieu sûr.
- Touche le lien envoyé par BotFather pour ouvrir ton bot et appuie sur Démarrer. Cette étape est indispensable : sur Telegram, un bot ne peut pas envoyer le premier message à un utilisateur, c'est toujours toi qui dois lancer la conversation.
Étape 2 : comment trouver ton chat ID Telegram ?
Le token répond à la question "quel bot ?", le chat ID à la question "qui reçoit le message ?". Chaque utilisateur, groupe et canal Telegram possède un identifiant numérique fixe, qui n'a rien à voir avec ton nom d'utilisateur commençant par @. Il existe trois façons simples de trouver ton propre chat ID :
- Avec un bot d'identification : cherche sur Telegram un bot comme @userinfobot et appuie sur Démarrer ; il t'envoie ton numéro sur la ligne Id. Ces bots ne t'appartiennent pas, ils affichent seulement ton ID.
- Avec le navigateur : envoie d'abord n'importe quel message à ton propre bot. Ouvre ensuite api.telegram.org/botTOKEN/getUpdates dans le navigateur de ton ordinateur (colle ton token à la place de TOKEN en gardant le mot "bot" devant). Dans le texte affiché, le nombre de "chat":{"id":123456789 est ton chat ID. Si la page affiche une liste result vide, écris de nouveau au bot et recharge la page.
- Avec l'ESP32 : une fois le code de commandes ci-dessous téléversé, l'ID de toute personne non autorisée s'affiche dans le moniteur série sur une ligne "unauthorized ID". Pour ajouter un membre de ta famille, demande-lui d'écrire au bot et lis son numéro à cet endroit.
Étape 3 : installer UniversalTelegramBot et ArduinoJson
- Si le paquet de cartes ESP32 n'est pas encore installé dans l'Arduino IDE, commence par lui ; les étapes sont dans Qu'est-ce que l'ESP32 ?.
- Ouvre Outils > Gérer les bibliothèques, tape UniversalTelegramBot dans la recherche et installe la bibliothèque de Brian Lough. Les codes de ce guide ont été compilés avec UniversalTelegramBot 1.3.0, ArduinoJson 7 et la version 2.0.11 du paquet de cartes ESP32.
- Si l'installateur te propose les dépendances, choisis Install all ; sinon, cherche ArduinoJson dans la même fenêtre et installe séparément la bibliothèque de Benoit Blanchon.
- Dans Fichier > Exemples > UniversalTelegramBot > ESP32, tu trouveras des exemples tout prêts comme FlashLED ; les codes de ce guide en sont des versions simplifiées, avec la sécurité en plus.
UniversalTelegramBot est écrite avec la syntaxe de la version 6 d'ArduinoJson, mais elle compile sans problème avec ArduinoJson 7. Si tu as activé les avertissements du compilateur dans l'Arduino IDE, tu verras des lignes comme "'DynamicJsonDocument' is deprecated: use JsonDocument instead" ; ce sont des avertissements, pas des erreurs, et le programme fonctionne normalement. Si tu as du mal à installer des bibliothèques, consulte le guide Ajouter une bibliothèque Arduino.
Matériel et schéma de câblage
Pour le projet complet, il te faut une carte de développement ESP32, un capteur de mouvement PIR HC-SR501, un module capteur de gaz MQ-2, un module relais 5 V, une résistance de 10 kΩ et une de 20 kΩ, une breadboard et des fils de connexion. Comme LED, on utilisera la LED bleue intégrée de l'ESP32 sur le GPIO 2. Pour essayer les deux premières étapes, l'ESP32 et un câble USB suffisent ; tu pourras ajouter les capteurs ensuite.




| Connexion | ESP32 | ESP8266 (NodeMCU) | Raspberry Pi Pico W |
|---|---|---|---|
| PIR VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| PIR OUT | GPIO 27 | D5 (GPIO 14) | GP16 |
| MQ-2 VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| MQ-2 AO (via un pont 10 kΩ / 20 kΩ) | GPIO 34 | A0 | GP26 (ADC0) |
| Relais VCC | VIN (5V) | VIN (5V) | VBUS (5V) |
| Relais IN | GPIO 26 | D1 (GPIO 5) | GP15 |
| LED | GPIO 2 (intégrée) | D4 (intégrée, s'allume à LOW) | "LED" (intégrée) |
| Toutes les GND | GND | GND | GND |
Fais aussi attention à l'alimentation : à lui seul, le chauffage du MQ-2 consomme environ 150 mA et la bobine du relais autour de 70 mA, tandis que l'ESP32 peut monter brièvement jusqu'à 250 mA quand il émet en Wi-Fi. Le port USB d'un ordinateur ne fournit pas toujours ce total, et la carte peut redémarrer pile au moment d'envoyer un message. Utilise un adaptateur 5 V d'au moins 1 A et un bon câble ; si le problème persiste, lis ESP32 Brownout et Guru Meditation. Tu peux voir toutes les broches de ta carte dans l'outil Pinout.
Premier test : envoyer un message de l'ESP32 vers Telegram
Avant de passer aux capteurs, vérifions le token et le chat ID avec le code le plus simple possible. Dans le code ci-dessous, remplace le nom du réseau Wi-Fi, le mot de passe et les lignes BOT_TOKEN et CHAT_ID par tes propres informations, puis téléverse-le sur la carte. Ouvre ensuite le moniteur série à 115200 bauds :
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi"; // Wi-Fi adın (yalnız 2,4 GHz) / your Wi-Fi name (2.4 GHz only)
7const char* WIFI_PASS = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID "123456789" // kendi Telegram ID'n / your own Telegram ID
10
11WiFiClientSecure client; // şifreli (HTTPS) bağlantı / encrypted (HTTPS) connection
12UniversalTelegramBot bot(BOT_TOKEN, client);
13
14void setup() {
15 Serial.begin(115200);
16 WiFi.mode(WIFI_STA);
17 WiFi.begin(WIFI_SSID, WIFI_PASS);
18 Serial.print("Wi-Fi'ye baglaniyor / connecting to Wi-Fi");
19 while (WiFi.status() != WL_CONNECTED) {
20 delay(500);
21 Serial.print(".");
22 }
23 Serial.println();
24 Serial.println(WiFi.localIP());
25
26 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate of api.telegram.org
27
28 if (bot.sendMessage(CHAT_ID, "Merhaba! ESP32 çevrimiçi / Hello! ESP32 is online")) {
29 Serial.println("Mesaj gonderildi / message sent");
30 } else {
31 Serial.println("Mesaj gonderilemedi / message failed");
32 }
33}
34
35void loop() {
36}En quelques secondes, ton bot devrait t'envoyer "Hello! ESP32 is online" sur Telegram et le moniteur série devrait afficher "Mesaj gonderildi / message sent". sendMessage() renvoie true quand le message est remis ; si tu vois "message failed", le problème vient de la connexion Wi-Fi, du token, du chat ID ou du réglage du certificat. Avant d'accuser le code, ouvre api.telegram.org/botTOKEN/getMe dans ton navigateur : avec un token valide, tu verras "ok":true et le nom de ton bot ; avec un mauvais, "Unauthorized".
Réglage du certificat : setCACert ou setInsecure ?
Telegram n'accepte que le HTTPS, c'est pourquoi le code utilise WiFiClientSecure au lieu d'un simple WiFiClient. Sur une connexion chiffrée, l'ESP32 doit s'assurer que le serveur en face est bien api.telegram.org ; il le fait en vérifiant le certificat du serveur à l'aide du certificat racine placé en haut de la chaîne. UniversalTelegramBot fournit ce certificat racine prêt à l'emploi sous le nom TELEGRAM_CERTIFICATE_ROOT. La chaîne de certificats de Telegram remonte à Go Daddy Root Certificate Authority - G2, valable jusqu'à fin 2037 ; si Telegram change un jour de fournisseur de certificats, il faudra aussi mettre à jour la bibliothèque.
| Réglage | Ce qu'il fait | Sécurité | Quand l'utiliser ? |
|---|---|---|---|
| client.setCACert(TELEGRAM_CERTIFICATE_ROOT) | Chiffre la connexion et vérifie l'identité du serveur | Élevée | Toujours, c'est le réglage recommandé |
| client.setInsecure() | Chiffre la connexion sans vérifier l'identité du serveur | Moyenne : ne repère pas un faux serveur intercalé | Test rapide pour écarter un problème de certificat |
| Aucun des deux | Avec les cœurs ESP32 actuels, la connexion n'est jamais établie | Ne fonctionne pas | Jamais : aucun message ne part et aucune erreur n'apparaît dans le moniteur série |
| ESP8266 : setTrustAnchors(&cert) | L'équivalent sur l'ESP8266 ; le certificat est passé sous forme de X509List | Élevée | NodeMCU et Wemos D1 Mini ; nécessite l'heure exacte |
Piloter une LED et un relais par commande Telegram (/ac, /kapat)
Rendons maintenant le bot bidirectionnel. Le code ci-dessous demande à Telegram toutes les secondes s'il y a de nouveaux messages ; si le texte est /ac ("allumer" en turc), il allume le relais et la LED, /kapat ("éteindre") les éteint, /durum ("état") donne l'état actuel et /start envoie la liste des commandes. Tu peux les renommer en /allumer et /eteindre, mais garde en tête que les commandes Telegram ne peuvent contenir que des lettres latines minuscules, des chiffres et des tirets bas, sur 32 caractères au maximum. Une commande accentuée comme "/éteindre" n'est pas reconnue comme commande cliquable.
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi";
7const char* WIFI_PASS = "Sifre123";
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
9#define CHAT_ID "123456789" // yalnız bu ID'ye yanıt verilir / only this ID gets answers
10
11const int LED_PIN = 2; // çoğu DevKit'te dahili LED / onboard LED on most DevKits
12const int ROLE_PIN = 26; // röle modülünün IN pini / relay module IN pin
13const bool ROLE_AKTIF_LOW = true; // çoğu modül LOW'da çeker / most modules switch on with LOW
14
15const unsigned long KONTROL_ARALIGI = 1000; // Telegram'a saniyede bir sor / ask Telegram once per second
16unsigned long sonKontrol = 0;
17bool roleAcik = false;
18
19WiFiClientSecure client;
20UniversalTelegramBot bot(BOT_TOKEN, client);
21
22void roleYaz(bool acik) {
23 roleAcik = acik;
24 if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
25 else digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
26 digitalWrite(LED_PIN, acik ? HIGH : LOW); // LED röle durumunu gösterir / LED mirrors the relay
27}
28
29void mesajlariIsle(int adet) {
30 for (int i = 0; i < adet; i++) {
31 String chatId = bot.messages[i].chat_id;
32 String metin = bot.messages[i].text;
33
34 // Güvenlik: tanımadığın kişiye cevap verme / security: never answer strangers
35 if (chatId != CHAT_ID) {
36 Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
37 continue;
38 }
39
40 int at = metin.indexOf('@'); // gruptaki "/ac@bot_adi" -> "/ac" / "/ac@bot_name" in groups -> "/ac"
41 if (at > 0) metin = metin.substring(0, at);
42
43 if (metin == "/start") {
44 String yardim = "Merhaba " + bot.messages[i].from_name + "!\n";
45 yardim += "/ac - röleyi aç / relay ON\n";
46 yardim += "/kapat - röleyi kapat / relay OFF\n";
47 yardim += "/durum - son durum / status";
48 bot.sendMessage(chatId, yardim);
49 } else if (metin == "/ac") {
50 roleYaz(true);
51 bot.sendMessage(chatId, "Röle AÇIK / relay ON");
52 } else if (metin == "/kapat") {
53 roleYaz(false);
54 bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
55 } else if (metin == "/durum") {
56 bot.sendMessage(chatId, roleAcik ? "Röle AÇIK / relay ON" : "Röle KAPALI / relay OFF");
57 } else {
58 bot.sendMessage(chatId, "Bilinmeyen komut, /start yaz / unknown command, send /start");
59 }
60 }
61}
62
63void setup() {
64 Serial.begin(115200);
65 pinMode(LED_PIN, OUTPUT);
66 pinMode(ROLE_PIN, OUTPUT);
67 roleYaz(false); // açılışta röle kapalı / relay off at boot
68
69 WiFi.mode(WIFI_STA);
70 WiFi.begin(WIFI_SSID, WIFI_PASS);
71 while (WiFi.status() != WL_CONNECTED) delay(500);
72 Serial.println(WiFi.localIP());
73
74 client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
75 bot.sendMessage(CHAT_ID, "Bot hazır, /start yaz / bot ready, send /start");
76}
77
78void loop() {
79 if (millis() - sonKontrol > KONTROL_ARALIGI) {
80 int adet = bot.getUpdates(bot.last_message_received + 1); // yeni mesaj var mı? / any new messages?
81 while (adet) {
82 mesajlariIsle(adet);
83 adet = bot.getUpdates(bot.last_message_received + 1);
84 }
85 sonKontrol = millis();
86 }
87}| Ligne | Rôle |
|---|---|
| bot.getUpdates(bot.last_message_received + 1) | Demande les messages arrivés après le dernier traité et renvoie leur nombre ; le +1 évite de recevoir deux fois le même message |
| bot.messages[i].chat_id | L'ID de la discussion d'où vient le message ; la réponse y est envoyée et le contrôle de sécurité s'en sert |
| bot.messages[i].text | Le texte reçu ; c'est avec lui qu'on compare la commande |
| metin.indexOf('@') | Coupe la partie @nom_du_bot que Telegram ajoute aux commandes dans les groupes |
| ROLE_AKTIF_LOW | La plupart des modules relais s'activent sur LOW ; si le tien s'active sur HIGH, mets false |
| KONTROL_ARALIGI | Fréquence d'interrogation ; 1000 ms réagit vite, 3000–5000 ms sollicite moins le réseau |
Sécurité : le bot ne doit répondre qu'à ton ID
Sur Telegram, les noms d'utilisateur des bots sont publics et faciles à rechercher. Si quelqu'un devine alarme_maison_bot ou le repère sur une capture d'écran et lui envoie /ac, un ESP32 sans contrôle exécutera aussi cette commande. C'est pourquoi la ligne la plus importante du code est la vérification chatId != CHAT_ID. Ton chat ID n'a pas besoin d'être secret : la protection vient du fait que Telegram lui-même certifie l'expéditeur de chaque message, et personne ne peut usurper l'ID d'un autre. Ne pas répondre du tout aux inconnus est aussi un choix délibéré : tant que le bot reste muet, personne ne sait même qu'il tourne.
- Utilise une liste blanche : garde les ID autorisés dans un tableau, ignore tous les autres messages et ajoute les membres de ta famille un par un.
- Dans un groupe, vérifie la personne : dans un groupe, le chat ID est celui du groupe ; si seules certaines personnes doivent pouvoir commander, compare from_id au lieu de chat_id.
- Garde le token dans un fichier à part : place le token et le mot de passe Wi-Fi dans un fichier comme secrets.h et laisse-le de côté quand tu partages ton code.
- Ignore les vieilles commandes : un /ac envoyé pendant une coupure de courant ne doit pas s'exécuter à un moment inattendu au redémarrage ; le nettoyage au démarrage du code complet s'en charge.
- État de départ sûr : démarre toujours avec le relais éteint ; c'est essentiel pour des charges comme un radiateur ou une pompe.
- Ne confie pas les tâches critiques au seul bot : pour une serrure ou une chaudière, pense aux conséquences d'une mauvaise commande et ajoute un message de confirmation ou une limite de temps.
Alarme mouvement et gaz : projet complet avec alertes Telegram
Assemblons maintenant toutes les pièces. Le code ci-dessous t'envoie une alerte Telegram horodatée quand le capteur PIR détecte un mouvement et quand la mesure de gaz du MQ-2 dépasse le seuil. En même temps, il écoute les commandes /ac, /kapat, /alarm_ac, /alarm_kapat et /durum, affiche un menu de boutons en bas de l'écran quand tu écris /start et ajoute les commandes au bouton Menu de Telegram. Pour les détails de chaque capteur, consulte les guides du capteur de mouvement PIR et du capteur de gaz MQ-2.
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID "123456789" // bildirimlerin gideceği ID / the ID that receives alerts
11
12// Komut verebilecek kişiler; aile üyesi eklemek için: { CHAT_ID, "222222222" }
13// People allowed to send commands; to add a family member: { CHAT_ID, "222222222" }
14const char* YETKILI[] = { CHAT_ID };
15const int YETKILI_SAYISI = sizeof(YETKILI) / sizeof(YETKILI[0]);
16
17const int LED_PIN = 2; // dahili LED / onboard LED
18const int ROLE_PIN = 26; // röle modülü IN / relay module IN
19const int PIR_PIN = 27; // PIR sensörü OUT / PIR sensor OUT
20const int GAZ_PIN = 34; // MQ-2 AO, gerilim bölücü üzerinden / MQ-2 AO through a voltage divider
21const bool ROLE_AKTIF_LOW = true; // çoğu modül LOW'da çeker / most modules switch on with LOW
22
23const int GAZ_ESIK = 1800; // temiz havadaki değere göre ayarla / tune it from your clean-air reading
24const int GAZ_FARK = 200; // histerezis payı / hysteresis margin
25const unsigned long HAREKET_BEKLEME = 60000; // iki hareket bildirimi arası en az 60 sn / at least 60 s between motion alerts
26const unsigned long GAZ_ISINMA = 120000; // MQ-2 ilk 2 dakika ısınır / MQ-2 warms up for the first 2 minutes
27const unsigned long KONTROL_ARALIGI = 1000; // Telegram'a saniyede bir sor / poll Telegram once per second
28
29WiFiClientSecure client;
30UniversalTelegramBot bot(BOT_TOKEN, client);
31
32bool alarmKurulu = true; // hareket alarmı açık mı / is the motion alarm armed
33bool roleAcik = false;
34bool gazVar = false;
35unsigned long sonKontrol = 0;
36unsigned long sonHareket = 0;
37
38String saat() { // "14:05:31" biçiminde saat / time as "14:05:31"
39 struct tm t;
40 if (!getLocalTime(&t, 100)) return "--:--:--";
41 char buf[9];
42 strftime(buf, sizeof(buf), "%H:%M:%S", &t);
43 return String(buf);
44}
45
46bool yetkiliMi(const String& id) {
47 for (int i = 0; i < YETKILI_SAYISI; i++) {
48 if (id == YETKILI[i]) return true;
49 }
50 return false;
51}
52
53void roleYaz(bool acik) {
54 roleAcik = acik;
55 if (ROLE_AKTIF_LOW) digitalWrite(ROLE_PIN, acik ? LOW : HIGH);
56 else digitalWrite(ROLE_PIN, acik ? HIGH : LOW);
57}
58
59String durumMetni() {
60 String s = "Röle / relay: ";
61 s += roleAcik ? "AÇIK / ON" : "KAPALI / OFF";
62 s += "\nAlarm: ";
63 s += alarmKurulu ? "KURULU / ARMED" : "KAPALI / DISARMED";
64 s += "\nGaz / gas: " + String(analogRead(GAZ_PIN));
65 s += "\nWi-Fi: " + String(WiFi.RSSI()) + " dBm";
66 return s;
67}
68
69void mesajlariIsle(int adet) {
70 for (int i = 0; i < adet; i++) {
71 String chatId = bot.messages[i].chat_id;
72 String metin = bot.messages[i].text;
73
74 if (!yetkiliMi(chatId)) { // yabancıya sessiz kal / stay silent to strangers
75 Serial.println("Yetkisiz ID / unauthorized ID: " + chatId);
76 continue;
77 }
78 int at = metin.indexOf('@'); // "/ac@bot_adi" -> "/ac"
79 if (at > 0) metin = metin.substring(0, at);
80
81 if (metin == "/ac") {
82 roleYaz(true);
83 bot.sendMessage(chatId, "Röle AÇIK / relay ON");
84 } else if (metin == "/kapat") {
85 roleYaz(false);
86 bot.sendMessage(chatId, "Röle KAPALI / relay OFF");
87 } else if (metin == "/alarm_ac") {
88 alarmKurulu = true;
89 bot.sendMessage(chatId, "Hareket alarmı kuruldu / motion alarm armed");
90 } else if (metin == "/alarm_kapat") {
91 alarmKurulu = false;
92 bot.sendMessage(chatId, "Hareket alarmı kapatıldı / motion alarm disarmed");
93 } else if (metin == "/durum") {
94 bot.sendMessage(chatId, durumMetni());
95 } else { // /start ve diğer her şey: tuş menüsü / /start and anything else: button menu
96 String klavye = "[[\"/ac\",\"/kapat\"],[\"/alarm_ac\",\"/alarm_kapat\"],[\"/durum\"]]";
97 bot.sendMessageWithReplyKeyboard(chatId, "Komut seç / choose a command", "", klavye, true);
98 }
99 }
100}
101
102void setup() {
103 Serial.begin(115200);
104 pinMode(LED_PIN, OUTPUT);
105 pinMode(ROLE_PIN, OUTPUT);
106 pinMode(PIR_PIN, INPUT);
107 roleYaz(false); // açılışta röle kapalı / relay off at boot
108
109 WiFi.mode(WIFI_STA);
110 WiFi.begin(WIFI_SSID, WIFI_PASS);
111 while (WiFi.status() != WL_CONNECTED) {
112 delay(500);
113 Serial.print(".");
114 }
115 Serial.println(WiFi.localIP());
116
117 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate of api.telegram.org
118 bot.maxMessageLength = 4000; // büyük mesajlarda takılmayı önler / prevents hanging on big messages
119 configTime(3 * 3600, 0, "pool.ntp.org"); // Türkiye UTC+3; kendi saat dilimini yaz / Turkey is UTC+3, set your own zone
120
121 // Telegram'daki Menü düğmesi; komutlar küçük harf, Türkçe karakter yok
122 // The Menu button in Telegram; commands are lowercase with no special letters
123 bot.setMyCommands("[{\"command\":\"ac\",\"description\":\"Röleyi aç\"},"
124 "{\"command\":\"kapat\",\"description\":\"Röleyi kapat\"},"
125 "{\"command\":\"alarm_ac\",\"description\":\"Hareket alarmını kur\"},"
126 "{\"command\":\"alarm_kapat\",\"description\":\"Hareket alarmını kapat\"},"
127 "{\"command\":\"durum\",\"description\":\"Durumu göster\"}]");
128
129 // Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
130 while (bot.getUpdates(bot.last_message_received + 1)) { }
131
132 bot.sendMessage(CHAT_ID, "Sistem açıldı / system started " + saat());
133}
134
135void loop() {
136 unsigned long simdi = millis();
137
138 // 1) Hareket alarmı / motion alarm
139 if (alarmKurulu && digitalRead(PIR_PIN) == HIGH && simdi - sonHareket > HAREKET_BEKLEME) {
140 sonHareket = simdi;
141 digitalWrite(LED_PIN, HIGH);
142 bot.sendMessage(CHAT_ID, "Hareket algılandı! / motion detected! " + saat());
143 digitalWrite(LED_PIN, LOW);
144 }
145
146 // 2) Gaz alarmı: ısınmadan sonra, susturulamaz / gas alarm: after warm-up, cannot be muted
147 if (simdi > GAZ_ISINMA) {
148 int gaz = analogRead(GAZ_PIN); // 0-4095
149 if (!gazVar && gaz > GAZ_ESIK) {
150 gazVar = true;
151 bot.sendMessage(CHAT_ID, "GAZ ALARMI! / GAS ALARM! " + String(gaz) + " " + saat());
152 } else if (gazVar && gaz < GAZ_ESIK - GAZ_FARK) {
153 gazVar = false;
154 bot.sendMessage(CHAT_ID, "Gaz normale döndü / gas back to normal: " + String(gaz));
155 }
156 }
157
158 // 3) Telegram komutları / Telegram commands
159 if (simdi - sonKontrol > KONTROL_ARALIGI && WiFi.status() == WL_CONNECTED) {
160 int adet = bot.getUpdates(bot.last_message_received + 1);
161 while (adet) {
162 mesajlariIsle(adet);
163 adet = bot.getUpdates(bot.last_message_received + 1);
164 }
165 sonKontrol = millis();
166 }
167}| Réglage | Valeur | Explication |
|---|---|---|
| GAZ_ESIK | 1800 | Valeur ADC brute de 0 à 4095 ; fixe-la d'après ta mesure à l'air pur |
| GAZ_FARK | 200 | La mesure doit redescendre d'autant sous le seuil avant le message "retour à la normale" ; évite les alertes qui oscillent à la limite |
| HAREKET_BEKLEME | 60000 ms | Laisse au moins 60 secondes entre deux alertes de mouvement |
| GAZ_ISINMA | 120000 ms | Le MQ-2 donne des valeurs élevées en chauffant ; le gaz n'est pas surveillé pendant les 2 premières minutes |
| KONTROL_ARALIGI | 1000 ms | Fréquence à laquelle on demande les nouveaux messages à Telegram |
| bot.maxMessageLength | 4000 | La réponse la plus longue que lit la bibliothèque ; 1500 par défaut |
Les deux alarmes du code fonctionnent volontairement de façon différente. L'alarme de mouvement est protégée par un délai d'attente : un capteur PIR se déclenche encore et encore pendant que quelqu'un se promène dans la pièce, et sans ce délai ton téléphone recevrait des dizaines de messages par minute. Comme le compteur part de zéro, la première alerte arrive au plus tôt 60 secondes après le démarrage de la carte, ce qui correspond aussi à la minute environ dont un capteur PIR a besoin pour se stabiliser à la mise sous tension. L'alarme de gaz utilise plutôt une hystérésis : elle prévient une fois quand la mesure dépasse le seuil, n'annonce "retour à la normale" qu'une fois redescendue 200 unités en dessous et, par sécurité, ne peut pas être coupée avec /alarm_kapat. Telegram n'accepte pas non plus les messages trop rapprochés : si tu essaies d'envoyer plus d'un message par seconde dans la même discussion, ou plus de 20 par minute dans un groupe, tu recevras l'erreur "Too Many Requests: retry after".
Bot Telegram avec l'ESP8266 (NodeMCU)
La même bibliothèque fonctionne aussi sur les cartes ESP8266 NodeMCU et Wemos D1 Mini ; la logique des commandes et des alarmes reste exactement la même, seule la partie connexion change. On inclut ESP8266WiFi.h au lieu de WiFi.h, le certificat racine est passé sous forme de X509List à setTrustAnchors() et, comme l'ESP8266 vérifie les dates de validité du certificat, il faut récupérer l'heure par NTP avant de se connecter. Sans l'heure, chaque connexion échoue en silence. La LED intégrée du NodeMCU se trouve sur la broche D4 et s'allume à LOW, et il n'y a qu'une seule entrée analogique, A0.
1#include <ESP8266WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
10#define CHAT_ID "123456789"
11
12X509List cert(TELEGRAM_CERTIFICATE_ROOT); // ESP8266'da kök sertifika böyle verilir / how ESP8266 takes the root certificate
13WiFiClientSecure client;
14UniversalTelegramBot bot(BOT_TOKEN, client);
15
16void setup() {
17 Serial.begin(115200);
18 configTime(0, 0, "pool.ntp.org"); // sertifika kontrolü için saat şart / the clock is needed to check the certificate
19 client.setTrustAnchors(&cert);
20
21 WiFi.mode(WIFI_STA);
22 WiFi.begin(WIFI_SSID, WIFI_PASS);
23 while (WiFi.status() != WL_CONNECTED) delay(500);
24
25 time_t simdi = time(nullptr); // NTP saatini bekle / wait for the NTP time
26 while (simdi < 24 * 3600) {
27 delay(100);
28 simdi = time(nullptr);
29 }
30 bot.sendMessage(CHAT_ID, "ESP8266 çevrimiçi / ESP8266 is online");
31}
32
33void loop() {
34}Bot Telegram avec le Raspberry Pi Pico W et MicroPython
Le Raspberry Pi Pico W n'a besoin d'aucune bibliothèque particulière : avec le module requests de MicroPython, tu envoies directement tes requêtes à la Bot API de Telegram. Le code ci-dessous envoie une alerte en cas de mouvement, pilote avec /ac et /kapat le relais branché sur GP15 et la LED intégrée de la carte, et ne répond qu'à ton chat ID. Installe un MicroPython récent sur le Pico W avec Thonny et enregistre le code sous le nom main.py. Le module requests de MicroPython chiffre la connexion mais ne vérifie pas le certificat du serveur ; son niveau de sécurité est donc le même que setInsecure() sur l'ESP32.
1import network, time
2import requests
3from machine import Pin
4
5WIFI_SSID = "AgAdi" # Wi-Fi adın / your Wi-Fi name
6WIFI_PASS = "Sifre123" # Wi-Fi şifren / your Wi-Fi password
7TOKEN = "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
8CHAT_ID = 123456789 # sayı olarak yaz / write it as a number
9API = "https://api.telegram.org/bot" + TOKEN
10
11led = Pin("LED", Pin.OUT) # Pico W dahili LED / Pico W onboard LED
12role = Pin(15, Pin.OUT, value=1) # aktif LOW röle kapalı başlar / active-LOW relay starts off
13pir = Pin(16, Pin.IN) # PIR OUT
14
15wlan = network.WLAN(network.STA_IF)
16wlan.active(True)
17wlan.connect(WIFI_SSID, WIFI_PASS)
18while not wlan.isconnected():
19 time.sleep(0.5)
20print("IP:", wlan.ifconfig()[0])
21
22def gonder(metin):
23 try:
24 r = requests.post(API + "/sendMessage", json={"chat_id": CHAT_ID, "text": metin})
25 r.close()
26 except Exception as e:
27 print("Gonderilemedi / send failed:", e)
28
29def yeni_mesajlar(offset):
30 try:
31 r = requests.get(API + "/getUpdates?timeout=0&limit=5&offset=%d" % offset)
32 sonuc = r.json().get("result", [])
33 r.close()
34 return sonuc
35 except Exception as e:
36 print("Okunamadi / read failed:", e)
37 return []
38
39# Kart kapalıyken gelen eski komutları atla / skip old commands sent while the board was off
40offset = 0
41eski = yeni_mesajlar(offset)
42while eski:
43 offset = eski[-1]["update_id"] + 1
44 eski = yeni_mesajlar(offset)
45
46gonder("Pico W çevrimiçi / Pico W is online")
47son_hareket = time.ticks_ms() # ilk 60 sn PIR dengelenir / the PIR settles in the first 60 s
48
49while True:
50 if pir.value() and time.ticks_diff(time.ticks_ms(), son_hareket) > 60000:
51 son_hareket = time.ticks_ms()
52 gonder("Hareket algılandı! / motion detected!")
53
54 for u in yeni_mesajlar(offset):
55 offset = u["update_id"] + 1
56 mesaj = u.get("message", {})
57 if mesaj.get("chat", {}).get("id") != CHAT_ID: # yalnız sana yanıt ver / answer only you
58 continue
59 komut = mesaj.get("text", "").split("@")[0]
60 if komut == "/ac":
61 role.value(0) # aktif LOW: 0 = açık / active LOW: 0 = on
62 led.on()
63 gonder("Röle AÇIK / relay ON")
64 elif komut == "/kapat":
65 role.value(1)
66 led.off()
67 gonder("Röle KAPALI / relay OFF")
68 elif komut == "/durum":
69 gonder("Röle / relay: " + ("AÇIK / ON" if role.value() == 0 else "KAPALI / OFF"))
70 time.sleep(1)Idées de projets avec un bot Telegram ESP32
- Alarme de porte et de fenêtre : avec un capteur reed ou un capteur PIR, envoie un message sur ton téléphone dès qu'il y a du mouvement en ton absence.
- Caméra de surveillance avec photos : prends une photo avec un ESP32-CAM en cas de mouvement et envoie-la sur Telegram ; les étapes sont dans le guide ESP32-CAM et Telegram.
- Suivi d'une pièce ou d'une serre : reçois une alerte quand la température mesurée par un DHT11 dépasse une limite, et demande la valeur actuelle avec /durum.
- Rappel d'arrosage : sois prévenu quand un capteur d'humidité du sol indique un sol sec, et lance la pompe quelques secondes avec une commande comme /sula ("arroser").
- Alerte incendie : associe un capteur de flamme au MQ-2 pour surveiller les deux dangers à la fois.
- Capteur de boîte aux lettres sur pile : laisse l'ESP32 en deep sleep, réveille-le à l'ouverture du clapet, envoie un seul message et rendors-le.
- Prise à distance : allume ou éteins une lampe de bureau ou un ventilateur depuis n'importe où dans le monde avec /ac et /kapat via un relais.
Erreurs fréquentes du bot Telegram ESP32 et solutions
| Symptôme ou message | Cause | Solution |
|---|---|---|
| sendMessage renvoie false, aucune erreur dans le moniteur série | La ligne setCACert ou setInsecure manque, le token contient une espace ou le Wi-Fi n'est pas connecté | Ajoute la ligne du certificat, recopie le token, vérifie d'abord la connexion Wi-Fi |
| "Forbidden: bot can't initiate conversation with a user" lors du test dans le navigateur | Tu n'as jamais appuyé sur Démarrer dans le bot ou tu l'as bloqué | Ouvre le bot dans Telegram et appuie sur Démarrer ; débloque-le si besoin |
| "Bad Request: chat not found" | Mauvais chat ID, signe moins oublié dans un ID de groupe ou bot retiré du groupe | Relis l'ID avec getUpdates et écris les ID de groupe avec le signe moins |
| "Unauthorized" | Le token est faux ou a été remplacé avec /revoke | Copie le token actuel depuis BotFather et téléverse de nouveau le code |
| Envoie des messages mais ignore les commandes | Un long delay() dans loop(), un mauvais chat ID ou le @nom_du_bot ajouté à la commande dans un groupe | Attends avec millis(), coupe la partie @ et regarde la ligne "unauthorized ID" dans le moniteur série |
| Le bot est devenu complètement muet après une photo ou un sticker | La bibliothèque ne lit que les 1500 premiers caractères d'une réponse ; une réponse longue ne peut pas être décodée et le même message revient sans cesse | Ajoute la ligne bot.maxMessageLength = 4000; dans setup() |
| La carte exécute de vieilles commandes au démarrage | Telegram conserve les messages non lus jusqu'à 24 heures | Au démarrage, lis et ignore les messages en attente |
| "Conflict: terminated by other getUpdates request" | Le même token tourne en même temps sur deux appareils ou dans un script sur ton ordinateur | Crée un bot distinct dans BotFather pour chaque appareil |
| "Too Many Requests: retry after 30" | Les messages sont envoyés trop rapprochés | Ajoute un délai d'attente ; au maximum un message par seconde dans la même discussion |
| À la compilation, "ArduinoJson.h: No such file or directory" | La bibliothèque ArduinoJson n'est pas installée | Installe ArduinoJson depuis le gestionnaire de bibliothèques |
| La carte redémarre en envoyant un message | L'alimentation ne suit pas le pic de courant pendant l'émission Wi-Fi (brownout) | Adaptateur 1 A, câble court de qualité et condensateur de 100 à 470 µF entre 3V3 et GND |
Avec un token, un chat ID et quelques lignes de code, ton ESP32 est devenu un petit assistant qui te tient au courant de ce qui se passe chez toi et exécute tes ordres. Tu peux enrichir le même montage avec des capteurs de température, de niveau d'eau ou de porte et envoyer les alertes dans un groupe familial. Dans l'application BlueGrays, tu trouveras pas à pas, avec schémas et code, le système d'alarme de mouvement ESP32 qui prévient sur Telegram avec PIR, buzzer et LED, l'alarme détecteur de gaz et de fumée MQ-2 et les projets Wi-Fi avec l'ESP32.
Questions fréquentes
Un bot Telegram ESP32 est-il gratuit ?
Oui. Créer un bot sur Telegram, utiliser la Bot API et envoyer des messages est entièrement gratuit, sans quota mensuel de messages. Il existe seulement des limites de débit : environ un message par seconde dans la même discussion et 20 messages par minute dans un groupe. Pour des projets à la maison, c'est largement suffisant.
Comment trouver mon chat ID Telegram ?
Le plus simple est d'appuyer sur Démarrer dans un bot d'identification comme @userinfobot ; il t'envoie ton numéro d'ID. Tu peux aussi écrire à ton propre bot, ouvrir api.telegram.org/botTOKEN/getUpdates dans le navigateur et lire la valeur id dans la partie "chat". Les ID de groupe commencent par un signe moins.
Pourquoi mon ESP32 n'envoie-t-il pas de messages sur Telegram ?
Les causes les plus fréquentes sont de ne jamais avoir appuyé sur Démarrer dans le bot, un mauvais chat ID, une espace dans le token ou une ligne setCACert ou setInsecure absente du code. Les adresses getMe et sendMessage ouvertes dans un navigateur permettent de tester le token et le chat ID indépendamment du code. Vérifie aussi que la carte est connectée à un réseau Wi-Fi 2,4 GHz.
Quelqu'un d'autre peut-il contrôler mon bot Telegram ?
Les noms d'utilisateur des bots sont publics : sans vérification d'ID dans ton code, n'importe qui trouvant le bot peut lui envoyer des commandes. Comparer le chat ID de chaque message entrant au tien et ignorer les autres l'en empêche, car Telegram certifie l'identité de l'expéditeur. Ne partage jamais non plus le token ; s'il fuite, remplace-le avec /revoke dans BotFather.
Peut-on faire un bot Telegram avec l'ESP8266 ?
Oui. La bibliothèque UniversalTelegramBot fonctionne aussi sur les cartes ESP8266 comme le NodeMCU et la Wemos D1 Mini. Le certificat racine est passé sous forme de X509List à setTrustAnchors() et l'heure doit être récupérée par NTP avant la connexion. L'ESP8266 ayant moins de mémoire, l'ESP32 gère mieux les longs messages.
L'ESP32 peut-il envoyer des photos sur Telegram ?
Oui. Avec la fonction sendPhotoByBinary() de la bibliothèque, tu peux envoyer directement sur Telegram une image prise par un ESP32-CAM. Un ESP32 sans caméra peut envoyer de la même façon une image stockée sur une carte SD, ou l'adresse d'une image en ligne avec sendPhoto(). Les systèmes qui envoient une photo lors d'un mouvement font partie des projets de sécurité les plus populaires.
Projets à réaliser après cet article
Voir tous les projets
Clignotement LED avec ESP32
Enseigne l'utilisation de base des sorties GPIO avec l'ESP32. Nous obtenons un effet de clignotement en allumant et éteignant une LED à partir de la broche numérique. Version ESP32 du projet blink classique sur Arduino UNO ; les commandes de base de blink dans l'environnement Arduino restent les mêmes, mais le brochage et les niveaux GPIO de 3,3 V de l'ESP32 diffèrent de ceux de l'Arduino UNO.

Clignotement de la LED interne de l'ESP32
Faire clignoter la LED bleue intégrée à l'ESP32 DevKit V1. Aucun composant externe n'est nécessaire ! Le premier projet que vous devriez essayer lorsque vous achetez un ESP32. Le GPIO 2 est connecté à la LED interne.

Système d'Alarme de Mouvement ESP32 (PIR + Buzzer + LED + Telegram)
Un système d'alarme de sécurité intelligent qui active le buzzer et la LED lorsque le capteur PIR détecte un mouvement, tout en envoyant une notification instantanée au propriétaire via Telegram. Il intègre un délai d'attente de 30 secondes pour limiter la fréquence des alarmes répétées ; ce mécanisme ne vérifie pas la validité des détections du capteur PIR et n'élimine pas les faux déclenchements. Idéal pour la sécurité domestique, la surveillance de garage, d'entrepôts ou de bureaux. Avec l'ES

Alarme de détection de gaz/fumée ESP32 MQ-2
Dans ce projet, la détection de gaz combustibles (GPL, méthane, propane) et de fumée est assurée par un module capteur de gaz MQ-2 ; dès la détection, une alarme sonore semblable à une sirène retentit via un buzzer passif. La sortie numérique de seuil (DO) du capteur est connectée au GPIO 4 de l'ESP32 ; quand le gaz ou la fumée dépasse le seuil, DO passe à LOW et l'alarme se déclenche. La sensibilité se règle via le potentiomètre du module. Le buzzer est piloté par tone().

Éclairage Intelligent ESP32 (PIR + LDR + Relais + OLED)
Transformez votre couloir, votre salle de bain ou votre garde-manger en éclairage intelligent avec l'ESP32 ! En utilisant un capteur de mouvement PIR, un capteur de lumière LDR et un module relais, nous construisons le scénario classique "la lumière s'allume lorsqu'un mouvement est détecté dans l'obscurité" — si l'environnement est déjà lumineux, le mouvement N'ACTIVE PAS la lumière, économisant ainsi de l'énergie pendant la journée. La lumière reste allumée pendant 30 secondes ; si le mouvement

Éclairage automatique avec le capteur de mouvement PIR ESP32
Dans ce projet, nous allons détecter toute personne entrant dans la pièce à l'aide du capteur de mouvement PIR HC-SR501 et allumer automatiquement la LED. Nous suivrons la durée d'allumage de la LED avec millis() ; chaque lecture HIGH du capteur actualisera l'instant du dernier mouvement, et la LED s'éteindra au moins 10 secondes après la dernière lecture HIGH. Le code actuel attend également 50 ms à chaque itération avec delay(50) ; la boucle de l'application n'est donc pas entièrement non

Connexion Wi-Fi STA ESP32 (avec écran LCD)
Dans ce projet, nous connectons l'ESP32 au réseau Wi-Fi domestique en mode Station (STA) de manière sécurisée et tolérante aux pannes. Nous isolons SSID/mot de passe dans un fichier secrets.h pour empêcher leur fuite sur Git, mettons en place une reconnexion automatique, et affichons le niveau RSSI et l'adresse IP sur un écran LCD I2C. La LED intégrée sert d'indicateur d'état.
Autres articles
- Qu'est-ce que l'ESP32 ? Caractéristiques, installation dans l'Arduino IDE et premier projet Wi-Fi
- Capteur de mouvement PIR (HC-SR501) : détection de mouvement avec Arduino, ESP32 et Pico
- Capteur de gaz MQ-2 : alarme gaz et fumée avec Arduino
- ESP32-CAM Telegram : envoyer une photo dès qu'il y a un mouvement
Application BlueGrays
Réalise ce montage pas à pas sur ton téléphone
Schéma, code et liste des composants sur un seul écran. Plus de 200 projets Arduino, ESP32 et Pico à réaliser.
Scanne avec ton téléphone
Pointe l’appareil photo vers le code : la boutique d’applications de ton téléphone s’ouvre.
ou ouvre la boutique

