Dans ce projet, vous allez surveiller l’état d’une porte à l’aide d’une carte ESP8266 NodeMCU et d’un interrupteur à lame magnétique. Vous recevrez un message dans votre compte Telegram chaque fois que la porte change d’état : ouverte ou fermée. Tant que vous avez accès à Internet sur votre smartphone, vous serez averti où que vous soyez. La carte ESP8266 sera programmée à l’aide d’Arduino IDE.
Nous avons un tutoriel similaire qui envoie des e-mails au lieu de messages Telegram :
Lisez le guide ESP32 : moniteur d’état de porte avec notifications par télégramme
Aperçu du projet
Dans ce projet, nous allons créer un Telegram Bot qui enverra des messages à votre compte Telegram chaque fois qu’une porte change d’état. Pour détecter le changement, nous utiliserons un interrupteur à contact magnétique.
Un interrupteur à contact magnétique est essentiellement un interrupteur à lames enfermé dans une coque en plastique afin que vous puissiez facilement l’appliquer à une porte, une fenêtre ou un tiroir pour détecter s’il est ouvert ou fermé.
Le circuit électrique est fermé lorsqu’un aimant est à proximité de l’interrupteur-porte fermée. Lorsque l’aimant est éloigné de l’interrupteur (porte ouverte), le circuit est ouvert. Voir la figure ci-dessous.
Nous pouvons connecter le commutateur Reed à un GPIO ESP8266 pour détecter les changements dans son état.
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 robots avec lesquels vous pouvez interagir.
« Les bots sont des applications tierces qui s’exécutent dans Telegram. Les utilisateurs peuvent interagir avec les robots 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’ESP8266 interagira avec le bot Telegram pour envoyer des messages à votre compte Telegram. Chaque fois que la porte change d’état, vous recevrez une notification sur votre smartphone (tant que vous avez accès à Internet).
Créer un bot de télégramme
Accédez à Google Play ou App Store, téléchargez et installez Télégramme.
Ouvrez Telegram et suivez les étapes suivantes pour créer un Telegram Bot. Tout d’abord, recherchez « père de famille » et cliquez sur BotFather comme indiqué ci-dessous. Ou ouvrez ce lien t.me/botfather sur votre smartphone.
La fenêtre suivante devrait s’ouvrir et vous serez invité à cliquer sur le bouton début bouton.
Taper /nouveaubot et suivez les instructions pour créer votre bot. Donnez-lui un nom et un nom d’utilisateur. Le mien s’appelle Capteur de porte, et le nom d’utilisateur est ESPDoorSensorBot.
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’ESP8266 puisse interagir avec le bot.
Envoi d’un message au bot
Cette étape est très importante. Ne le manquez pas. Sinon, le projet ne fonctionnera pas.
Vous devez envoyer un message à votre Telegram Bot à partir de votre compte Telegram avant qu’il puisse vous envoyer des messages.
1) Retournez à l’onglet chats, et dans le champ de recherche, saisissez le nom d’utilisateur de votre bot.
2) Sélectionnez votre bot pour démarrer une conversation.
3) Cliquez sur le lien Démarrer.
Et c’est tout! Vous pouvez passer à la section suivante.
Obtenez votre identifiant d’utilisateur Telegram
Pour envoyer un message à votre compte Telegram, le bot doit connaître votre identifiant utilisateur.
Dans votre compte Telegram, recherchez « monidbot » ou ouvrez ce lien t.moi/monidbot sur votre smartphone.
Démarrez une conversation avec ce bot et tapez /getid. Vous recevrez une réponse avec votre identifiant. Sauf que ID de l’utilisateur, car vous en aurez besoin plus tard dans ce didacticiel.
Préparation de l’IDE Arduino
Nous allons programmer le ESP8266 carte utilisant Arduino IDE, alors assurez-vous de l’avoir installé dans votre Arduino IDE.
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.
- Aller à Esquisser > Inclure la bibliothèque > Ajouter.Bibliothèque ZIP...
- 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 cela pourrait installer une version obsolète.
Pour tous les détails sur la bibliothèque, consultez le Page GitHub de la bibliothèque universelle de robots Arduino Telegram.
Bibliothèque ArduinoJson
Vous devez également installer le ArduinoJson bibliothèque. Suivez les étapes suivantes pour installer la bibliothèque.
- Aller à Skech > Inclure la bibliothèque > Gérer les bibliothèques.
- Recherchez « ArduinoJson ».
- Installez la bibliothèque.
Nous utilisons la bibliothèque ArduinoJson version 6.15.2.
Pièces requises
Voici le matériel dont vous avez besoin pour réaliser ce projet :
Vous pouvez utiliser les liens précédents ou aller directement sur MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !
Schéma – ESP8266 avec commutateur Reed
Nous avons câblé l’interrupteur à lames à GPIO 4 (D2), mais vous pouvez le connecter à n’importe quel GPIO approprié.
Code
Copiez le croquis ci-dessous sur votre IDE Arduino. Remplacez le SSID, le mot de passe, le jeton BOT et l’ID utilisateur par vos informations d’identification.
/*
Rui Santos
Complete project details at https://Raspberryme.com/esp8266-nodemcu-door-status-telegram/
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.
*/
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Set GPIOs for LED and reedswitch
const int reedSwitch = 4;
const int led = 2; //optional
// Detects whenever the door changed state
bool changeState = false;
// Holds reedswitch state (1=opened, 0=close)
bool state;
String doorState;
// Auxiliary variables (it will only detect changes that are 1500 milliseconds apart)
unsigned long previousMillis = 0;
const long interval = 1500;
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"
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Runs whenever the reedswitch changes state
ICACHE_RAM_ATTR void changeDoorStatus() {
Serial.println("State changed");
changeState = true;
}
void setup() {
// Serial port for debugging purposes
Serial.begin(115200);
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
// Read the current door state
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
// Set LED state to match door state
pinMode(led, OUTPUT);
digitalWrite(led, state);
// Set the reedswitch pin as interrupt, assign interrupt function and set CHANGE mode
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
bot.sendMessage(CHAT_ID, "Bot started up", "");
}
void loop() {
if (changeState){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// If a state has occured, invert the current door state
state = !state;
if(state) {
doorState = "closed";
}
else{
doorState = "open";
}
digitalWrite(led, state);
changeState = false;
Serial.println(state);
Serial.println(doorState);
//Send notification
bot.sendMessage(CHAT_ID, "The door is " + doorState, "");
}
}
}
Comment fonctionne le code
Continuez à lire pour savoir comment fonctionne le code, ou passez à la Manifestation section.
Tout d’abord, incluez les bibliothèques requises.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
Réglez les GPIO pour le commutateur Reed et la LED (la LED intégrée est GPIO 2). Nous allumerons la LED embarquée lorsque la porte sera ouverte.
const int reedSwitch = 4;
const int led = 2; //optional
le changer d’état La variable booléenne indique si la porte a changé d’état.
bool changeState = false;
le Etat La variable maintiendra l’état du commutateur Reed, et le porteEtat, comme son nom l’indique, maintiendra l’état de la porte : fermée ou ouverte.
bool state;
String doorState;
Les variables de temporisation suivantes nous permettent d’anti-rebondir le commutateur. Seuls les changements survenus avec au moins 1500 millisecondes entre eux seront pris en compte.
unsigned long previousMillis = 0;
const long interval = 1500;
Insérez votre SSID et votre mot de passe dans les variables suivantes afin que l’ESP8266 puisse se connecter à Internet.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Insérez votre Telegram Bot Token, celui que vous avez entré cette étape.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Insérez votre identifiant de chat, celui que vous avez obtenu dans cette étape.
#define CHAT_ID "XXXXXXXXXX"
Créez un nouveau client Wi-Fi avec WiFiClientSécurisé.
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure client;
Créez un bot avec le jeton et le client définis précédemment.
UniversalTelegramBot bot(BOTtoken, client);
le changeDoorStatus() La fonction s’exécutera chaque fois qu’un changement est détecté sur l’état de la porte. Cette fonction change simplement le changer d’état variable à vrai. Ensuite, dans le boucler(), nous gérerons ce qui se passe lorsque l’état change (inversez l’état de la porte précédent et enverrez un message à votre compte Telegram).
ICACHE_RAM_ATTR void changeDoorStatus() {
Serial.println("State changed");
changeState = true;
}
mettre en place()
Dans le mettre en place(), initialisez Serial Monitor à des fins de débogage :
Serial.begin(115200);
Ajoutez un certificat root pour api.telegram.org.
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
Réglez le commutateur à lames comme SAISIR. Et enregistrez l’état actuel lorsque l’ESP8266 démarre pour la première fois.
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
Réglez la LED comme un SORTIR et réglez son état pour qu’il corresponde à l’état du commutateur Reed (circuit fermé et LED éteinte ; circuit ouvert et LED allumée).
pinMode(led, OUTPUT);
digitalWrite(led, state);
- porte fermée -> l’ESP8266 lit un signal HIGH -> éteint la LED embarquée (envoie un signal HIGH*)
- porte ouverte -> l’ESP8266 lit un signal LOW -> allume la LED embarquée (envoie un signal LOW*)
* la LED intégrée de l’ESP8266 fonctionne avec une logique inversée : envoie un signal HAUT pour l’éteindre et un signal BAS pour l’allumer.
Définir une interruption
Réglez le commutateur à lames comme une interruption.
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
Pour définir une interruption dans l’IDE Arduino, vous utilisez le attachInterrupt() fonction, qui accepte comme arguments : la broche d’interruption GPIO, le nom de la fonction à exécuter et le mode.
Le premier argument est une interruption GPIO. Tu devrais utiliser DigitalPinToInterrupt (GPIO) pour définir le GPIO réel comme une broche d’interruption.
Le deuxième argument de la attachInterrupt() fonction est le nom de la fonction qui sera appelée à chaque fois que l’interruption est déclenchée – la routine de service d’interruption (ISR). Dans ce cas, c’est le changer l’état de la porte une fonction.
La fonction ISR doit être aussi simple que possible, afin que le processeur revienne rapidement à l’exécution du programme principal.
Le troisième argument est le mode. Nous l’avons mis à MONNAIE pour déclencher l’interruption chaque fois que la broche change de valeur – par exemple, de HAUT à BAS et de BAS à HAUT.
Pour en savoir plus sur les interruptions avec l’ESP8266, lisez le tutoriel suivant :
Initialiser le Wi-Fi
Les lignes suivantes connectent l’ESP8266 au Wi-Fi.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Envoyez un message à votre compte Telegram pour vous informer que le bot a démarré.
bot.sendMessage(CHAT_ID, "Bot started up", "");
boucler()
Dans le boucler(), nous lirons le changer d’état variable, et si un changement s’est produit, nous enverrons un message à votre compte Telegram.
Tout d’abord, vérifiez si un changement s’est produit :
if (changeState){
Ensuite, vérifiez si au moins 1500 millisecondes se sont écoulées depuis le dernier changement d’état.
if(currentMillis - previousMillis >= interval) {
Si c’est vrai, réinitialisez le minuteur et inversez l’état actuel du commutateur :
state = !state;
Si l’état du commutateur Reed est 1(vrai), la porte est fermée. Alors, on change le porteEtat variable à fermé.
if(state) {
doorState = "closed";
}
Si c’est 0(faux), la porte est ouverte.
else{
doorState = "open";
}
Réglez l’état de la LED en conséquence et imprimez l’état de la porte dans le moniteur série.
digitalWrite(led, state);
changeState = false;
Serial.println(state);
Serial.println(doorState);
Enfin, la ligne suivante envoie une notification à votre compte Telegram avec l’état actuel de la porte.
bot.sendMessage(CHAT_ID, "The door is " + doorState, "");
Manifestation
Après avoir modifié le croquis pour inclure vos informations d’identification réseau, votre jeton de bot et votre identifiant utilisateur, téléchargez-le sur votre ESP8266. Aller à Outils > Conseil et sélectionnez votre carte ESP8266. Ensuite aller à Outils > Port et sélectionnez le port COM auquel l’ESP8266 est connecté.
Ouvrez le moniteur série à un débit en bauds de 115 200 pour vérifier si les changements sont détectés.
Pour le prototypage/test, vous pouvez appliquer l’interrupteur magnétique à votre porte à l’aide de Velcro.
Désormais, lorsque quelqu’un ouvre/ferme votre porte, vous recevez un message sur votre compte Telegram.
Conclusion
Dans ce didacticiel, vous avez appris comment envoyer des notifications à votre compte Telegram lorsque le commutateur à lames change d’état. Cela peut être utile pour détecter si une porte, une fenêtre ou un tiroir a été ouvert ou fermé.
Nous avons des tutoriels similaires qui pourraient vous plaire :
En savoir plus sur l’ESP8266 avec nos ressources :
Merci d’avoir lu.