Группа Telegram: управление выходами ESP32/ESP8266 (Arduino IDE)

Этот урок показывает, как управлять платами ESP32 или ESP8266 через группу Telegram. Использование группы Telegram для управления платами может быть полезным, если вы хотите, чтобы несколько человек взаимодействовали с ботом в одном чате и все они получали уведомления от бота.

Группа Telegram: управление выходами ESP32/ESP8266 (Arduino IDE)

У нас есть другие уроки о Telegram, которые мы рекомендуем прочитать:

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

Управление платами ESP32 и ESP8266 с помощью группы Telegram с несколькими участниками
  • В этом уроке вы создадите телеграм-бота для взаимодействия с платами ESP32 или ESP8266;

  • Вы создадите группу, в которую сможете добавить нескольких человек, которые будут управлять и получать уведомления от бота;

  • Бот будет добавлен в группу, чтобы участники могли с ним взаимодействовать;

  • В качестве примера мы покажем, как отправлять команды для управления выходами и как отправлять ответы от бота в группу.

Знакомство с Telegram

Telegram Messenger — это облачный сервис обмена мгновенными сообщениями и голосовой связи через IP. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (PC, Mac и Linux). Он бесплатный и без рекламы. Telegram позволяет создавать ботов, с которыми можно взаимодействовать.

«Боты — это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами с помощью HTTPS-запросов к Telegram Bot API».

ESP32/ESP8266 будет взаимодействовать с ботом Telegram для получения и обработки сообщений, а также отправки ответов в группу Telegram.

Установка Telegram

Перейдите в Google Play или App Store, скачайте и установите Telegram.

Установка и загрузка Telegram

Создание бота Telegram

Следующие шаги проще выполнять на компьютере. Откройте браузер, перейдите в Telegram Web App и войдите в свой аккаунт.

Если вы следовали предыдущим проектам и у вас уже есть телеграм-бот, вы можете пропустить этот раздел.

В левом верхнем углу найдите «botfather» и нажмите на BotFather, как показано ниже.

Поиск Botfather в Telegram Web App

Откроется новое окно, и вам будет предложено нажать кнопку start. Введите /newbot и следуйте инструкциям для создания бота. Дайте ему имя и имя пользователя.

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

Создание бота Telegram в Telegram Web App

Создание группы Telegram

Следующий шаг — создание группы Telegram. В левом верхнем углу нажмите New group.

Создание новой группы в веб-версии Telegram

Добавьте участников в вашу группу и дайте ей имя.

Присвоение имени группе Telegram

Добавление бота в группу

После создания группы нажмите на название группы, чтобы добавить вашего бота.

Добавление нового участника в группу Telegram

Найдите имя вашего бота и добавьте его в группу.

Добавление бота в группу Telegram

Получение ID группы

Для взаимодействия с группой Telegram ESP32 необходимо знать ID группы в Telegram. В вашем аккаунте Telegram откройте вашу группу. ID группы должен быть в URL, как показано ниже.

Получение ID группы Telegram

Сохраните ID группы, потому что он понадобится позже.

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

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

Библиотека ArduinoJson

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

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

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

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

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

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

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

Для этого примера вам понадобится только одна плата ESP32 или ESP8266.

Управление ESP32/ESP8266 через группу Telegram — скетч

Следующий код позволяет управлять GPIO ESP32 или ESP8266 NodeMCU, отправляя сообщения в группу, в которой ваш бот Telegram является участником.

Чтобы этот скетч работал для вас, вам нужно вставить свои сетевые учётные данные (SSID и пароль), токен бота Telegram и ID вашей группы Telegram.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/telegram-group-esp32-esp8266/

  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>

// 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"

#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;

const int ledPin = 2;
bool ledState = LOW;

// 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 == "/led_on") {
      bot.sendMessage(chat_id, "LED state set to ON", "");
      ledState = HIGH;
      digitalWrite(ledPin, ledState);
    }

    if (text == "/led_off") {
      bot.sendMessage(chat_id, "LED state set to OFF", "");
      ledState = LOW;
      digitalWrite(ledPin, ledState);
    }

    if (text == "/state") {
      if (digitalRead(ledPin)){
        bot.sendMessage(chat_id, "LED is ON", "");
      }
      else{
        bot.sendMessage(chat_id, "LED is OFF", "");
      }
    }
  }
}

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

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);

  // 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());

  bot.sendMessage(CHAT_ID, "Bot Started", "");
}

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 (он основан на примере из библиотеки Universal Arduino Telegram Bot). Код загрузит нужные библиотеки в зависимости от выбранной платы.

Как работает код

Начните с импорта необходимых библиотек.

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#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)

ID группы Telegram

Вставьте ID вашей группы Telegram. Он должен начинаться со знака «-«.

#define CHAT_ID "-XXXXXXXXXX"

Создайте новый WiFi-клиент с помощью WiFiClientSecure.

WiFiClientSecure client;

Создайте бота с определённым ранее токеном и клиентом.

UniversalTelegramBot bot(BOTtoken, client);

Переменные botRequestDelay и lastTimeBotRan используются для проверки новых сообщений Telegram каждые x секунд. В данном случае код будет проверять новые сообщения каждую секунду (1000 миллисекунд). Вы можете изменить это время задержки в переменной botRequestDelay.

int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

Определение выхода

Установите GPIO, которым вы хотите управлять. В нашем случае мы будем управлять GPIO 2 (встроенный светодиод), и его состояние по умолчанию — LOW.

const int ledPin = 2;
bool ledState = LOW;

Примечание: если вы используете ESP8266, встроенный светодиод работает с инвертированной логикой. Поэтому вы должны отправить сигнал LOW для включения светодиода и сигнал HIGH для его выключения.

handleNewMessages()

Функция handleNewMessages() обрабатывает то, что происходит при поступлении новых сообщений.

void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

Она проверяет доступные сообщения:

for (int i=0; i<numNewMessages; i++) {

Получите ID чата для данного конкретного сообщения и сохраните его в переменной chat_id. ID чата позволяет нам определить, кто отправил сообщение.

String chat_id = String(bot.messages[i].chat_id);

Если chat_id отличается от 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;

Если получено сообщение /led_on, включите светодиод и отправьте сообщение, подтверждающее получение. Также обновите переменную ledState новым состоянием.

if (text == "/led_on") {
  bot.sendMessage(chat_id, "LED state set to ON", "");
  ledState = HIGH;
  digitalWrite(ledPin, ledState);
}

Отправка сообщения боту очень проста. Вам нужно использовать метод sendMessage() объекта bot и передать в качестве аргументов ID чата получателя, сообщение и режим парсинга.

bool sendMessage(String chat_id, String text, String parse_mode = "")

Сделайте то же самое для сообщения /led_off.

if (text == "/led_off") {
  bot.sendMessage(chat_id, "LED state set to OFF", "");
  ledState = LOW;
  digitalWrite(ledPin, ledState);
}

Примечание: если вы используете ESP8266, встроенный светодиод работает с инвертированной логикой. Поэтому вы должны отправить сигнал LOW для включения светодиода и сигнал HIGH для его выключения.

Наконец, если получено сообщение /state, проверьте текущее состояние GPIO и отправьте соответствующее сообщение.

if (text == "/state") {
  if (digitalRead(ledPin)){
    bot.sendMessage(chat_id, "LED is ON", "");
  }
  else{
    bot.sendMessage(chat_id, "LED is OFF", "");
  }
}

setup()

В setup() инициализируйте Serial Monitor.

Serial.begin(115200);

Если вы используете ESP8266, вам нужно использовать следующую строку:

#ifdef ESP8266
  client.setInsecure();
#endif

В примерах библиотеки для ESP8266 говорится: «Это самый простой способ заставить это работать. Если вы передаёте конфиденциальную информацию или управляете чем-то важным, пожалуйста, используйте certStore или хотя бы client.setFingerPrint».

Установите светодиод как выход и установите его в LOW при первом запуске ESP:

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);

Инициализация 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);
}

Вот так и работает этот код.

Демонстрация

Загрузите код на вашу плату ESP32 или ESP8266. Не забудьте перейти в Tools > Board и выбрать вашу плату. Перейдите в Tools > Port и выберите COM-порт, к которому подключена ваша плата.

После загрузки кода нажмите кнопку EN/RST на плате ESP32/ESP8266, чтобы начать выполнение кода. Затем вы можете открыть Serial Monitor, чтобы увидеть, что происходит в фоновом режиме.

Перейдите в свой аккаунт Telegram и откройте группу.

Отправьте следующие команды и посмотрите, как бот отвечает:

  • /led_on включает светодиод.

  • /led_off выключает светодиод.

  • /state запрашивает текущее состояние светодиода.

Управление ESP32 ESP8266 с помощью группы Telegram — демонстрация

Встроенный светодиод должен включаться и выключаться соответственно (встроенный светодиод ESP8266 работает наоборот: он выключен, когда вы отправляете /led_on, и включен, когда вы отправляете /led_off).

Когда вы добавляете телеграм-бота в группу, все участники группы могут взаимодействовать с ботом и получать сообщения от него. Например, в данном случае мы оба (Sara и Rui) можем управлять ботом и видеть команды, которые отправляет другой. Кроме того, в проекте с уведомлениями мы оба будем получать уведомления в группе.

Вы можете добавить в группу больше людей, например, всех членов семьи.

Встроенный светодиод ESP32 включён

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

Управление выходами ESP32 ESP8266 через Telegram — демонстрация Serial Monitor

Заключение

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

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

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

Надеемся, что этот проект был для вас интересным.

Узнайте больше о ESP32 и ESP8266 с нашими ресурсами:

Источник: Random Nerd Tutorials — Telegram Group: Control ESP32/ESP8266 Outputs (Arduino IDE)