Telegram: ESP8266 NodeMCU — обнаружение движения с уведомлениями (Arduino IDE)
В этом руководстве показано, как отправлять уведомления в ваш аккаунт Telegram, когда ESP8266 NodeMCU обнаруживает движение. Пока у вас есть доступ к интернету на смартфоне, вы будете получать уведомления, где бы вы ни находились. Плата ESP будет программироваться с использованием Arduino IDE.
Обзор проекта
В этом руководстве показано, как получать уведомления в аккаунте Telegram, когда ESP8266 NodeMCU обнаруживает движение.
Вот обзор того, как работает проект:
Вы создадите Telegram-бота для вашего ESP8266.
ESP8266 подключён к PIR-датчику движения.
Когда датчик обнаруживает движение, ESP8266 отправляет предупреждающее сообщение в ваш аккаунт Telegram.
Вы будете получать уведомления в аккаунте Telegram при каждом обнаружении движения.
Это простой проект, но он показывает, как можно использовать Telegram в ваших проектах IoT и домашней автоматизации. Идея состоит в том, чтобы применить изученные концепции в своих собственных проектах.
Знакомство с 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 и следуйте инструкциям для создания бота. Дайте ему имя и имя пользователя.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к боту и токеном бота. Сохраните токен бота, потому что он понадобится для того, чтобы ESP8266 мог взаимодействовать с ботом.
Получение вашего Telegram User ID
Любой, кто знает имя пользователя вашего бота, может с ним взаимодействовать. Чтобы убедиться, что мы игнорируем сообщения не от нашего аккаунта Telegram (или от неавторизованных пользователей), вы можете получить свой Telegram User ID. Тогда, когда ваш Telegram-бот получает сообщение, ESP может проверить, соответствует ли ID отправителя вашему User ID, и обработать сообщение или проигнорировать его.
В вашем аккаунте Telegram найдите «IDBot» или откройте эту ссылку t.me/myidbot на своём смартфоне.
Начните разговор с этим ботом и введите /getid. Вы получите ответ с вашим user ID. Сохраните этот user 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 Library на GitHub.
Библиотека ArduinoJson
Вам также нужно установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries.
Найдите «ArduinoJson».
Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.5.12.
Необходимые компоненты
Для этого проекта вам понадобятся следующие компоненты:
Схема подключения
Для этого проекта вам нужно подключить PIR-датчик движения к вашей плате ESP8266. Следуйте приведённой ниже схеме подключения.
В этом примере мы подключаем вывод данных PIR-датчика движения к GPIO 14. Вы можете использовать любой другой подходящий GPIO. Читайте Справочник по GPIO ESP8266.
Telegram обнаружение движения с уведомлениями — скетч ESP8266
Следующий код использует вашего Telegram-бота для отправки предупреждающего сообщения в аккаунт Telegram при обнаружении движения. Чтобы этот скетч работал для вас, вам нужно вставить свои сетевые учётные данные (SSID и пароль), токен Telegram-бота и ваш Telegram user ID.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/telegram-esp8266-nodemcu-motion-detection-arduino/
Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
*/
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Replace with your network credentials
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);
const int motionSensor = 14; // PIR Motion Sensor
bool motionDetected = false;
// Indicates when motion is detected
void ICACHE_RAM_ATTR detectsMovement() {
//Serial.println("MOTION DETECTED!!!");
motionDetected = true;
}
void setup() {
Serial.begin(115200);
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
// PIR Motion Sensor mode INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
// Attempt to connect to Wifi network:
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, "Bot started up", "");
}
void loop() {
if(motionDetected){
bot.sendMessage(CHAT_ID, "Motion detected!!", "");
Serial.println("Motion Detected");
motionDetected = false;
}
}
Как работает код
В этом разделе объясняется, как работает код. Продолжайте читать или перейдите к разделу Демонстрация.
Начните с импорта необходимых библиотек.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
Сетевые учётные данные
Вставьте свои сетевые учётные данные в следующие переменные.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Токен Telegram-бота
Вставьте токен вашего Telegram-бота, который вы получили от Botfather, в переменную BOTtoken.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your Bot Token (Get from Botfather)
Telegram User ID
Вставьте свой chat ID. Тот, который вы получили от IDBot.
#define CHAT_ID "XXXXXXXXXX"
Создайте нового Wi-Fi клиента с помощью WiFiClientSecure.
WiFiClientSecure client;
Создайте бота с токеном и клиентом, определёнными ранее.
UniversalTelegramBot bot(BOTtoken, client);
Датчик движения
Определите GPIO, к которому подключён датчик движения.
const int motionSensor = 14; // PIR Motion Sensor
Булева переменная motionDetected используется для указания того, было ли обнаружено движение или нет. По умолчанию она установлена в false.
bool motionDetected = false;
detectsMovement()
Функция detectsMovement() — это функция обратного вызова (callback), которая выполняется при обнаружении движения. В данном случае она просто меняет состояние переменной motionDetected на true.
// Indicates when motion is detected
void ICACHE_RAM_ATTR detectsMovement() {
//Serial.println("MOTION DETECTED!!!");
}
setup()
В setup() инициализируйте Serial Monitor.
Serial.begin(115200);
Для ESP8266 необходимо использовать следующую строку:
client.setInsecure();
В примерах библиотеки для ESP8266 говорится: «Это самый простой способ заставить это работать. Если вы передаёте конфиденциальную информацию или управляете чем-то важным, пожалуйста, используйте certStore или, по крайней мере, client.setFingerPrint».
Прерывание PIR-датчика движения
Установите PIR-датчик движения как прерывание и задайте detectsMovement() как функцию обратного вызова (при обнаружении движения эта функция будет выполнена):
// PIR Motion Sensor mode INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
Примечание: Рекомендуемое чтение: ESP8266 с PIR-датчиком движения с использованием прерываний и таймеров
Инициализация Wi-Fi
Инициализируйте Wi-Fi и подключите ESP8266 к вашей локальной сети с SSID и паролем, определёнными ранее.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Наконец, отправьте сообщение, указывающее, что бот запустился:
bot.sendMessage(CHAT_ID, "Bot started up", "");
loop()
В loop() проверьте состояние переменной motionDetected.
void loop() {
if(motionDetected){
Если оно true, это означает, что движение было обнаружено. Поэтому отправьте сообщение в ваш аккаунт Telegram, указывающее, что движение обнаружено.
bot.sendMessage(CHAT_ID, "Motion detected!!", "");
Отправка сообщения боту очень проста. Вам нужно просто использовать метод sendMessage() на объекте bot и передать в качестве аргументов chat ID получателя, сообщение и режим парсинга.
bool sendMessage(String chat_id, String text, String parse_mode = "")
Наконец, после отправки сообщения установите переменную motionDetected в false, чтобы можно было снова обнаружить движение.
motionDetected = false;
Вот, в общем-то, как работает код.
Демонстрация
Важно: перейдите в ваш аккаунт Telegram и найдите своего бота. Вам нужно нажать «start» на боте, прежде чем он сможет отправлять вам сообщения.
Загрузите код на вашу плату ESP8266. Не забудьте перейти в Tools > Board и выбрать используемую плату. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата.
После загрузки кода нажмите кнопку RST на плате ESP8266, чтобы начать выполнение кода. Затем вы можете открыть Serial Monitor, чтобы проверить, что происходит в фоновом режиме.
Когда ваша плата впервые загружается, она отправит сообщение в ваш аккаунт Telegram: «Bot started up». Затем поднесите руку к PIR-датчику движения и проверьте, что вы получили уведомление об обнаружении движения.
В то же время вот что вы должны увидеть в Serial Monitor.
Заключение
В этом руководстве вы узнали, как создать Telegram-бота для взаимодействия с платой ESP8266 NodeMCU. При обнаружении движения отправляется сообщение.
С помощью этого бота вы также можете использовать свой аккаунт Telegram для отправки сообщений на ESP8266, чтобы управлять его выходами или запрашивать показания датчиков, например.