Telegram: запрос показаний датчиков ESP32/ESP8266 (Arduino IDE)

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

ESP32 ESP8266 NodeMCU отправка показаний датчика BME280 через Telegram Arduino

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

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

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 на смартфон Android или iOS

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

botfather

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

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

Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и username.

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

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

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

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

Любой, кто знает username вашего бота, может с ним взаимодействовать. Чтобы убедиться, что мы игнорируем сообщения не от нашего аккаунта Telegram (или любых авторизованных пользователей), вы можете получить свой Telegram User ID. Тогда, когда ваш Telegram-бот получает сообщение, ESP может проверить, соответствует ли ID отправителя вашему User ID, и обработать сообщение или проигнорировать его.

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

Telegram получение Chat ID с помощью IDBot

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

Telegram получение Chat ID с помощью IDBot getid

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

Мы будем программировать платы ESP32 и 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, так как он может установить устаревшую версию.

Для получения всех подробностей о библиотеке посмотрите страницу GitHub библиотеки Universal Arduino Telegram Bot.

Библиотека ArduinoJson

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

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

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

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

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

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

Библиотеки датчика BME280

Для получения показаний от модуля датчика BME280 мы будем использовать библиотеку Adafruit_BME280. Вам также нужно установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотек в Arduino IDE:

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Library Manager.

  2. Найдите «adafruit bme280» в поле поиска и установите библиотеку.

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

Для использования библиотеки BME280 вам также нужно установить Adafruit Unified Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:

  1. Найдите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.

Установка библиотеки Adafruit Unified Sensor Driver

После установки библиотек перезапустите Arduino IDE.

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

ESP32 BME280 компоненты

Для этого примера мы будем получать показания датчика BME280. Вот список компонентов, необходимых для сборки схемы для этого проекта:

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

Рекомендуемое чтение: Справочник по распиновке ESP32

Подключение BME280 к ESP8266 NodeMCU

Контакты I2C ESP8266 по умолчанию:

  • GPIO 5 (D1): SCL (SCK)

  • GPIO 4 (D2): SDA (SDI)

Соберите схему, как показано на следующей диаграмме, если вы используете плату ESP8266 (Руководство по ESP8266 NodeMCU с BME280).

Схема подключения 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.

Запрос показаний датчиков ESP32 ESP8266 через Telegram демонстрация

В то же время в Serial Monitor вы должны увидеть, что ESP32 или ESP8266 получает сообщения.

ESP32 ESP8266 Telegram запрос показаний датчиков Serial Monitor

Если вы попытаетесь взаимодействовать с вашим ботом с другого аккаунта, вы получите сообщение «Unauthorized user».

Управление ESP32 ESP8266 выходами запрос показаний датчиков Telegram неавторизованный пользователь

Заключение

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

Мы показали вам простой пример запроса показаний с датчика BME280. Идея состоит в том, чтобы модифицировать проект, добавив больше команд для выполнения других задач. Например, вы можете отправить сообщение Telegram для управления выходами или отправить сообщение на ваш аккаунт при обнаружении движения.

Преимущество использования Telegram для управления платами ESP заключается в том, что при наличии подключения к интернету (и у ваших плат тоже) вы можете управлять ими и контролировать их из любой точки мира.

Мы надеемся, что этот проект был для вас интересным. Узнайте больше о ESP32 и ESP8266 с нашими ресурсами:

Источник: Random Nerd Tutorials — Telegram: Request ESP32/ESP8266 Sensor Readings