Управление ESP8266 через Telegram бота
В данной статье вы узнаете как создать своего Telegram бота и научить его взаимодействовать с ESP8266 через библиотеку FastBot.
Управление ESP8266 через Telegram бота
02.05.2024 в 15:54   2567 0
Версия для печати

Управление ESP8266 через Telegram бота

logo

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

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

Основные термины

Давайте для начала определимся с основными терминами и разберем что есть что.

Telegram – один из самых популярных мессенджеров, который работает на всех платформах:

Telegram бот - это специальный аккаунт, созданный в автоматическим режиме, который позволяет пользователям совершать разные действия через сам мессенджер. Такой бот может писать вам сообщения, читать ваши сообщения и реагировать на них, отправлять в чат меню с кнопками и многое другое. ESP8266 может управлять таким ботом, что даёт нам огромные возможности: получение данных с датчиков или управление своим проектом из любой точки планеты, причём абсолютно бесплатно! 

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

Чтобы создать бота нам нужен еще один бот. Как бы парадоксально это не звучало.

Открываем поиск Telegram и ищем бота BotFather

botfather

Запускаем и отправляем ему команду /newbot

Далее вам предложат придумать и оправить имя для бота. Оно может быть любым и в случае необходимости его всегда можно будет изменить.

На следующем шаге вам необходимо отправить имя пользователя для бота. Оно обязательно должно быть уникальным, заканчиваться на bot и в последствии изменить его уже будет нельзя

И, наконец, вас поздравят с регистрацией и отправят вам токен. Токен - длинный уникальный код, который даёт полный контроль над ботом. Никому не показывайте этот код! Он понадобится нам дальше. Кликните по нему, чтобы скопировать в буфер обмена и сохраните в надежное место.

borfatherlog

 

Получение ID чата

Чтобы бот мог отправлять сообщения, он должен знать, кому их отправлять. Каждый аккаунт и каждый чат в Telegram имеет свой уникальный номер – ID, зная этот номер бот может написать в чат сообщение.

Для получения своего ID, перейдите в поиск и найдите IDBot 

idbot

Перейдите к диалогу с ботом и отправьте следующую команду /getid

Сохраните полученный ID

Создание списка команд

Этот шаг совсем не обязательный, но очень сильно упрощает общение с ботом

Переходим в диалог с BotFather и отправляем команду /mybots. Затем выбираем нужного бота из списка. Далее нажимаем на Edit Bot > Edit Commands. Вводим команды в следующем формате имя - описание

botcomands

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

comlist

Управление ESP8266 через Telegram бота

Сейчас мы напишем простой скетч, который будет при получении сообщения от созданного на предыдущем шаге бота, выполнять следующие действия:

  • Выводить текст сообщения на oled экран, подключенный к ESP
  • При успешном старте и соединении с ботом писать в част сообщение "ESP запущен и готов к работе!"
  • При получении команды /on - включать встроенный светодиод и отправлять боту в чат отклик на команду
  • При получении команды /off выключать его и отправлять боту в чат отклик на команду
  • При получении команды /state  отправлять боту в чат сообщение о состоянии светодиода

Подготовка

Для данного проекта понадобятся:

  • Oled экран 0.96 I2C 
  • Wemos D1 Mini
  • Отладочная плата
  • Несколько проводов для соединений

 

Также дополнительно нужно в менеджере библиотек Arduino IDe найти и установить билиотеку FastBot

fastbot

Схема соединения

Соединяем все компоненты по схеме ниже и переходим к следующему шагу.

схема

Скетч программы

Запускаем Arduino IDE и копируем в него следующий скетч


#include <SPI.h>
#include <Wire.h>
#include <FastBot.h>
#include <Adafruit_GFX.h> // Подключение библиотеки Adafruit_GFX
#include <Adafruit_SSD1306.h> // Подключение библиотеки Adafruit_SSD1306
#define OLED_RESET -1
#define SCL 5 // D1
#define SDA 4 
#define SCREEN_WIDTH 128 // OLED дисплей ширина в пикселях
#define SCREEN_HEIGHT 64 // OLED дисплей высота в пикселях
#define BOT_TOKEN "xxxxxxxx:xxxxxxxxxxxxxxxxxxx" // Здесь введите Ваш Bot Token, сгенерированный Botfather
#define CHAT_ID "xxxxxxxxxxx" // Здесь введите идентификатор пользователя Telegram (UserID)
#define WIFI_SSID "ssid" //название точки доступа WiFi
#define WIFI_PASS "pass" //пароль к точке доступа

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Инициализация Telegram BOT

FastBot bot(BOT_TOKEN);
const int ledPin = 2;
bool ledState = HIGH; 

void newMsg(FB_msg& msg) {
 // выводим имя юзера и текст сообщения
 display.clearDisplay(); 
 display.setCursor(0,0);
 display.println(msg.text);
 display.display();
 // выводим всю информацию о сообщении
 Serial.println(msg.toString());
 if (msg.text == "/on") {
 bot.sendMessage("Светодиод включен",CHAT_ID); // Светодиод включен
 ledState = LOW; // HIGH for ESP32
 digitalWrite(ledPin, ledState);
 }

 if (msg.text == "/off") {
 bot.sendMessage("Светодиод выключен",CHAT_ID); // Светодиод выключен
 ledState = HIGH; // LOW for ESP3
 digitalWrite(ledPin, ledState);
 }
 
 if (msg.text == "/state") {
 if (digitalRead(ledPin)) {
 bot.sendMessage("На ESP8266 cветодиод выключен",CHAT_ID); // Светодиод включен (ОС)
 }
 else {
 bot.sendMessage("На ESP8266 cветодиод включен",CHAT_ID); // Светодиод выключен (ОС)
 }
 }
}

