Telegram: управление выходами ESP32/ESP8266 (Arduino IDE)
В этом руководстве показано, как управлять GPIO ESP32 или ESP8266 NodeMCU из любой точки мира с помощью Telegram. В качестве примера мы будем управлять светодиодом, но вы можете управлять любым другим выходом. Вам просто нужно отправить сообщение вашему Telegram-боту, чтобы установить выходы в состояние HIGH или LOW. Платы ESP будут запрограммированы с помощью Arduino IDE.
Обзор проекта
В этом уроке мы создадим простой проект, который позволяет управлять GPIO 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-бота. Сначала найдите «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, так как может быть установлена устаревшая версия.
Для получения подробной информации о библиотеке ознакомьтесь со страницей Universal Arduino Telegram Bot Library на GitHub.
Библиотека ArduinoJson
Вам также необходимо установить библиотеку ArduinoJson. Выполните следующие шаги для установки библиотеки.
Перейдите в Sketch > Include Library > Manage Libraries.
Найдите «ArduinoJson».
Установите библиотеку.
Мы используем библиотеку ArduinoJson версии 6.15.2.
Необходимые компоненты
Для этого примера мы будем управлять встроенными светодиодами ESP:
Плата ESP32 (читайте Лучшие платы ESP32)
Альтернатива — плата ESP8266 (читайте Лучшие платы ESP8266)
Управление выходами через 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 запрашивает текущее состояние светодиода.
Встроенный светодиод должен включаться и выключаться соответственно (встроенный светодиод ESP8266 работает в обратном режиме: он выключен, когда вы отправляете /led_on, и включен, когда вы отправляете /led_off).
В то же время в Serial Monitor вы должны увидеть, что ESP получает сообщения.
Если вы попытаетесь взаимодействовать с вашим ботом из другой учётной записи, вы получите сообщение «Unauthorized user».
Заключение
В этом руководстве вы узнали, как создать 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>`