В этом руководстве рассмотрим запрос показаний датчика ESP32 или ESP8266 NodeMCU с помощью Telegram. В качестве примера мы запросим показания температуры и влажности от датчика BME280. Платы ESP будут программироваться с использованием среды разработки Arduino.
Коротко о проекте
Попробуем создать простой проект, который запрашивает показания температуры и влажности ESP32 или ESP8266 NodeMCU с помощью приложения Telegram. Мы будем использовать датчик BME280, но можно использовать любой другой.
Что делает бот?
Когда мы отправляем сообщение /readings боту, плата ESP присылает показания температуры и влажности.
Можно отправить сообщение /start, чтобы получить приветственное сообщение с командами для управления.
Это простой проект, но он демонстрирует, как вы можете использовать Telegram в проектах IoT и «умный дом». Идея состоит в том, чтобы применить изученные концепции в ваших собственных проектах.
Вы не знакомы с Telegram?
Telegram Messenger – это облачный сервис обмена мгновенными сообщениями и передачи голоса по IP. Вы можете установить его на свой смартфон (Android и iPhone) или компьютер (ПК, Mac и Linux). Telegram позволяет создавать ботов, с которыми вы можете взаимодействовать.
Боты – это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API .
ESP32 / ESP8266 будет взаимодействовать с ботом Telegram для получения и обработки сообщений и отправки ответов. В этом руководстве рассмотрим, как использовать Telegram для отправки сообщений вашему боту, чтобы запрашивать показания датчиков.
Как создать бота в Telegram?
Зайдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие действия, чтобы создать бота Telegram. Сначала найдите «botfather » и щелкните BotFather, как показано ниже. Или откройте эту ссылку t.me/botfather в своем смартфоне.
В следующем окне вам будет предложено нажать на кнопку /start.
Введите /newbot и следуйте инструкциям по созданию бота. Дайте ему название и логин.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к нему и токеном бота. Сохраните токен бота, он вам понадобится, чтобы обеспечить взаимодействие ESP32 / ESP8266 с ботом.
Ограничьте доступ к боту
Любой, кто знает ваш логин бота, может его использовать. Чтобы убедиться, что мы игнорируем сообщения, поступающие не из нашей учетной записи Telegram, вы можете указать свой ID Telegram. В итоге, ESP будет проверять ID перед тем, как обрабатывать сообщение, полученное ботом Telegram.
В своем аккаунте Telegram найдите «IDBot» или перейдите по этой ссылке t.me/myidbot.
Начните чат с этим ботом и введите /getid . Вы получите ответ с вашим идентификатором пользователя. Сохраните этот ID.
Подготовка среды разработки Arduino
Платы ESP32 и ESP8266 запрограммируем с помощью среды разработки Arduino, поэтому убедитесь, что они установлены в вашей IDE.
Универсальная библиотека ботов Telegram
Для взаимодействия с ботом Telegram мы будем использовать универсальную библиотеку ботов Telegram, которая предоставляет простой интерфейс для Telegram Bot API.
Выполните следующие шаги, чтобы установить библиотеку.
- Скачайте универсальную библиотеку
- Перейдите Скетч > Подключить библиотеку > Добавить .ZIP библиотеку
- Добавьте только что загруженную библиотеку.
Важно: не устанавливайте библиотеку через диспетчер библиотек Arduino, так как он может установить устаревшую версию
Все подробности о библиотеке можно найти на этой странице.
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги, чтобы установить библиотеку.
- Перейдите в Скетч> Подключить библиотеку > Управлять библиотеками .
- Найдите «ArduinoJson».
- Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Библиотеки датчика BME280
Чтобы получить показания от модуля датчика BME280, мы будем использовать библиотеку Adafruit_BME280. Вам также необходимо установить библиотеку Adafruit_Sensor. Выполните следующие шаги, чтобы установить библиотеки в вашу Arduino IDE:
- Откройте IDE Arduino и выберите Скетч > Подключить библиотеку> Управлять библиотеками. Должен открыться менеджер библиотек.
- Найдите adafruit bme280 в поле поиска и установите библиотеку.
Чтобы использовать библиотеку BME280, также необходимо установить Adafruit Unified Sensor . Выполните следующие шаги, чтобы установить библиотеку в вашу среду разработки Arduino:
- Найдите Adafruit Unified Sensor в поле поиска. Прокрутите до конца, найдите библиотеку и установите ее.
После установки библиотек перезапустите среду разработки Arduino.
Что потребуется для проекта?
В этом примере получим показания датчика BME280. Вот список деталей, необходимых для сборки схемы:
- Плата ESP32 (плата ESP8266)
- Датчик BME280
- Провода джампера
- Макетная плата
Схема подключения
Модуль датчика BME280, который мы используем, обменивается данными по протоколу связи I2C , поэтому необходимо подключить его к контактам I2C платы.
Подключение BME280 к ESP32
Контакты ESP32 I2C по умолчанию :
- GPIO 22 : SCL (SCK)
- GPIO 21 : SDA (SDI)
Итак, соберите свою схему, как показано на ниже
Подключение BME280 к ESP8266 NodeMCU
Контакты I2C ESP8266 по умолчанию:
- GPIO 5 (D1): SCL (SCK)
- GPIO 4 (D2): SDA (SDI)
Соберите свою схему, как показано на следующей схеме, если вы используете плату ESP8266.
Код для запроса показаний датчика
Следующий код позволяет запрашивать показания датчика BME280 с платы ESP32 или ESP8266, отправив сообщение боту Telegram. Чтобы он работал у вас, необходимо ввести свои сетевые учетные данные (SSID и пароль), токен Telegram Bot и свой идентификатор пользователя 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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/telegram-request-esp32-esp8266-nodemcu-sensor-readings/ 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. Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot */ #ifdef ESP32 #include "WiFi.h" #else #include "ESP8266WiFi.h" #endif #include "WiFiClientSecure.h" #include "UniversalTelegramBot.h" #include "ArduinoJson.h" #include "Adafruit_BME280.h" #include "Adafruit_Sensor.h" // Укажите свои данные сети const char* ssid = " укажите SSID "; const char* password = " укажите пароль"; // Используйте @myidbot, чтобы получить ID пользователя или группы // Помните, что бот сможет вам писать только после нажатия // вами кнопки /start #define CHAT_ID "XXXXXXXXXX" // Запустите бот Telegram #define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // укажите токен бота #ifdef ESP8266 X509List cert(TELEGRAM_CERTIFICATE_ROOT); #endif WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); // Каждую секунду проверяет новые сообщения int botRequestDelay = 1000; unsigned long lastTimeBotRan; // BME280 подключаем к ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL) // BME280 подключаем к ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = SCL) Adafruit_BME280 bme; // Запрос показаний датчика BME280 и запись их в переменную типа String String getReadings() { float temperature, humidity; temperature = bme.readTemperature(); humidity = bme.readHumidity(); String message = "Temperature: " + String(temperature) + " ºC \n"; message += "Humidity: " + String (humidity) + " % \n"; return message; } // Задаем действия при получении новых сообщений void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); Serial.println(String(numNewMessages)); for (int i = 0; i < numNewMessages; i++) { // Идентификатор чата запроса String chat_id = String(bot.messages[i].chat_id); if (chat_id != CHAT_ID) { bot.sendMessage(chat_id, "Unauthorized user", ""); continue; } // Выводим полученное сообщение String text = bot.messages[i].text; Serial.println(text); String from_name = bot.messages[i].from_name; if (text == "/start") { String welcome = "Welcome, " + from_name + ".\n"; welcome += "Use the following command to get current readings.\n\n"; welcome += "/readings \n"; bot.sendMessage(chat_id, welcome, ""); } if (text == "/readings") { String readings = getReadings(); bot.sendMessage(chat_id, readings, ""); } } } void setup() { Serial.begin(115200); #ifdef ESP8266 configTime(0, 0, "pool.ntp.org"); // Получаем всемирное координированное время (UTC) через NTP client.setTrustAnchors(&cert); // Получаем сертификат api.telegram.org #endif // Запускаем датчик if (!bme.begin(0x76)) { Serial.println("Невозможно обнаружить датчик, проверьте соединение!"); while (true); // Останавливаем программу } // Подключаемся к Wi-Fi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); #ifdef ESP32 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Добавляем корневой сертификат для api.telegram.org #endif while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение WiFi.."); } // Выводим IP ESP32 Serial.println(WiFi.localIP()); } void loop() { if (millis() > lastTimeBotRan + botRequestDelay) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } lastTimeBotRan = millis(); } } |
Код совместим с платами ESP32 и ESP8266 NodeMCU и сам подключит нужные библиотеки в соответствии с выбранной платой.
Как работает код?
Импортируем необходимые библиотеки:
1 2 3 4 5 6 7 8 9 10 |
#ifdef ESP32 #include "WiFi.h" #else #include "ESP8266WiFi.h" #endif #include "WiFiClientSecure.h" #include "UniversalTelegramBot.h" #include "ArduinoJson.h" #include "Adafruit_BME280.h" #include "Adafruit_Sensor.h" |
Учетные данные сети
Вставьте свои учетные данные сети в следующие переменные.
1 2 |
const char* ssid = "укажите SSID"; const char* password = "укажите пароль"; |
ID пользователя Telegram
Введите свой идентификатор пользователя. Тот, который у вы получили от IDBot.
1 |
#define CHAT_ID "XXXXXXXXXX" |
Токен бота Telegram
Вставьте токен бота Telegram, полученный от Botfather, в переменную BOTtoken.
1 |
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
Создайте новое соединение WiFi с WiFiClientSecure.
1 |
WiFiClientSecure client; |
Создайте бот с токеном и клиентом, введенными ранее.
1 |
UniversalTelegramBot bot(BOTtoken, client); |
botRequestDelay и lastTimeBotRan используются для проверки наличия новых сообщений в Telegram с заданной частотой. В этом случае код будет проверять наличие новых сообщений каждую секунду (1000 миллисекунд). Вы можете изменить время задержки в переменной botRequestDelay.
1 2 |
int botRequestDelay = 1000; unsigned long lastTimeBotRan; |
Объект BME280
Создайте экземпляр класса Adafruit_BME280 с идентификатором bme.
1 |
Adafruit_BME280 bme; |
getReadings ()
Функция getReadings () запрашивает температуру и влажность у датчика BME280 и возвращает результаты в виде строковой переменной, которую мы можем отправить боту.
1 2 3 4 5 6 7 8 |
String getReadings(){ float temperature, humidity; temperature = bme.readTemperature(); humidity = bme.readHumidity(); String message = "Температура: " + String(temperature) + " ºC \n"; message += "Влажность: " + String (humidity) + " % \n"; return message; } |
handleNewMessages ()
Эта функция определяет действия программы при появлении новых сообщений.
1 2 3 |
void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); Serial.println(String(numNewMessages)); |
Проверяем доступные сообщения:
1 |
for (int i=0; i<numNewMessages; i++) { |
Получите идентификатор чата для этого сообщения и сохраните его в переменной chat_id.
1 |
String chat_id = String(bot.messages[i].chat_id); |
Если chat_id отличается от вашего идентификатора чата (CHAT_ID), это означает, что кто-то (не вы) отправил сообщение вашему боту. В этом случае игнорируем сообщение.
1 |
if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Неавторизованный пользователь", ""); continue; } |
В противном случае это означает, что сообщение было отправлено зарегистрированным пользователем. Сохраним в строковую переменную text и выведем её.
1 |
String text = bot.messages[i].text; Serial.println(text); |
Переменная from_name сохраняет имя отправителя.
1 |
String from_name = bot.messages[i].from_name; |
Если он получит сообщение /start , программа отправит действительные команды для управления ESP32 / ESP8266.
1 |
if (text == "/start") { String welcome = "Добро пожаловать " + from_name + ".\n"; welcome += "\n\n"; welcome += "/readings \n"; |
Используйте данную команду для получения показаний счетчика.
1 |
bot.sendMessage(chat_id, welcome, ""); } |
Отправить сообщение боту очень просто. Вам просто нужно использовать метод sendMessage() и передать в качестве аргументов идентификатор чата получателя, сообщение и режим парсинга.
1 |
bool sendMessage(String chat_id, String text, String parse_mode = "") |
В нашем примере мы отправим сообщение на идентификатор, хранящийся в переменной chat_id (который соответствует человеку, отправившему сообщение) и отправим сообщение, сохраненное в переменной welcome.
1 |
bot.sendMessage(chat_id, welcome, ""); |
Если бот получает сообщение /readings , получаем текущие показания датчика, с помощью функци getReadings (). Затем просто отправляем ответ.
1 |
if (text == "/readings") { String readings = getReadings(); bot.sendMessage(chat_id, readings, ""); } |
setup()
Инициализируйте монитор последовательного порта.
1 |
Serial.begin(115200); |
Если вы используете ESP8266, вам необходимо использовать следующую строку:
1 |
#ifdef ESP8266 client.setInsecure(); #endif |
Включаем BME280
Инициализируйте датчик BME280.
1 |
if (!bme.begin(0x76)) { Serial.println("Невозможно обнаружить датчик, проверьте соединение!"); while (1); } |
Подключаем Wi-Fi
Инициализируйте Wi-Fi и подключите ESP к вашей локальной сети, используя SSID и пароль, заданные ранее.
1 2 3 4 |
WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Подключение к Wi-Fi..."); } |
loop ()
Проверяем наличие новых сообщений раз в секунду.
1 2 3 4 5 6 7 8 9 10 |
void loop() { if (millis() > lastTimeBotRan + botRequestDelay) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } lastTimeBotRan = millis(); } } |
Когда придет новое сообщение, вызовите функцию handleNewMessages.
1 2 3 4 5 |
while(numNewMessages) { Serial.println("Получено новое сообщение"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } |
Примерно так и работает код.
Демонстрация
Загрузите код в ESP, откройте меню Инструменты > Плата и выберите плату , которую вы используете. Перейдите в Инструменты > Порт и выберите COM-порт, к которому подключена ваша плата.
После загрузки кода нажмите кнопку ESP EN / RST, чтобы запустить код. Затем откройте монитор порта чтобы посмотреть, что происходит в фоновом режиме.
Зайдите в свою учетную запись Telegram и начните чат со своим ботом. Отправьте следующие команды и посмотрите, что отвечает бот:
- / start – показывает приветственное сообщение с допустимыми командами.
- / readings – возвращает текущие показания температуры и влажности с датчика BME280.
В то же время на мониторе порта вы должны увидеть, что ESP32 или ESP8266 получает сообщения.
Если вы попытаетесь взаимодействовать со своим ботом из другой учетной записи, вы получите сообщение «Неавторизованный пользователь».
Заключение
В этом руководстве вы узнали, как создать бот в Telegram для взаимодействия с платами ESP32 или ESP8266 NodeMCU. С помощью этого бота вы можете использовать свой аккаунт Telegram для мониторинга датчиков и управления выходами.
Мы показали вам простой пример того, как запросить показания датчика от датчика BME280. Идея состоит в том, чтобы изменить проект, добавить больше команд для выполнения других задач.
Самое замечательное в использовании Telegram для управления вашими платами ESP – возможность управлять ими из любой точки мира при наличии интернета.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
6 комментариев. Оставить новый
А вот когда компилятор ругается ‘X509List’ does not name a type
на строку X509List cert(TELEGRAM_CERTIFICATE_ROOT);
что с этим можно сделать?
https://qsy.by/telegram-bot-na-esp8266/ , смотри последний коммент про сертификат
Здравствуйте, подскажите, а как бот понимает куда ему направлять команды?
Об этом наука умалчивает.
У меня компиляция всегда заканчивается ошибкой
C:\Users\mr.Tester\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.14\cores\esp32/main.cpp:48: undefined reference to `loop()’
collect2.exe: error: ld returned 1 exit status
Добрый день!
Ошибка
undefined reference to `loop()’
обычно возникает из-за того, что в скетче не объявлена функцияloop()
. Перепроверьте ваш код и убедитесь, что в нем объявлены функцииsetup()
иloop()
.