void setup() {
 Serial.begin(115200);
 connectWiFi();
 Wire.begin(); 
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Указываем адрес дисплея
 display.clearDisplay(); // Очищаем дисплей
 display.setTextSize(1); // Устанавливаем размер шрифта
 display.setTextColor(WHITE); // Цвет фона
 display.display();
 pinMode(ledPin, OUTPUT);
 pinMode(A0, INPUT);
 digitalWrite(ledPin, ledState);

 bot.setChatID(CHAT_ID); // передайте "" (пустую строку) чтобы отключить проверку
 bot.attach(newMsg);
 bot.sendMessage("ESP запущен и готов к работе!");
 }
void loop() {
 bot.tick();
} 
 
void connectWiFi() {
 WiFi.begin(WIFI_SSID, WIFI_PASS);
 while (WiFi.status() != WL_CONNECTED) {
 delay(500);
 Serial.print(".");
 if (millis() > 15000) ESP.restart();
 }
 Serial.println("Подключен");
}

Теперь, пожалуй, стоит дать пояснения к некоторым местам кода

Этом блоке пишем свои данные для подключения

#define BOT_TOKEN "xxxxxxxx:xxxxxxxxxxxxxxxxxxx" // Здесь введите Ваш Bot Token, сгенерированный Botfather
#define CHAT_ID "xxxxxxxxxxx" // Здесь введите идентификатор пользователя Telegram (UserID)
#define WIFI_SSID "ssid" //название точки доступа WiFi
#define WIFI_PASS "pass" //пароль к точке доступа

Вводим свои данные WiFi, токен нашего бота, полученный на предыдущем шаге и ваш ID, полученный у IDBot

Далее инициализируем нашего бота

FastBot bot(BOT_TOKEN);

Затем идет функция-обработчик, в которой задается порядок действий при получении новых сообщений от бота


void newMsg(FB_msg& msg) {
 // выводим имя юзера и текст сообщения
 display.clearDisplay(); 
 display.setCursor(0,0);
 display.println(msg.text);
 display.display();
 // выводим всю информацию о сообщении
 Serial.println(msg.toString());
 if (msg.text == "/on") {
 bot.sendMessage("Светодиод включен",CHAT_ID); // Светодиод включен
 ledState = LOW; // HIGH for ESP32
 digitalWrite(ledPin, ledState);
 }

 if (msg.text == "/off") {
 bot.sendMessage("Светодиод выключен",CHAT_ID); // Светодиод выключен
 ledState = HIGH; // LOW for ESP3
 digitalWrite(ledPin, ledState);
 }
 
 if (msg.text == "/state") {
 if (digitalRead(ledPin)) {
 bot.sendMessage("На ESP8266 cветодиод выключен",CHAT_ID); // Светодиод включен (ОС)
 }
 else {
 bot.sendMessage("На ESP8266 cветодиод включен",CHAT_ID); // Светодиод выключен (ОС)
 }
 }
}

На этом следует остановиться более подробно
 

Внутри этой функции можно пользоваться переданной переменной сообщение, которая имеет тип FB_msg (структура) и содержит в себе:

  • String userID - ID пользователя
  • String username - имя пользователя или канала
  • bool isBot - сообщение от бота
  • String chatID - ID чата
  • int32_t messageID - ID сообщения в чате
  • bool edited - сообщение отредактировано
  • String text - текст сообщения или попдпись к файлу
  • String replyText - текст ответа, если он есть
  • String data - callback данные из меню (если есть)
  • bool query - запрос
  • bool isFile - это файл
  • String fileName - имя файла
  • String fileUrl - адрес файла для загрузки
  • bool OTA - запрос на OTA обновление (получен .bin файл)
  • uint32_t unix - время сообщения
А также String toString() - вся информация из сообщения одной строкой

 

В данном примере мы проверяем текст сообщения msg.text на соответствие одному из заданных значений и выполняем необходимые действия. При этом отправляем боту в чат ответ с помощью bot.sendMessage("message","ID"), что действие выполнено

Далее переходим к блоку Setup() и еще одному интересному участку кода

bot.setChatID(CHAT_ID); // передайте "" (пустую строку) чтобы отключить проверку
 bot.attach(newMsg);
 bot.sendMessage("ESP запущен и готов к работе!");

bot.setChatID(CHAT_ID) - устанавливает ID пользователя, который может управлять ESP8266 с помощью бота. Если параметр оставить пустым, то управлять сможет любой желающий имеющий доступ к нашему боту. Также несколько упрощает написание функций для работы с ботом. Т.е. для того чтобы отправить сообщение боту можно написать просто bot.sendMessage("message") вместо bot.sendMessage("message","ID")
bot.attach(newMsg) - указывает боту функцию-обработчик при получении новых сообщений

И, наконец, в цикле loop() вызываем процедуру проверки обновлений по таймеру

void loop() {
 bot.tick();
} 

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

И напоследок небольшое видео с демонстрацией работы
Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Программирование | Добавил: :, (03.02.2023)
Просмотров: 2567 | Теги: ESP8266, бот, Telegram | Рейтинг: 0.0/0
Поделиться:
Всего комментариев: 0
avatar