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

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

ESP8266 NodeMCU мониторинг состояния двери с уведомлениями в Telegram Arduino IDE

У нас есть аналогичное руководство, которое отправляет электронные письма вместо сообщений Telegram:

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

Обзор проекта

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

Магнитный контактный переключатель — это, по сути, герконовый переключатель, заключённый в пластиковый корпус, чтобы его можно было легко установить на дверь, окно или ящик для определения того, открыт он или закрыт.

Магнитный контактный переключатель герконовый переключатель

Электрическая цепь замыкается, когда магнит находится рядом с переключателем — дверь закрыта. Когда магнит находится далеко от переключателя — дверь открыта — цепь разомкнута. Смотрите рисунок ниже.

Магнитный герконовый переключатель как он работает

Мы можем подключить герконовый переключатель к GPIO ESP8266 для обнаружения изменений его состояния.

Знакомство с Telegram

Telegram Messenger — это облачный сервис мгновенных сообщений и голосовой связи через IP. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (PC, Mac и Linux). Он бесплатный и не содержит рекламы. Telegram позволяет создавать ботов, с которыми можно взаимодействовать.

Логотип Telegram

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

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

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

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

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

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

BotFather Telegram

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

Telegram Start BotFather для создания нового бота

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

Telegram BotFather создание нового бота

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

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

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

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

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

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

Telegram поиск бота ESP32

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

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

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

И это всё! Вы можете перейти к следующему разделу.

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

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

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

Telegram получение Chat ID с IDBot

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

Telegram получение Chat ID с IDBot getid

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

Мы будем программировать плату ESP8266 с помощью 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 на GitHub.

Библиотека ArduinoJson

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

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

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

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

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

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

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

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

ESP8266

читайте Лучшие платы разработки ESP8266

1x магнитный герконовый переключатель

Magnetic Reed Switch

1x резистор 10 кОм

Resistors Kit

1x макетная плата

Breadboard

Соединительные провода

Jumper Wires

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

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

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

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

Код

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

ESP8266 NodeMCU мониторинг датчика двери Serial Monitor

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

Тестирование IFTTT с ESP8266 NodeMCU

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

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

Заключение

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

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

Узнайте больше о ESP8266 с нашими ресурсами: