Мини-кейс 4: Telegram бот

Будем управлять своими устройствами прямо из мессенджера Telegram. Для этого заведём собственного бота и научим Wi-Fi модуль с ним работать.

Если ты ещё не используешь Telegram, зайди на сайт telegram.org, установи приложение на свой смартфон и создай аккаунт.

Telegram позволяет создавать собственных чат-ботов. Чат-бот — это софтверный робот, умеющий вести переписку. Робот умеет создавать специальные кнопки управления в чате и реагировать на их нажатие. Такие кнопки называются клавиатурами. Можно, например, сделать бота, управляющего светом по команде с клавиатуры.

Telegram работает только по протоколу HTTPS.

Основывайтесь на информации, которую вы получили в прошлых заданиях

ЧТО ДЕЛАЕМ?

  1. Создай своего бота с помощью бота BotFather. С помощью BotFather можно зарегистрировать неограниченное количество новых ботов. Единственным условием для регистрации нового бота – является его уникальный username.

    Взаимодействие с BotFather осуществляется при помощи простых команд. Например, для того, чтобы зарегистрировать нового бота, достаточно отправить в чат команду /newbot и следовать простым инструкциям:

    1. Придумать имя бота, которое будет отображаться в чатах и контактах. В дальнейшем его можно будет сменить. Тут все зависит только от вашей фантазии и требований;

    2. Придумать username – это уже сложнее: имя должно быть уникальным и оканчиваться на «bot». Допускаются буквы латинского алфавита, цифры и символ подчеркивания (пример – «MySuper_wow_bot»). Общее количество символов не менее 5 и не более 32;

    3. Если все в порядке, то в ответ мы получим сообщение с токеном. Токен необходим для работы с Bot API посредством http-протокола. Нельзя передавать его другим и желательно не терять. Хорошим решением будет скопировать его: сохранить в текстовый файл и положить в надежное, всегда доступное место – например, облачное хранилище.

  2. Slot Shield установи на Arduino Uno, а Slot Shield установите модуль реле.

  3. Загрузи код в Arduino Uno.

    #include <SoftwareSerial.h>
    
    #define RELAY_PIN A4 // ПИН реле модуля
    
    //SoftwareSerial wifi(4, 5); // TX и RX WI-FI модуля
    
    void setup() {
      Serial.begin(115200);
      //wifi.begin(115200);
      pinMode(RELAY_PIN, OUTPUT);
    }
    
    void loop() {
      // Встроенная функция readStringUntil будет читать все данные, пришедшие в UART до специального символа — '\n' (перенос строки).
      // Он появляется в паре с '\r' (возврат каретки) при передаче данных функцией Serial.println().
      // Эти символы удобно передавать для разделения команд, но не очень удобно обрабатывать. Удаляем их функцией trim().
      String command = Serial.readStringUntil('\n');
      // String command = wifi.readStringUntil('\n');
      command.trim();
      
      // Проверяем, подходит ли команда под одну из ожидаемых: "On" или "Off"
      // Если подходит, выполняем действие.
      if (command == "turnOn") digitalWrite(RELAY_PIN, HIGH);
      else if (command == "turnOff") digitalWrite(RELAY_PIN, LOW);
    }
  4. Для начала стоит проверить, что Arduino правильно обрабатывает поступающие команды. В мониторе порта установи скорость 9600 и пиши туда turnOn для включения реле и turnOff для выключения реле.

  5. Загрузи библиотеку FastBot2 и добавь её. Кроме неё нужно добавить зависимые библиотеки, которые указаны на той странице.

  6. Загрузить код в модуль WI-FI, предвариательно указав wifi ssid и password.

    #include <Arduino.h>
    #include <FastBot2.h>
    
    #define WIFI_SSID "dimdimdim" // Указываем SSID и пароль Wi-Fi сети, с которой будем выходить в интернет
    #define WIFI_PASS "YOUR_PASSWORD" // Спрашиваем у препода
    #define BOT_TOKEN "YOUR_TOKEN" // Ваш токен от телеграмм бота
    #define CHAT_ID ""
    
    FastBot2 bot;
    
    void updateh(fb::Update& u) {
        // Выводим всю информацию о сообщении, нужно только для проверки, иначе Arduino не будет выполнять команды
        // Serial.println("NEW MESSAGE");
        // Serial.println(u.message().from().username());
        // Serial.println(u.message().text());
    
        if (u.message().text() == "/ledOn") {
            Serial.println("turnOn"); // Отправляем сообщение Arduino
            bot.sendMessage(fb::Message("Relay is ON", u.message().chat().id())); // Отправить сообщение обратно
        } else if (u.message().text() == "/ledOff") {
            Serial.println("turnOff"); // Отправляем сообщение Arduino
            bot.sendMessage(fb::Message("Relay is OFF", u.message().chat().id())); // Отправить сообщение обратно
        } else { // Другие случаи
            String reply;
            reply = "Welcome";
            bot.sendMessage(fb::Message(reply, u.message().chat().id())); // Отправить сообщение обратно
        }
    }
    
    void setup() {
      Serial.begin(115200);
        Serial.println();
        WiFi.begin(WIFI_SSID, WIFI_PASS);
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
            if (millis() > 15000) ESP.restart();
        }
        Serial.println("Connected");
    
        bot.attachUpdate(updateh); // Подключить обработчик обновлений
        bot.setToken(F(BOT_TOKEN)); // Установить токен
    
        bot.setPollMode(fb::Poll::Long, 60000); // Режим опроса обновлений. Самый быстрый - Long https://github.com/GyverLibs/FastBot2/blob/main/docs/3.start.md
    
        bot.sendMessage(fb::Message("Hello!", CHAT_ID)); // Поприветствуем админа
    }
    
    void loop() {
      bot.tick(); // Вызывать тикер в loop
    }

  7. Соберите единое устройство!

Дополнительное задание:

Полная документация на библиотеку FastBot2.

https://github.com/GyverLibs/FastBot2

Last updated

Was this helpful?