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

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

ESP32 ESP8266 NodeMCU управление выходами LED Telegram Arduino

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

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

ESP32 ESP8266 NodeMCU Telegram управление выходами обзор
  • Вы создадите Telegram-бота для вашей платы ESP32/ESP8266;

  • Вы можете начать разговор с ботом;

  • Когда вы отправляете сообщение /led_on боту, плата ESP получает сообщение и включает GPIO 2;

  • Аналогично, когда вы отправляете сообщение /led_off, GPIO 2 выключается;

  • Кроме того, вы можете отправить сообщение /state, чтобы запросить текущее состояние GPIO. Когда ESP получает это сообщение, бот отвечает текущим состоянием GPIO;

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

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

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

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

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

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

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

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

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

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

BotFather в Telegram

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

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

Библиотека ArduinoJson

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

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

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

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

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

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

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

Для этого примера мы будем управлять встроенными светодиодами ESP:

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

Следующий код позволяет управлять GPIO вашего ESP32 или ESP8266 NodeMCU, отправляя сообщения Telegram-боту. Чтобы он работал, вам нужно вставить ваши сетевые учётные данные (SSID и пароль), токен Telegram-бота и ваш Telegram User ID.

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

  Project created using Brian Lough's Universal Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot
  Example based on the Universal Arduino Telegram Bot Library: https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot/blob/master/examples/ESP8266/FlashLED/FlashLED.ino
*/

#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 == "/start") {
      String welcome = "Welcome, " + from_name + ".\n";
      welcome += "Use the following commands to control your outputs.\n\n";
      welcome += "/led_on to turn GPIO ON \n";
      welcome += "/led_off to turn GPIO OFF \n";
      welcome += "/state to request current GPIO state \n";
      bot.sendMessage(chat_id, welcome, "");
    }

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

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

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

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

const int ledPin = 2;
bool ledState = LOW;

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

Токен Telegram-бота

Вставьте токен вашего Telegram-бота, который вы получили от Botfather, в переменную BOTtoken.

#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  // your Bot Token (Get from Botfather)

Telegram User ID

Вставьте ваш chat ID. Тот, который вы получили от IDBot.

#define CHAT_ID "XXXXXXXXXX"

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

WiFiClientSecure client;

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

UniversalTelegramBot bot(BOTtoken, client);

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

int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

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 commands to control your outputs.\n\n";
  welcome += "/led_on to turn GPIO ON \n";
  welcome += "/led_off to turn GPIO OFF \n";
  welcome += "/state to request current GPIO state \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, "");

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

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

Аналогичные действия для сообщения /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».

У нас есть руководство, показывающее, как делать HTTPS-запросы с ESP8266: ESP8266 NodeMCU HTTPS Requests (Arduino IDE).

Установите светодиод как выход и установите его в 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 и откройте разговор с вашим ботом. Отправьте следующие команды и посмотрите на ответы бота:

  • /start показывает приветственное сообщение с допустимыми командами.

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

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

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

Управление выходами ESP32 ESP8266 через Telegram

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

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

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

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

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

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

Заключение

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

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

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

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

Источник: Random Nerd Tutorials — :doc:`Telegram: Control ESP32/ESP8266 Outputs (Arduino IDE) <../telegram-control-esp32-esp8266-nodemcu-outputs/index>`