Мини-кейс 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 = 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. Загрузить код в модуль WI-FI, предвариательно указав wifi ssid и password.

    #include <FastBot.h>
    
    #define WIFI_SSID "dimdimdm"
    #define WIFI_PASS "YOUR_PASSWORD" // Спрашиваем у препода
    #define BOT_TOKEN "YOUR_TOKEN"
    
    FastBot bot(BOT_TOKEN);
    
    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.attach(newMsg);
    }
    
    // Обработчик сообщений
    void newMsg(FB_msg& msg) {
      //Serial.println(msg.toString()); // Выводим всю информацию о сообщении
      if (msg.text == "/ledon") {
          Serial.println("turnOn");
          bot.sendMessage("Relay is ON", msg.chatID); // Отправить сообщение обратно
      } else if (msg.text == "/ledoff") {
          Serial.println("turnOff");
          bot.sendMessage("Relay is OFF", msg.chatID); // Отправить сообщение обратно
      } else { // Другие случаи
        String reply;
        reply = "Welcome";
        bot.sendMessage(reply, msg.chatID);
      }
    }
    
    void loop() {
      bot.tick();
    }

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

    Напоминание, что вы не можете прошивать Arduino Uno при таком собранном устройстве, т.к. заняты пины 0 и 1 по которым идёт прошивка.

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

Сделать кнопки в телеграмме для отправки сообщения включения/выключения.

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

https://github.com/GyverLibs/FastBot

Last updated