В этом руководстве рассмотрим, как управлять платами ESP32 или ESP8266 через группу в Telegram. Использование группы Telegram для управления своими платами может быть полезно, если нужно, чтобы несколько человек взаимодействовали с ботом в одном чате, и чтобы все эти люди получали уведомления от бота.
Коротко о проекте
- В этом руководстве вы создадите бота Telegram для взаимодействия с платами ESP32 или ESP8266;
- Вы создадите группу, в которую сможете добавить несколько людей для совместного управления платой и получать уведомления от бота;
- Бот будет добавлен в группу, таким образом, участники смогут с ним взаимодействовать;
- В качестве примера рассмотрим, как отправлять команды для управления выходами и как отправлять ответы от бота в группу.
Если вы не знакомы с 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, как показано ниже.
Новое окно должно открыться и вам будет предложено нажать на кнопку /start. Введите /newbot и следуйте инструкциям по созданию бота. Дайте ему название и логин.
Если ваш бот успешно создан, вы получите сообщение со ссылкой для доступа к нему и токеном бота . Сохраните токен бота, он вам понадобится, чтобы обеспечить взаимодействий ESP32 / ESP8266 с ботом.
Создание группы Telegram
Следующим шагом будет создание группы в Telegram. В верхнем левом углу нажмите Создать группу.
Добавьте участников в свою группу и дайте ей название.
Добавьте бота в группу
После создания группы щелкните на имя группы, чтобы добавить своего бота.
Найдите имя своего бота и добавьте его в группу.
Получите идентификатор группы
Для взаимодействия с группой Telegram ESP32 необходимо знать идентификатор группы Telegram. В веб-приложении Telegram нажмите на свою группу. Идентификатор группы должен находиться в URL-адресе, как показано ниже.
Сохраните идентификатор группы, потому что он понадобится вам позже.
Подготовка Arduino IDE
Платы ESP32 и ESP8266 запрограммируем с помощью среды разработки Arduino, поэтому убедитесь, что они установлены в вашей IDE.
Универсальная библиотека ботов Telegram
Для взаимодействия с ботом Telegram мы будем использовать универсальную библиотеку ботов Telegram, которая предоставляет простой интерфейс для Telegram Bot API.
Выполните следующие шаги, чтобы установить библиотеку.
- Скачайте библиотеку
- Перейдите Скетч > Подключить библиотеку > Добавить .ZIP библиотеку
- Добавьте только что загруженную библиотеку.
Важно: не устанавливайте библиотеку через диспетчер библиотек Arduino, так как он может установить устаревшую версию.
Все подробности о библиотеке можно найти на странице
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson . Выполните следующие шаги, чтобы установить библиотеку.
- Перейдите в Скетч> Подключить библиотеку > Управлять библиотеками .
- Найдите «ArduinoJson».
- Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Что нужно для проекта?
Для этого примера вам понадобится одна плата ESP32 или ESP8266.
- Плата ESP32
- Альтернатива – плата ESP8266
Скетч для управления ESP32 / ESP8266 с помощью группы в Telegram
Данный код управляет GPIO ESP32 или ESP8266 NodeMCU, отправляя сообщения группе с нашим ботом.
Чтобы этот скетч работал, необходимо ввести свои учетные данные сети (SSID и пароль), а также токен бота и свой идентификатор группы 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 |
/* 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> #include <ArduinoJson.h> // Вставьте сюда свои учетные данные сети const char* ssid = "Впишите свой SSID"; const char* password = "Впишите свой пароль"; // Запускаем бот #define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // Вставляем токен бота. // Используйте @myidbot, чтобы получить ID пользователя или группы // Помните, что бот сможет вам писать только после нажатия // вами кнопки /start #define CHAT_ID "-XXXXXXXXXX" #ifdef ESP8266 X509List cert(TELEGRAM_CERTIFICATE_ROOT); #endif WiFiClientSecure client; UniversalTelegramBot bot(BOTtoken, client); // Каждую секунду проверяет новые сообщения int botRequestDelay = 1000; unsigned long lastTimeBotRan; const int ledPin = 2; bool ledState = LOW; // Задаем действия при получении новых сообщений 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 == "/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"); // получаем всемирное координированное время (UTC) через NTP client.setTrustAnchors(&cert); // Получаем сертификат api.telegram.org #endif pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); // Подключаемся к 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("Connecting to WiFi.."); } // Выводим IP ESP32 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. Код подключит нужные библиотеки в соответствии с выбранной платой.
Как работает код?
Импортируем необходимые библиотеки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ifdef ESP32 #include "WiFi.h" #else #include "ESP8266WiFi.h" #endif #include "WiFiClientSecure.h" #include "UniversalTelegramBot.h" #include "ArduinoJson.h" |
Вставьте свои учетные данные сети в следующие переменные.
1 2 3 |
const char* ssid = "укажите SSID"; const char* password = "укажите пароль"; |
Вставьте токен бота Telegram, полученный от Botfather, в переменную BOTtoken.
1 |
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" |
Вставьте свой идентификатор группы Telegram. Он должен начинаться со знака «-».
1 |
#define CHAT_ID "-XXXXXXXXXX" |
Создайте новое соединение WiFi с WiFiClientSecure.
1 |
WiFiClientSecure client; |
Создайте бот с токеном и клиентом, введенными ранее.
1 |
UniversalTelegramBot bot(BOTtoken, client); |
botRequestDelay и lastTimeBotRan используются для проверки наличия новых сообщений в Telegram с заданной частотой. В этом случае код будет проверять наличие новых сообщений каждую секунду (1000 миллисекунд). Вы можете изменить время задержки в переменной botRequestDelay.
1 2 3 |
int botRequestDelay = 1000; unsigned long lastTimeBotRan; |
Установите GPIO, которым хотите управлять. В нашем случае мы будем управлять GPIO 2 (встроенный светодиод).
1 2 3 |
const int ledPin = 2; bool ledState = LOW; |
Состояние должно быть LOW по умолчанию.
Примечание: если вы используете ESP8266, встроенный светодиод работает с инвертированной логикой. То есть, вы должны отправить сигнал LOW для включения светодиода и HIGH, чтобы выключить его.
Эта функция определяет действия программы при появлении новых сообщений.
1 2 3 4 5 |
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 2 3 4 5 6 7 |
if (chat_id != CHAT_ID){ bot.sendMessage(chat_id, "Неавторизованный пользователь", ""); continue; } |
В противном случае это означает, что сообщение было отправлено зарегистрированным пользователем. Сохраним в строковую переменную text и выведем её.
1 2 3 |
String text = bot.messages[i].text; Serial.println(text); |
Переменная from_name сохраняет имя отправителя.
1 |
String from_name = bot.messages[i].from_name; |
Если бот получает сообщение /led_on , то он должен включить светодиод, отправить подтверждающее сообщение и обновить переменную ledState.
1 2 3 4 5 6 7 8 9 |
if (text == "/led_on") { bot.sendMessage(chat_id, "LED state set to ON", ""); ledState = HIGH; digitalWrite(ledPin, ledState); } |
Отправить сообщение боту очень просто. Вам просто нужно использовать метод sendMessage() и передать в качестве аргументов идентификатор чата получателя, сообщение и режим парсинга.
1 |
bool sendMessage(String chat_id, String text, String parse_mode = "") |
Тоже самое делаем и для команды /led_off .
1 2 3 4 5 6 7 8 9 |
if (text == "/led_off") { bot.sendMessage(chat_id, "LED state set to OFF", ""); ledState = LOW; digitalWrite(ledPin, ledState); } |
Помним, что состояние должно быть LOW по умолчанию.
Примечание: если вы используете ESP8266, встроенный светодиод работает с инвертированной логикой. То есть, вы должны отправить сигнал LOW сигнал для включения светодиода и сигнал HIGH, чтобы выключить его.
Наконец, если получена команда / state, проверяем текущее состояние GPIO и отправляем сообщение с состоянием.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (text == "/state") { if (digitalRead(ledPin)){ bot.sendMessage(chat_id, "LED is ON", ""); } else{ bot.sendMessage(chat_id, "LED is OFF", ""); } } |
setup()
Инициализируйте монитор последовательного порта.
1 |
Serial.begin(115200); |
Если вы используете ESP8266, вам необходимо использовать следующую строку:
1 2 3 4 5 |
#ifdef ESP8266 client.setInsecure(); #endif |
Установите светодиод как выход и задайте сигнал LOW при запуске ESP:
1 2 3 |
pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); |
Инициализируйте Wi-Fi и подключите ESP к вашей сети, используя SSID и пароль.
1 2 3 4 5 6 7 8 9 10 11 |
WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } |
loop ()
Проверяем наличие новых сообщений раз в секунду.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 6 7 8 9 |
while(numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } |
Примерно так работает код.
Демонстрация
Загрузите код в ESP, откройте меню Инструменты> Плата и выберите плату , которую вы используете. Перейдите в Инструменты > Порт и выберите COM-порт, к которому подключена ваша плата.
После загрузки кода нажмите кнопку ESP EN / RST, чтобы запустить код. Затем откройте монитор порта чтобы посмотреть, что происходит в фоновом режиме.
Зайдите в Telegram и откройте группу.
Отправьте следующие команды и посмотрите, что отвечает бот:
- /led_on включает светодиод.
- /led_off выключает светодиод.
- /state запрашивает текущее состояние светодиода.
Встроенный светодиод должен включаться и выключаться (встроенный светодиод ESP8266 работает в обратном направлении, он не горит, когда вы отправляете /led_on, и горит по команде /led_off ).
Когда вы добавляете своего бота в группу, каждый в группе может взаимодействовать с ботом и получать сообщения от него. В этом случае два человека управляют ботом и могут видеть команды, которые отправляет другой.
Вы можете добавить в группу больше людей, например всех членов семьи.
На мониторе порта вы должны увидеть, что ESP получает сообщения.
Заключение
В этом руководстве вы узнали, как получать и отправлять сообщения на ESP32 или ESP8266 с помощью группы в Telegram. Использование группы для управления вашим ESP32 может быть более удобным по сравнению с отдельным чатом, если нужно, чтобы несколько человек могли управлять одной платой.
Мы показали вам всего лишь простой пример. Идея в том, чтобы вы могли изменить проект, добавить больше команд для выполнения других задач. сюда ссылки на другие статьи с телегой
Самое замечательное в использовании Telegram для управления вашими платами ESP – возможность управлять ими из любой точки мира при наличии интернета.
Надеемся, вам понравился этот проект.
Также вы можете ознакомиться с другими проектами на ESP32 и Telegram:
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
15 комментариев. Оставить новый
Добрый день. Использовал код из этой статьи, прописал токен, чат ид, но на любое сообщение, что конкретно боту, что в чат приходит ответ в виде “Unauthorized user”. Что сделал не так? Куда копать?
Чтобы код нормально работал – удали строчки кода:
if (chat_id != CHAT_ID){
bot.sendMessage(chat_id, “Unauthorized user”, “”);
continue;
}
После чего код начинает работать нормально, хоть и без проверки пользователя на доступ к проекту(хотя хз зачем это тут). Данный метод помог лично мне
Здравствуйте!
Нужно получить правильный CHAT_ID с помощью IDbot.
Укажите CHAT_ID без знака минус и все будет работать
А что если ESP устройств много. Могут ли все работать с одним ID? Или на каждого нужен свой бот и ID? Имею ввиду работу устройств, а не людей в группе.
Доброго времени суток, повторил всё в точности за вами, но высвечивается вот такая ошибка:
‘X509List’ does not name a type
Подскажите пожалуйста, как решить данную оказию
как можно прописать в CHAT_ID, id двух или более пользователей, не используя группу в телеграмме
Здраствуйте ,возникла проблема с библиотекой ,помогите решить пожалуйста
Error: 13 INTERNAL: Library install failed: archive is not valid: multiple files found in zip file top level
Здравствуйте! Вы неправильно установили библиотеку. Ее необходимо разархивировать, а вы похоже просто архив в папку перенесли.
Подскажите, пожалуйста, что делать с этой ошибкой Failed uploading: uploading error: exit status 2
Добрый день!
Ошибка указывает на проблемы с подключением, настройками порта или неправильными настройками платы. Для решения этой проблемы попробуйте выполнить следующие шаги:
1) Убедитесь, что ваша ESP8266/ESP32 правильно подключена к компьютеру через USB и что все провода и разъемы надежно соединены.
2) Убедитесь, что в меню “Tools” выбрана правильная плата (ESP8266 или ESP32) и порт COM для вашего устройства.
3) Иногда проблема может быть в порте или кабеле. Попробуйте использовать другой порт или кабель для подключения.
4) Попробуйте обновить драйвера для USB.
Почему может не приходить сообщение от бота? токен и id указанны верно
Причин, почему сообщение от бота не приходит, может быть несколько:
1) Неправильный пароль или название сети Wi-Fi. Убедитесь, что пароль и название вашей сети Wi-Fi указано верно в скетче.
2) Неправильный токен или id чата. Еще раз проверьте, что токен и CHAT_ID указаны верно.
3) Перед началом работы с ботом необходимо отправить команду “/start”, в противном случае бот не будет реагировать на сообщения.
Подскажите, пожалуйста, почему от тг бота приходит только такое сообщение “Unauthorized user”?
Сообщение “Unauthorized user” говорит о том, что chat_id полученного сообщения отличается от вашего идентификатора чата CHAT_ID. Убедитесь, что вы верно указали CHAT_ID в начале скетча для Arduino.