Управление ESP8266 через Telegram бота
В данной статье вы узнаете как создать своего Telegram бота, задать ему список навыков, научить его отправлять и читать сообщения в чате, а также взаимодействовать с ESP8266 через библиотеку FastBot.
Создание Telegram бота
Основные термины
Давайте для начала определимся с основными терминами и разберем что есть что.
Telegram – один из самых популярных мессенджеров, который работает на всех платформах:
- Компьютер (Windows, Linux, MacOS): официальный сайт
- Браузер: официальный сайт
- Android: Google Play
- iOS: App Store
Telegram бот - это специальный аккаунт, созданный в автоматическим режиме, который позволяет пользователям совершать разные действия через сам мессенджер. Такой бот может писать вам сообщения, читать ваши сообщения и реагировать на них, отправлять в чат меню с кнопками и многое другое. ESP8266 может управлять таким ботом, что даёт нам огромные возможности: получение данных с датчиков или управление своим проектом из любой точки планеты, причём абсолютно бесплатно!
Создание бота
Чтобы создать бота нам нужен еще один бот. Как бы парадоксально это не звучало.
Открываем поиск Telegram и ищем бота BotFather
Запускаем и отправляем ему команду /newbot
Далее вам предложат придумать и оправить имя для бота. Оно может быть любым и в случае необходимости его всегда можно будет изменить.
На следующем шаге вам необходимо отправить имя пользователя для бота. Оно обязательно должно быть уникальным, заканчиваться на bot и в последствии изменить его уже будет нельзя
И, наконец, вас поздравят с регистрацией и отправят вам токен. Токен - длинный уникальный код, который даёт полный контроль над ботом. Никому не показывайте этот код! Он понадобится нам дальше. Кликните по нему, чтобы скопировать в буфер обмена и сохраните в надежное место.
Получение ID чата
Чтобы бот мог отправлять сообщения, он должен знать, кому их отправлять. Каждый аккаунт и каждый чат в Telegram имеет свой уникальный номер – ID, зная этот номер бот может написать в чат сообщение.
Для получения своего ID, перейдите в поиск и найдите IDBot
Перейдите к диалогу с ботом и отправьте следующую команду /getid
Сохраните полученный ID
Создание списка команд
Этот шаг совсем не обязательный, но очень сильно упрощает общение с ботом
Переходим в диалог с BotFather и отправляем команду /mybots. Затем выбираем нужного бота из списка. Далее нажимаем на Edit Bot > Edit Commands. Вводим команды в следующем формате имя - описание
В чате с ботом появится новая кнопка, при нажатии на которую появится список созданных нами команд.
Управление ESP8266 через Telegram бота
Сейчас мы напишем простой скетч, который будет при получении сообщения от созданного на предыдущем шаге бота, выполнять следующие действия:
- Выводить текст сообщения на oled экран, подключенный к ESP
- При успешном старте и соединении с ботом писать в част сообщение "ESP запущен и готов к работе!"
- При получении команды /on - включать встроенный светодиод и отправлять боту в чат отклик на команду
- При получении команды /off выключать его и отправлять боту в чат отклик на команду
- При получении команды /state отправлять боту в чат сообщение о состоянии светодиода
Подготовка
Для данного проекта понадобятся:
- Oled экран 0.96 I2C
- Wemos D1 Mini
- Отладочная плата
- Несколько проводов для соединений
Также дополнительно нужно в менеджере библиотек Arduino IDe найти и установить билиотеку 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
- время сообщения
В данном примере мы проверяем текст сообщения 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();
}