ESP8266 NodeMCU: мониторинг состояния двери с уведомлениями в Telegram
В этом проекте вы будете отслеживать состояние двери с помощью платы ESP8266 NodeMCU и магнитного герконового переключателя. Вы будете получать сообщение в своём аккаунте Telegram всякий раз, когда дверь меняет состояние: открыта или закрыта. Если у вас есть доступ к интернету на смартфоне, вы будете получать уведомления, где бы вы ни находились. Плата ESP8266 будет программироваться с помощью Arduino IDE.
У нас есть аналогичное руководство, которое отправляет электронные письма вместо сообщений Telegram:
Читайте руководство для ESP32: Мониторинг состояния двери с уведомлениями в Telegram
Обзор проекта
В этом проекте мы создадим Telegram-бота, который будет отправлять сообщения в ваш аккаунт Telegram всякий раз, когда дверь меняет состояние. Для обнаружения изменения мы будем использовать магнитный контактный переключатель.
Магнитный контактный переключатель — это, по сути, герконовый переключатель, заключённый в пластиковый корпус, чтобы его можно было легко установить на дверь, окно или ящик для определения того, открыт он или закрыт.
Электрическая цепь замыкается, когда магнит находится рядом с переключателем — дверь закрыта. Когда магнит находится далеко от переключателя — дверь открыта — цепь разомкнута. Смотрите рисунок ниже.
Мы можем подключить герконовый переключатель к GPIO ESP8266 для обнаружения изменений его состояния.
Знакомство с Telegram
Telegram Messenger — это облачный сервис мгновенных сообщений и голосовой связи через IP. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (PC, Mac и Linux). Он бесплатный и не содержит рекламы. Telegram позволяет создавать ботов, с которыми можно взаимодействовать.
«Боты — это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами, используя HTTPS-запросы к Telegram Bot API».
ESP8266 будет взаимодействовать с Telegram-ботом для отправки сообщений в ваш аккаунт Telegram. Всякий раз, когда дверь меняет состояние, вы будете получать уведомление на свой смартфон (при условии, что у вас есть доступ к интернету).
Создание Telegram-бота
Перейдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие шаги для создания Telegram-бота. Сначала найдите «botfather» и нажмите на BotFather, как показано ниже. Или откройте эту ссылку t.me/botfather на своём смартфоне.
Откроется следующее окно, и вам будет предложено нажать кнопку start.
Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и имя пользователя. Мой называется Door Sensor, а имя пользователя — ESPDoorSensorBot.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к боту и токеном бота. Сохраните токен бота, потому что он понадобится вам для того, чтобы ESP8266 мог взаимодействовать с ботом.
Отправка сообщения боту
Этот шаг очень важен. Не пропускайте его. В противном случае проект не будет работать.
Вы должны отправить сообщение своему Telegram-боту из своего аккаунта Telegram, прежде чем он сможет отправлять вам сообщения.
1) Вернитесь на вкладку чатов и в поле поиска введите имя пользователя вашего бота.
2) Выберите своего бота, чтобы начать разговор.
3) Нажмите на ссылку Start.
И это всё! Вы можете перейти к следующему разделу.
Получение вашего Telegram User ID
Чтобы отправить сообщение в ваш аккаунт Telegram, боту нужно знать ваш ID пользователя.
В своём аккаунте Telegram найдите «myidbot» или откройте эту ссылку t.me/myidbot на своём смартфоне.
Начните разговор с этим ботом и введите /getid. Вы получите ответ с вашим ID пользователя. Сохраните этот ID пользователя, потому что он понадобится вам далее в этом руководстве.
Подготовка Arduino IDE
Мы будем программировать плату ESP8266 с помощью Arduino IDE, поэтому убедитесь, что она установлена в вашей Arduino IDE.
Библиотека Universal Telegram Bot
Для взаимодействия с Telegram-ботом мы будем использовать библиотеку Universal Telegram Bot, созданную Brian Lough, которая предоставляет удобный интерфейс для Telegram Bot API.
Выполните следующие шаги для установки последней версии библиотеки.
Нажмите здесь, чтобы скачать библиотеку Universal Arduino Telegram Bot.
Перейдите в Sketch > Include Library > Add .ZIP Library….
Добавьте только что скачанную библиотеку.
Важно: не устанавливайте библиотеку через Arduino Library Manager, так как может быть установлена устаревшая версия.
Для получения всех подробностей о библиотеке ознакомьтесь со страницей библиотеки Universal Arduino Telegram Bot на GitHub.
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries.
Найдите «ArduinoJson».
Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Необходимые компоненты
Вот оборудование, которое вам понадобится для завершения этого проекта:
читайте Лучшие платы разработки ESP8266 |
|
1x магнитный герконовый переключатель |
|
1x резистор 10 кОм |
|
1x макетная плата |
|
Соединительные провода |
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема — ESP8266 с герконовым переключателем
Мы подключили герконовый переключатель к GPIO 4 (D2), но вы можете подключить его к любому подходящему GPIO.
Код
Скопируйте приведённый ниже скетч в вашу Arduino IDE. Замените SSID, пароль, токен бота и ID пользователя на ваши учётные данные.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.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 occurred, 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, "");
}
}
}
Как работает код
Продолжайте читать, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.
Сначала подключите необходимые библиотеки.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
Установите GPIO для герконового переключателя и светодиода (встроенный светодиод — это GPIO 2). Мы будем включать встроенный светодиод, когда дверь открыта.
const int reedSwitch = 4;
const int led = 2; //optional
Булева переменная changeState указывает, изменилось ли состояние двери.
bool changeState = false;
Переменная state будет хранить состояние герконового переключателя, а doorState, как следует из названия, будет хранить состояние двери — закрыта или открыта.
bool state;
String doorState;
Следующие переменные таймера позволяют нам устранить дребезг переключателя. Будут учитываться только изменения, которые произошли с интервалом не менее 1500 миллисекунд.
unsigned long previousMillis = 0;
const long interval = 1500;
Вставьте ваш SSID и пароль в следующие переменные, чтобы ESP8266 мог подключиться к интернету.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Вставьте токен вашего Telegram-бота — тот, который вы получили на шаге Создание Telegram-бота.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Вставьте ваш chat ID — тот, который вы получили на шаге Получение вашего Telegram User ID.
#define CHAT_ID "XXXXXXXXXX"
Создайте нового Wi-Fi клиента с помощью WiFiClientSecure.
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure client;
Создайте бота с токеном и клиентом, определёнными ранее.
UniversalTelegramBot bot(BOTtoken, client);
Функция changeDoorStatus() будет запускаться при каждом обнаружении изменения состояния двери. Эта функция просто устанавливает переменную changeState в true. Затем, в loop(), мы обработаем то, что произойдёт при изменении состояния (инвертируем предыдущее состояние двери и отправим сообщение в ваш аккаунт Telegram).
ICACHE_RAM_ATTR void changeDoorStatus() {
Serial.println("State changed");
changeState = true;
}
setup()
В setup() инициализируйте Serial Monitor для отладки:
Serial.begin(115200);
Добавьте корневой сертификат для api.telegram.org.
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
Установите герконовый переключатель как INPUT. И сохраните текущее состояние при первом запуске ESP8266.
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
Установите светодиод как OUTPUT и установите его состояние в соответствии с состоянием герконового переключателя (цепь замкнута и светодиод выключен; цепь разомкнута и светодиод включён).
pinMode(led, OUTPUT);
digitalWrite(led, state);
дверь закрыта –> ESP8266 считывает сигнал HIGH –> выключить встроенный светодиод (отправить сигнал HIGH*)
дверь открыта –> ESP8266 считывает сигнал LOW –> включить встроенный светодиод (отправить сигнал LOW*)
* встроенный светодиод ESP8266 работает с инвертированной логикой — отправьте сигнал HIGH, чтобы выключить его, и сигнал LOW, чтобы включить.
Настройка прерывания
Установите герконовый переключатель как прерывание.
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
Для установки прерывания в Arduino IDE используется функция attachInterrupt(), которая принимает в качестве аргументов: пин прерывания GPIO, имя вызываемой функции и режим.
Первый аргумент — это прерывание GPIO. Вы должны использовать digitalPinToInterrupt(GPIO) для установки фактического GPIO в качестве пина прерывания.
Второй аргумент функции attachInterrupt() — это имя функции, которая будет вызываться каждый раз при срабатывании прерывания — подпрограмма обработки прерывания (ISR). В данном случае это функция changeDoorStatus.
Функция ISR должна быть максимально простой, чтобы процессор быстро вернулся к выполнению основной программы.
Третий аргумент — это режим. Мы устанавливаем его в CHANGE, чтобы прерывание срабатывало при каждом изменении значения пина — например, с HIGH на LOW и с LOW на HIGH.
Чтобы узнать больше о прерываниях ESP8266, прочитайте следующее руководство:
Инициализация Wi-Fi
Следующие строки подключают ESP8266 к 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");
Отправьте сообщение в ваш аккаунт Telegram, информирующее о том, что бот запустился.
bot.sendMessage(CHAT_ID, "Bot started up", "");
loop()
В loop() мы считываем переменную changeState, и если произошло изменение, отправляем сообщение в ваш аккаунт Telegram.
Сначала проверяем, произошло ли изменение:
if (changeState){
Затем проверяем, прошло ли не менее 1500 миллисекунд с момента последнего изменения состояния.
if(currentMillis - previousMillis >= interval) {
Если это так, сбрасываем таймер и инвертируем текущее состояние переключателя:
state = !state;
Если состояние герконового переключателя равно 1 (true), дверь закрыта. Поэтому мы устанавливаем переменную doorState в значение closed.
if(state) {
doorState = "closed";
}
Если оно равно 0 (false), дверь открыта.
else{
doorState = "open";
}
Устанавливаем состояние светодиода соответствующим образом и выводим состояние двери в Serial Monitor.
digitalWrite(led, state);
changeState = false;
Serial.println(state);
Serial.println(doorState);
Наконец, следующая строка отправляет уведомление в ваш аккаунт Telegram с текущим состоянием двери.
bot.sendMessage(CHAT_ID, "The door is " + doorState, "");
Демонстрация
После изменения скетча с указанием ваших сетевых учётных данных, токена бота и ID пользователя загрузите его на ESP8266. Перейдите в Tools > Board и выберите вашу плату ESP8266. Затем перейдите в Tools > Port и выберите COM-порт, к которому подключён ESP8266.
Откройте Serial Monitor на скорости 115200 бод, чтобы проверить, обнаруживаются ли изменения.
Для прототипирования/тестирования вы можете прикрепить магнитный герконовый переключатель к двери с помощью липучки Velcro.
Теперь, когда кто-то открывает/закрывает вашу дверь, вы получаете сообщение в своём аккаунте Telegram.
Заключение
В этом руководстве вы узнали, как отправлять уведомления в ваш аккаунт Telegram при изменении состояния герконового переключателя. Это может быть полезно для определения того, была ли открыта или закрыта дверь, окно или ящик.
У нас есть похожие руководства, которые могут вам понравиться:
ESP8266 NodeMCU: мониторинг состояния двери с уведомлениями по электронной почте (IFTTT)
Telegram: ESP8266 NodeMCU обнаружение движения с уведомлениями (Arduino IDE)
Узнайте больше о ESP8266 с нашими ресурсами: