ESP32: Мониторинг состояния двери с уведомлениями в Telegram
В этом проекте вы будете отслеживать состояние двери с помощью платы ESP32 и магнитного герконового переключателя. Вы будете получать сообщение в свой аккаунт Telegram каждый раз, когда дверь меняет состояние: открыта или закрыта. Пока у вас есть доступ к интернету на смартфоне, вы будете получать уведомления, где бы вы ни находились. Плата ESP32 будет программироваться с использованием Arduino IDE.
У нас есть похожее руководство, которое отправляет электронные письма вместо сообщений Telegram:
Читайте руководство для ESP8266: Door Status Monitor with Telegram Notifications
Обзор проекта
В этом проекте мы создадим Telegram-бота, который будет отправлять сообщения в ваш аккаунт Telegram каждый раз, когда дверь меняет состояние. Для обнаружения изменения мы будем использовать магнитный контактный переключатель.
Магнитный контактный переключатель – это, по сути, герконовый переключатель, заключённый в пластиковый корпус, чтобы его можно было легко установить на дверь, окно или ящик для определения того, открыт он или закрыт.
Электрическая цепь замкнута, когда магнит находится рядом с переключателем – дверь закрыта. Когда магнит находится далеко от переключателя – дверь открыта – цепь разомкнута. Смотрите рисунок ниже.
Мы можем подключить герконовый переключатель к GPIO ESP32 для обнаружения изменений его состояния.
Знакомство с Telegram
Telegram Messenger – это облачный сервис обмена мгновенными сообщениями и передачи голоса по IP. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (PC, Mac и Linux). Он бесплатный и без рекламы. Telegram позволяет создавать ботов, с которыми вы можете взаимодействовать.
«Боты – это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API».
ESP32 будет взаимодействовать с Telegram-ботом для отправки сообщений в ваш аккаунт Telegram. Каждый раз, когда дверь меняет состояние, вы будете получать уведомление на свой смартфон (при условии, что у вас есть доступ к интернету).
Создание Telegram-бота
Перейдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие шаги для создания Telegram-бота. Сначала найдите «botfather» и нажмите на BotFather, как показано ниже. Или откройте эту ссылку t.me/botfather на своём смартфоне.
Должно открыться следующее окно, и вам будет предложено нажать кнопку start.
Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и имя пользователя. Мой называется Door Sensor, а имя пользователя – ESPDoorSensorBot.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к боту и токеном бота. Сохраните токен бота, потому что он понадобится вам для того, чтобы ESP32 мог взаимодействовать с ботом.
Отправка сообщения боту
Этот шаг очень важен. Не пропускайте его. Иначе проект не будет работать.
Вы должны отправить сообщение своему Telegram-боту из своего аккаунта Telegram, прежде чем он сможет отправлять вам сообщения.
1) Вернитесь на вкладку чатов и в поле поиска введите имя пользователя вашего бота.
2) Выберите вашего бота, чтобы начать разговор.
3) Нажмите на ссылку Start.
Вот и всё! Можете переходить к следующему разделу.
Получение вашего Telegram User ID
Чтобы отправить сообщение в ваш аккаунт Telegram, бот должен знать ваш идентификатор пользователя.
В вашем аккаунте Telegram найдите «myidbot» или откройте эту ссылку t.me/myidbot на своём смартфоне.
Начните разговор с этим ботом и введите /getid. Вы получите ответ с вашим идентификатором пользователя. Сохраните этот user ID, потому что он понадобится вам позже в этом руководстве.
Подготовка Arduino IDE
Мы будем программировать плату ESP32 с помощью 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 Library на GitHub.
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries.
Найдите «ArduinoJson».
Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.5.12.
Необходимые компоненты
Вот оборудование, которое вам понадобится для завершения этого проекта:
ESP32 – читайте Best ESP32 Development Boards
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!
Схема – ESP32 с герконовым переключателем
Мы подключили герконовый переключатель к GPIO 4, но вы можете подключить его к любому подходящему GPIO.
Код
Скопируйте скетч ниже в вашу Arduino IDE. Замените SSID, пароль, токен бота и идентификатор пользователя на свои данные.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-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 <WiFi.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"
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);
// 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);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
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 <WiFi.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 и пароль в следующие переменные, чтобы ESP32 мог подключиться к интернету.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Вставьте токен вашего Telegram-бота – тот, который вы получили на шаге создания бота.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Вставьте ваш chat ID – тот, который вы получили на шаге получения идентификатора.
#define CHAT_ID "XXXXXXXXXX"
Создайте нового Wi-Fi клиента с помощью WiFiClientSecure.
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);
Установите герконовый переключатель как INPUT. И сохраните текущее состояние при первом запуске ESP32.
pinMode(reedSwitch, INPUT_PULLUP);
state = digitalRead(reedSwitch);
Установите светодиод как OUTPUT и установите его состояние в соответствие с состоянием герконового переключателя (цепь замкнута и светодиод выключен; цепь разомкнута и светодиод включён).
pinMode(led, OUTPUT);
digitalWrite(led, !state);
Настройка прерывания
Установите герконовый переключатель как прерывание.
attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE);
Для установки прерывания в Arduino IDE используется функция attachInterrupt(), которая принимает в качестве аргументов: пин прерывания GPIO, имя вызываемой функции и режим.
Первый аргумент – пин прерывания GPIO. Для установки фактического GPIO в качестве пина прерывания следует использовать digitalPinToInterrupt(GPIO).
Второй аргумент функции attachInterrupt() – это имя функции, которая будет вызываться каждый раз при срабатывании прерывания – процедура обработки прерывания (ISR). В данном случае это функция changeDoorStatus.
Функция ISR должна быть как можно проще, чтобы процессор быстро вернулся к выполнению основной программы.
Третий аргумент – режим. Мы устанавливаем его в CHANGE, чтобы прерывание срабатывало при каждом изменении значения пина – например, с HIGH на LOW и с LOW на HIGH.
Чтобы узнать больше о прерываниях с ESP32, прочитайте следующее руководство:
Инициализация Wi-Fi
Следующие строки подключают ESP32 к Wi-Fi и добавляют корневой сертификат для api.telegram.org.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
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, "");
Демонстрация
После изменения скетча для включения ваших сетевых учётных данных, токена бота и идентификатора пользователя загрузите его на ESP32. Перейдите в Tools > Board и выберите вашу плату ESP32. Затем перейдите в Tools > Port и выберите COM-порт, к которому подключен ESP32.
Откройте Serial Monitor со скоростью передачи 115200 бод, чтобы проверить, обнаруживаются ли изменения.
Для прототипирования/тестирования вы можете прикрепить магнитный герконовый переключатель к двери с помощью липучки Velcro.
Теперь, когда кто-то открывает/закрывает вашу дверь, вы получаете сообщение в своём аккаунте Telegram.
Заключение
В этом руководстве вы узнали, как отправлять уведомления в ваш аккаунт Telegram при изменении состояния герконового переключателя. Это может быть полезно для обнаружения того, была ли открыта или закрыта дверь, окно или ящик.
У нас есть похожие руководства, которые могут вам понравиться:
Если вы хотите узнать больше об ESP32, ознакомьтесь с нашими курсами:
Спасибо за чтение.
Источник: ESP32 Door Status Monitor with Telegram Notifications