ESP32: Мониторинг состояния двери с уведомлениями в Telegram

В этом проекте вы будете отслеживать состояние двери с помощью платы ESP32 и магнитного герконового переключателя. Вы будете получать сообщение в свой аккаунт Telegram каждый раз, когда дверь меняет состояние: открыта или закрыта. Пока у вас есть доступ к интернету на смартфоне, вы будете получать уведомления, где бы вы ни находились. Плата ESP32 будет программироваться с использованием Arduino IDE.

ESP32 мониторинг состояния двери с уведомлениями в Telegram 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

«Боты – это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API».

ESP32 будет взаимодействовать с Telegram-ботом для отправки сообщений в ваш аккаунт Telegram. Каждый раз, когда дверь меняет состояние, вы будете получать уведомление на свой смартфон (при условии, что у вас есть доступ к интернету).

Создание Telegram-бота

Перейдите в Google Play или App Store, скачайте и установите Telegram.

Установка и загрузка Telegram

Откройте Telegram и выполните следующие шаги для создания Telegram-бота. Сначала найдите «botfather» и нажмите на BotFather, как показано ниже. Или откройте эту ссылку t.me/botfather на своём смартфоне.

BotFather в Telegram

Должно открыться следующее окно, и вам будет предложено нажать кнопку start.

Запуск BotFather в Telegram для создания нового бота

Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и имя пользователя. Мой называется Door Sensor, а имя пользователя – ESPDoorSensorBot.

Создание нового бота через BotFather в Telegram

Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к боту и токеном бота. Сохраните токен бота, потому что он понадобится вам для того, чтобы ESP32 мог взаимодействовать с ботом.

Получение токена бота от BotFather в Telegram

Отправка сообщения боту

Этот шаг очень важен. Не пропускайте его. Иначе проект не будет работать.

Вы должны отправить сообщение своему Telegram-боту из своего аккаунта Telegram, прежде чем он сможет отправлять вам сообщения.

1) Вернитесь на вкладку чатов и в поле поиска введите имя пользователя вашего бота.

Поиск бота ESP32 в Telegram

2) Выберите вашего бота, чтобы начать разговор.

3) Нажмите на ссылку Start.

Начало разговора с Telegram-ботом

Вот и всё! Можете переходить к следующему разделу.

Получение вашего Telegram User ID

Чтобы отправить сообщение в ваш аккаунт Telegram, бот должен знать ваш идентификатор пользователя.

В вашем аккаунте Telegram найдите «myidbot» или откройте эту ссылку t.me/myidbot на своём смартфоне.

Получение Chat ID с помощью IDBot в Telegram

Начните разговор с этим ботом и введите /getid. Вы получите ответ с вашим идентификатором пользователя. Сохраните этот user ID, потому что он понадобится вам позже в этом руководстве.

Получение Chat ID через IDBot с помощью команды getid

Подготовка Arduino IDE

Мы будем программировать плату ESP32 с помощью Arduino IDE, поэтому убедитесь, что она установлена в вашей Arduino IDE.

Библиотека Universal Telegram Bot

Для взаимодействия с Telegram-ботом мы будем использовать библиотеку Universal Telegram Bot, созданную Brian Lough, которая предоставляет простой интерфейс для Telegram Bot API.

Выполните следующие шаги для установки последней версии библиотеки.

  1. Нажмите здесь, чтобы скачать библиотеку Universal Arduino Telegram Bot.

  2. Перейдите в Sketch > Include Library > Add .ZIP Library….

  3. Добавьте только что скачанную библиотеку.

Важно: не устанавливайте библиотеку через Arduino Library Manager, так как может быть установлена устаревшая версия.

Для получения всех подробностей о библиотеке ознакомьтесь со страницей Universal Arduino Telegram Bot Library на GitHub.

Библиотека ArduinoJson

Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.

  1. Перейдите в Sketch > Include Library > Manage Libraries.

  2. Найдите «ArduinoJson».

  3. Установите библиотеку.

Мы используем библиотеку ArduinoJson версии 6.5.12.

Установка библиотеки ArduinoJSON в Arduino IDE

Необходимые компоненты

Вот оборудование, которое вам понадобится для завершения этого проекта:

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все детали для ваших проектов по лучшей цене!

Схема – ESP32 с герконовым переключателем

Мы подключили герконовый переключатель к GPIO 4, но вы можете подключить его к любому подходящему GPIO.

Схема подключения ESP32 с герконовым переключателем

Код

Скопируйте скетч ниже в вашу 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 бод, чтобы проверить, обнаруживаются ли изменения.

Мониторинг датчика двери ESP32 в Serial Monitor

Для прототипирования/тестирования вы можете прикрепить магнитный герконовый переключатель к двери с помощью липучки Velcro.

Тестирование герконового переключателя на двери с ESP32

Теперь, когда кто-то открывает/закрывает вашу дверь, вы получаете сообщение в своём аккаунте Telegram.

Демонстрация работы датчика двери ESP32 с Telegram-ботом

Заключение

В этом руководстве вы узнали, как отправлять уведомления в ваш аккаунт Telegram при изменении состояния герконового переключателя. Это может быть полезно для обнаружения того, была ли открыта или закрыта дверь, окно или ящик.

У нас есть похожие руководства, которые могут вам понравиться:

Если вы хотите узнать больше об ESP32, ознакомьтесь с нашими курсами:

Спасибо за чтение.


Источник: ESP32 Door Status Monitor with Telegram Notifications