Telegram: запрос показаний датчиков ESP32/ESP8266 (Arduino IDE)
В этом руководстве показано, как запрашивать показания датчиков ESP32 или ESP8266 NodeMCU с помощью Telegram. В качестве примера мы будем запрашивать показания температуры и влажности с датчика BME280. Вам достаточно отправить сообщение Telegram-боту, чтобы отслеживать показания датчиков или входов из любой точки мира. Платы ESP будут программироваться с помощью Arduino IDE.
Обзор проекта
В этом уроке мы создадим простой проект, который запрашивает показания температуры и влажности ESP32 или ESP8266 NodeMCU с помощью приложения Telegram. Мы будем использовать датчик BME280, но вы можете использовать любой другой датчик.
Вы создадите Telegram-бота для вашей платы ESP32 или ESP8266 NodeMCU;
Вы сможете начать разговор с ботом;
Когда вы отправляете сообщение /readings боту, плата ESP получает сообщение и отвечает текущими показаниями температуры и влажности;
Вы можете отправить сообщение /start, чтобы получить приветственное сообщение с командами для управления платой.
Это простой проект, но он показывает, как вы можете использовать Telegram в ваших проектах IoT и домашней автоматизации. Идея состоит в том, чтобы применить полученные знания в ваших собственных проектах.
Знакомство с приложением Telegram
Telegram Messenger — это облачный сервис обмена мгновенными сообщениями и голосовой связи через интернет. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (PC, Mac и Linux). Он бесплатный и без рекламы. Telegram позволяет создавать ботов, с которыми вы можете взаимодействовать.
«Боты — это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API».
ESP32/ESP8266 будет взаимодействовать с Telegram-ботом для получения и обработки сообщений, а также отправки ответов. В этом уроке вы узнаете, как использовать Telegram для отправки сообщений вашему боту для запроса показаний датчиков из любого места (вам просто нужен Telegram и доступ к интернету).
Создание Telegram-бота
Перейдите в Google Play или App Store, скачайте и установите Telegram.
Откройте Telegram и выполните следующие шаги для создания Telegram-бота. Сначала найдите «botfather» и нажмите на BotFather, как показано ниже. Или откройте эту ссылку t.me/botfather на вашем смартфоне.
Должно открыться следующее окно, и вам будет предложено нажать кнопку start.
Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и username.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к боту и токеном бота. Сохраните токен бота, потому что он понадобится вам для взаимодействия ESP32/ESP8266 с ботом.
Получение вашего Telegram User ID
Любой, кто знает username вашего бота, может с ним взаимодействовать. Чтобы убедиться, что мы игнорируем сообщения не от нашего аккаунта Telegram (или любых авторизованных пользователей), вы можете получить свой Telegram User ID. Тогда, когда ваш Telegram-бот получает сообщение, ESP может проверить, соответствует ли ID отправителя вашему User ID, и обработать сообщение или проигнорировать его.
В вашем аккаунте Telegram найдите «IDBot» или откройте эту ссылку t.me/myidbot на вашем смартфоне.
Начните разговор с этим ботом и введите /getid. Вы получите ответ с вашим user ID. Сохраните этот user ID, потому что он понадобится вам позже в этом уроке.
Подготовка Arduino IDE
Мы будем программировать платы ESP32 и ESP8266 с помощью Arduino IDE, поэтому убедитесь, что они установлены в вашей Arduino IDE.
Установка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux)
Установка платы ESP8266 в Arduino IDE (Windows, Mac OS X, Linux)
Библиотека 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, так как он может установить устаревшую версию.
Для получения всех подробностей о библиотеке посмотрите страницу GitHub библиотеки Universal Arduino Telegram Bot.
Библиотека ArduinoJson
Вам также нужно установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries.
Найдите «ArduinoJson».
Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Библиотеки датчика BME280
Для получения показаний от модуля датчика BME280 мы будем использовать библиотеку Adafruit_BME280. Вам также нужно установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотек в Arduino IDE:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Library Manager.
Найдите «adafruit bme280» в поле поиска и установите библиотеку.
Для использования библиотеки BME280 вам также нужно установить Adafruit Unified Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Найдите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите Arduino IDE.
Необходимые компоненты
Для этого примера мы будем получать показания датчика BME280. Вот список компонентов, необходимых для сборки схемы для этого проекта:
Плата ESP32 (читайте Лучшие платы разработки ESP32)
Альтернатива — плата ESP8266 (читайте Лучшие платы разработки ESP8266)
Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Модуль датчика BME280, который мы используем, взаимодействует по протоколу I2C, поэтому вам нужно подключить его к контактам I2C ESP32 или ESP8266.
Подключение BME280 к ESP32
Контакты I2C ESP32 по умолчанию:
GPIO 22: SCL (SCK)
GPIO 21: SDA (SDI)
Соберите схему, как показано на следующей диаграмме (Руководство по ESP32 с BME280 и Веб-сервер ESP32 BME280).
Рекомендуемое чтение: Справочник по распиновке ESP32
Подключение BME280 к ESP8266 NodeMCU
Контакты I2C ESP8266 по умолчанию:
GPIO 5 (D1): SCL (SCK)
GPIO 4 (D2): SDA (SDI)
Соберите схему, как показано на следующей диаграмме, если вы используете плату ESP8266 (Руководство по ESP8266 NodeMCU с BME280).
Рекомендуемое чтение: Справочник по распиновке ESP8266
Код для запроса показаний датчиков через Telegram
Следующий код позволяет запрашивать показания датчика BME280 с вашей платы ESP32 или ESP8266, отправляя сообщение Telegram-боту. Чтобы он работал для вас, вам нужно вставить ваши сетевые учётные данные (SSID и пароль), токен Telegram-бота и ваш Telegram User ID.
/*
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> // Universal Telegram Bot Library written by Brian Lough: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
#include <ArduinoJson.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// 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"
// Initialize Telegram BOT
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your Bot Token (Get from Botfather)
#ifdef ESP8266
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
//Checks for new messages every 1 second.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
// BME280 connect to ESP32 I2C (GPIO 21 = SDA, GPIO 22 = SCL)
// BME280 connect to ESP8266 I2C (GPIO 4 = SDA, GPIO 5 = SCL)
Adafruit_BME280 bme;
// Get BME280 sensor readings and return them as a String variable
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;
}
//Handle what happens when you receive new messages
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
for (int i=0; i<numNewMessages; i++) {
// Chat id of the requester
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID){
bot.sendMessage(chat_id, "Unauthorized user", "");
continue;
}
// Print the received message
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"); // get UTC time via NTP
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
#endif
// Init BME280 sensor
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
#ifdef ESP32
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
#endif
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
// Print ESP32 Local IP Address
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. Код загрузит нужные библиотеки в соответствии с выбранной платой.
Как работает код
В этом разделе объясняется, как работает код. Продолжайте чтение или перейдите к разделу Демонстрация.
Начните с импорта необходимых библиотек.
#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 = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Telegram User ID
Вставьте ваш user ID. Тот, который вы получили от IDBot.
#define CHAT_ID "XXXXXXXXXX"
Токен Telegram-бота
Вставьте токен вашего Telegram-бота, который вы получили от Botfather, в переменную BOTtoken.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your Bot Token (Get from Botfather)
Создайте новый WiFi-клиент с помощью WiFiClientSecure.
WiFiClientSecure client;
Создайте бота с определённым ранее токеном и клиентом.
UniversalTelegramBot bot(BOTtoken, client);
Переменные botRequestDelay и lastTimeBotRan используются для проверки новых сообщений Telegram каждые x секунд. В данном случае код будет проверять наличие новых сообщений каждую секунду (1000 миллисекунд). Вы можете изменить это время задержки в переменной botRequestDelay.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
Объект BME280
Создайте объект Adafruit_BME280 с именем bme. Это создаст объект I2C на контактах I2C ESP по умолчанию.
Adafruit_BME280 bme;
getReadings()
Функция getReadings() запрашивает температуру и влажность с датчика BME280 и возвращает результаты в виде строковой переменной, которую мы можем отправить Telegram-боту.
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;
}
Чтобы узнать больше о работе датчика BME280 с ESP32 и ESP8266, читайте:
handleNewMessages()
Функция handleNewMessages() обрабатывает то, что происходит при поступлении новых сообщений.
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
Она проверяет доступные сообщения:
for (int i=0; i<numNewMessages; i++) {
Получает chat ID для конкретного сообщения и сохраняет его в переменной chat_id. Chat ID идентифицирует, кто отправил сообщение.
String chat_id = String(bot.messages[i].chat_id);
Если chat_id отличается от вашего chat ID (CHAT_ID), это означает, что кто-то (не вы) отправил сообщение вашему боту. В этом случае сообщение игнорируется и ожидается следующее сообщение.
if (chat_id != CHAT_ID){
bot.sendMessage(chat_id, "Unauthorized user", "");
continue;
}
В противном случае это означает, что сообщение было отправлено от валидного пользователя. Поэтому мы сохраним его в переменной text и проверим его содержимое.
String text = bot.messages[i].text;
Serial.println(text);
Переменная from_name сохраняет имя отправителя.
String from_name = bot.messages[i].from_name;
Если получено сообщение /start, мы отправим допустимые команды для управления ESP32/ESP8266. Это полезно, если вы забыли, какие команды доступны для управления вашей платой.
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, "");
}
Отправка сообщения боту очень проста. Вам достаточно использовать метод sendMessage() для объекта bot и передать в качестве аргументов chat ID получателя, сообщение и режим парсинга.
bool sendMessage(String chat_id, String text, String parse_mode = "")
В нашем примере мы отправим сообщение на ID, сохранённый в переменной chat_id (который соответствует человеку, отправившему сообщение), и отправим сообщение, сохранённое в переменной welcome.
bot.sendMessage(chat_id, welcome, "");
Если получено сообщение /readings, получаем текущие показания датчика, вызвав функцию getReadings(). Затем просто отправляем сообщение.
if (text == "/readings") {
String readings = getReadings();
bot.sendMessage(chat_id, readings, "");
}
setup()
В setup() инициализируйте Serial Monitor.
Serial.begin(115200);
Если вы используете ESP8266, вам нужно использовать следующую строку:
#ifdef ESP8266
client.setInsecure();
#endif
В примерах библиотеки Universal Telegram Bot для ESP8266 сказано: «Это самый простой способ заставить это работать. Если вы передаёте конфиденциальную информацию или управляете чем-то важным, пожалуйста, используйте certStore или хотя бы client.setFingerPrint».
Инициализация BME280
Инициализация датчика BME280.
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Инициализация Wi-Fi
Инициализация Wi-Fi и подключение ESP к вашей локальной сети с SSID и паролем, определёнными ранее.
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
loop()
В loop() проверяем наличие новых сообщений каждую секунду.
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.
while(numNewMessages) {
Serial.println("got response");
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
Вот как работает код.
Демонстрация
Загрузите код на вашу плату ESP, откройте меню Tools > Board и выберите используемую плату. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата.
После загрузки кода нажмите кнопку EN/RST на плате ESP, чтобы начать выполнение кода. Затем откройте Serial Monitor, чтобы увидеть, что происходит в фоновом режиме.
Перейдите в ваш аккаунт Telegram и откройте разговор с вашим ботом. Отправьте следующие команды и посмотрите на ответы бота:
/start показывает приветственное сообщение с доступными командами.
/readings возвращает текущие показания температуры и влажности с датчика BME280.
В то же время в Serial Monitor вы должны увидеть, что ESP32 или ESP8266 получает сообщения.
Если вы попытаетесь взаимодействовать с вашим ботом с другого аккаунта, вы получите сообщение «Unauthorized user».
Заключение
В этом уроке вы узнали, как создать Telegram-бота для взаимодействия с платами ESP32 или ESP8266 NodeMCU. С помощью этого бота вы можете использовать свой аккаунт Telegram для мониторинга датчиков и управления выходами.
Мы показали вам простой пример запроса показаний с датчика BME280. Идея состоит в том, чтобы модифицировать проект, добавив больше команд для выполнения других задач. Например, вы можете отправить сообщение Telegram для управления выходами или отправить сообщение на ваш аккаунт при обнаружении движения.
Преимущество использования Telegram для управления платами ESP заключается в том, что при наличии подключения к интернету (и у ваших плат тоже) вы можете управлять ими и контролировать их из любой точки мира.
Мы надеемся, что этот проект был для вас интересным. Узнайте больше о ESP32 и ESP8266 с нашими ресурсами:
—
Источник: Random Nerd Tutorials — Telegram: Request ESP32/ESP8266 Sensor Readings