В данном руководстве рассмотрим, как отправлять уведомления о срабатывании пирометрического с платы ESP32 в Telegram. Для получения уведомлений будет достаточно смартфона с интернетом. Плату ESP будем программировать в среде разработки Arduino.
Обзор
Что мы сделаем в рамках этого проекта?
- Создадим бота в Telegram.
- Подсоединим плату ESP32 к пирометрическому.
- Напишем скетч, организующий отправку уведомлений в Telegram при срабатывании датчика.
Проект несложный, однако он может служить отправной точкой для создания гораздо более масштабных проектов в сфере IoT и Home automation.
Если вы не знакомы с Telegram…
Telegram Messenger – это облачный сервис обмена мгновенными сообщениями и IP-телефонии. Вы можете установить его на свой смартфон (Android и iPhone) или компьютер (ПК, Mac и Linux). Telegram позволяет создавать ботов, которых можно использовать для наших проектов.
Боты – это сторонние приложения, которые работают в Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API.
Создание бота Telegram
Зайдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие действия, чтобы создать бота Telegram. Сначала найдите «botfather » и щелкните BotFather, как показано ниже. Или откройте эту ссылку в своем смартфоне.
В следующем окне вам будет предложено нажать на кнопку /start.
Введите /newbot и следуйте инструкциям по созданию бота. Дайте ему название и логин.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к нему и токеном бота . Сохраните токен бота, он вам понадобится, чтобы обеспечить взаимодействие ESP32 с ботом.
Ограничьте доступ к боту
Любой, кто знает ваш логин бота, может его использовать. Чтобы убедиться, что мы игнорируем сообщения, поступающие не из нашей учетной записи Telegram, вы можете указать свой ID Telegram. В итоге, ESP будет проверять ID перед тем, как обрабатывать сообщение, полученное ботом Telegram.
В своем аккаунте Telegram найдите «IDBot» или перейдите по этой ссылке
Начните чат с этим ботом и введите /getid . Вы получите ответ с вашим идентификатором пользователя. Сохраните этот ID.
Подготовка Arduino IDE
Для создания этого проекта нам потребуется плата ESP32, поэтому убедитесь, что у вас установлены дополнения для платы в среде Arduino.
Универсальная библиотека ботов Telegram
Для взаимодействия с ботом Telegram мы будем использовать универсальную библиотеку ботов Telegram, которая предоставляет достаточно простой интерфейс для Telegram Bot API.
Выполните следующие шаги, чтобы установить библиотеку.
- Скачайте библиотеку
- Перейдите Скетч > Подключить библиотеку > Добавить .ZIP библиотеку
- Добавьте только что загруженную библиотеку.
Важно: не устанавливайте библиотеку через диспетчер библиотек Arduino, так как он может установить устаревшую версию.
Все подробности о библиотеке можно найти на странице
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson . Выполните следующие шаги, чтобы установить библиотеку.
- Перейдите в Скетч> Подключить библиотеку > Управлять библиотеками .
- Найдите «ArduinoJson».
- Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Что нам потребуется?
Схема
Для данного проекта требуется соединить датчик движения с платой ESP32.
Скетч программы
Следующий код использует Telegram бота для отправки уведомлений при срабатывании датчика движения. Вам потребуется изменить учетные данные сети на свои.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/telegram-esp32-motion-detection-arduino/ Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot */ #include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> // ЗАМЕНИТЕ СВОИМИ ДАННЫМИ ИДИТЕ const char* ssid = "ЗАМЕНИТЕ СВОИМSSID"; const char* password = "УКАЖИТЕ ПАРОЛЬ"; // Подключаемся к боту #define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // токен бота // Не забудьте, что бот может отправлять вам сообщения только после нажатия кнопки start #define CHAT_ID "XXXXXXXXXX" WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); const int motionSensor = 27; //датчик движения bool motionDetected = false; // Действие при срабатывании датчика движения void IRAM_ATTR detectsMovement() { //Serial.println("MOTION DETECTED!!!"); motionDetected = true; } void setup() { Serial.begin(115200); // выставляем режим работы датчика INPUT_PULLUP pinMode(motionSensor, INPUT_PULLUP); // Указываем, что датчик прерывающийся, присваиваем функцию прерываний и указываем режим RISING attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING); // Подключаемся к wi-fi Serial.print("Connecting Wifi: "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Добавляем сертификат для api.telegram.org 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; } } |
Как работает код?
Подключаем необходимые библиотеки
1 2 3 4 5 6 7 |
#include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> #include <ArduinoJson.h> |
Укажите свои данные сети
1 2 3 |
const char* ssid = "ЗАМЕНИТЕ СВОИМ_SSID"; const char* password = "УКАЖИТЕ СВОЙ ПАРОЛЬ"; |
Вставьте токен, полученный от BotFather.
1 |
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
Вставьте полученный от IDBot идентификатор чата.
1 |
#define CHAT_ID "XXXXXXXXXX" |
Создаем подключение WiFiClientSecure.
1 |
WiFiClientSecure client; |
Создаем бота.
1 |
UniversalTelegramBot bot(BOTtoken, client); |
Определяем GPIO к которому подключен датчик
1 |
const int motionSensor = 27; |
Переменная motionDetected булевая и используется для индикации движения
1 |
bool motionDetected = false; |
Callback-функция detectsmovement() выполняется при обнаружении движения. В нашем случае, она просто изменяет значение переменной motionDetected на true.
1 2 3 4 5 6 7 |
void IRAM_ATTR detectsMovement() { //Serial.println("MOTION DETECTED!!!"); motionDetected = true; } |
setup()
Запускаем монитор порта
1 |
Serial.begin(115200); |
PIR Motion Sensor Interrupt
Указываем, что датчик – прерывающийся, Определяем callback-функцию detectsMovement() (выполняется при обнаружении движения)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING); <strong>Запускаем </strong><strong>Wi</strong><strong>-</strong><strong>Fi</strong><strong> и подключаем плату к сети</strong> WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } |
Отправляем сообщение боту, чтобы определить, работает ли он.
1 |
bot.sendMessage(CHAT_ID, "Bot started up", ""); |
loop()
Проверяем состояние переменной motionDetected
1 2 3 |
void loop() { if(motionDetected){ |
Отправляем сообщение нам в Telegram, если переменная имеет значение true (то есть, обнаружено движение)
1 |
bot.sendMessage(CHAT_ID, "Motion detected!!", ""); |
Для отправки сообщения боту достаточно метода sendMessage(), в агрументах которого мы указываем идентификатор чата, сообщение и парсер.
1 |
bool sendMessage(String chat_id, String text, String parse_mode = "") |
После отправки сообщения возвращаем переменной motionDetected исходное состояние.
1 |
motionDetected = false; |
Демонстрация
Загрузите код на плату и нажмите кнопку EN/RST на ней. Откройте монитор порта и вот что вы должны увидеть:
При запуске платы она отправляет сообщение «Bot started up». Затем, если вы помашете рукой перед датчиком, плата отправляет сообщение «Motion detected!!»
Заключение
Итак, мы разобрались как отправлять уведомления в Telegram о срабатывании датчика движения. С этим ботом вы также можете управлять выводами ESP32 или, например, считывать показания датчиков.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)