Home Internet of Things - IoT Điều khiển ESP32/ESP8266 qua Telegram

Điều khiển ESP32/ESP8266 qua Telegram

by Khanh Tran

Trong hướng dẫn này tôi sẽ hướng dẫn các bạn cách điều khiển ESP32/ESP8266 qua Telegram từ mọi nơi trên thế giới. Chúng ta có thể điều khiển đèn LED, hoặc bạn có thể điều khiển bất kỳ đầu ra nào khác. Bạn chỉ cần gửi tin nhắn tới Telegram Bot của mình để đặt kết quả đầu ra HIGH hoặc LOW. Các bo mạch ESP sẽ được lập trình bằng Arduino IDE.

Hình 1: điều khiển Esp32 qua Telegram

Tổng quan dự án

Trong hướng dẫn này, chúng tôi sẽ xây dựng một dự án đơn giản. Nó cho phép bạn điều khiển các GPIO ESP32 hoặc ESP8266 NodeMCU bằng Telegram.

Hình 2: Tổng quan dự án
  • Bạn sẽ tạo một bot Telegram cho ESP32/ESP8266 của mình;
  • Chúng ta có thể bắt đầu cuộc trò chuyện với bot;
  • Khi bạn gửi thông báo /led_on đến bot, ESP sẽ nhận thông báo và turn on GPIO2;
  • Tương tự, khi bạn gửi tin nhắn /led_off , nó sẽ turn off GPIO2;
  • Ngoài ra, bạn cũng có thể gửi tin nhắn /state để check trạng thái GPIO hiện tại. Khi ESP nhận được thông báo đó, bot sẽ phản hồi với trạng thái GPIO hiện tại;
  • Bạn có thể gửi tin nhắn /start để nhận tin nhắn welcome và hướng dẫn sử dụng.

Giới thiệu Telegram

Telegram Messenger là dịch vụ nhắn tin tức thời. Bạn có thể dễ dàng cài đặt nó trong điện thoại thông minh (Android và iPhone) hoặc máy tính (PC, Mac và Linux). Nó là miễn phí và không có bất kỳ quảng cáo nào. Telegram cho phép bạn tạo các bot mà bạn có thể tương tác.

ESP32/ESP8266 sẽ tương tác với bot Telegram để nhận và xử lý tin nhắn cũng như gửi phản hồi. Trong hướng dẫn này, bạn sẽ học cách sử dụng Telegram để gửi tin nhắn tới bot của bạn nhằm kiểm soát kết quả đầu ra của ESP từ bất kỳ đâu (bạn chỉ cần Telegram và truy cập internet).

Tạo một Bot Telegram

Truy cập Google Play hoặc App Store, tải xuống và cài đặt  Telegram.

Mở Telegram và làm theo các bước tiếp theo để tạo Telegram Bot. Đầu tiên, tìm kiếm “botfather” và nhấp vào BotFather như hình bên dưới. Hoặc mở liên kết t.me/botfather trong điện thoại thông minh của bạn.

bố thím
Hình 3: BotFather

Cửa sổ sau sẽ mở ra và bạn sẽ được nhắc nhấp vào start.

Telegram Khởi động BotFather để tạo một Bot mới
Hình 4: tạo bot trên telegram

Type /newbot và làm theo hướng dẫn để tạo bot của bạn. Nhập name và username.

Telegram BotFather Tạo một Bot mới
Hình 5: tạo bot trên telegram

Nếu bot của bạn được tạo thành công, bạn sẽ nhận được một thông báo có liên kết để truy cập vào bot kèm theo bot token . Lưu bot token vì bạn sẽ cần nó để ESP32/ESP8266 có thể tương tác với bot.

Telegram BotFather Get Bot Token
Hình 6: bot token

Lấy Telegram User ID của bạn

Bất kỳ ai biết tên username bot của bạn đều có thể tương tác với nó. Để đảm bảo rằng chúng tôi bỏ qua các tin nhắn không phải từ tài khoản Telegram của chúng tôi (hoặc bất kỳ người dùng được ủy quyền nào), bạn có thể lấy ID người dùng Telegram của mình. Sau đó, khi bot telegram của bạn nhận được tin nhắn, ESP có thể kiểm tra xem ID người gửi có tương ứng với ID người dùng của bạn hay không và xử lý hoặc bỏ qua tin nhắn đó.

Trong tài khoản Telegram của bạn, hãy tìm kiếm “IDBot” hoặc mở liên kết t.me/myidbot này trong điện thoại thông minh của bạn.

Telegram Get Chat ID with IDBot
Hình 8: IDBot

Bắt đầu cuộc trò chuyện với bot đó và gõ  /getid . Bạn sẽ nhận được phản hồi với user ID của mình. Lưu user ID đó, vì bạn sẽ cần nó ở phần sau trong hướng dẫn này.

Telegram Get Chat ID with IDBot getid
Hình 9: get user ID

Chuẩn bị Arduino IDE

Chúng tôi sẽ lập trình các  bo mạch ESP32 và ESP8266 bằng Arduino IDE, vì vậy hãy đảm bảo rằng bạn đã cài đặt chúng trong IDE Arduino của mình.

Thư viện Universal Telegram Bot

Để tương tác với bot Telegram, chúng tôi sẽ sử dụng Universal Telegram Bot Library do Brian Lough tạo ra để cung cấp giao diện dễ dàng cho Telegram Bot API.

Làm theo các bước tiếp theo để cài đặt bản phát hành mới nhất của thư viện.

  1. Nhấp vào đây để tải xuống thư viện Universal Arduino Telegram Bot .
  2. Đến Sketch Include Library > Add.ZIP Library...
  3. Thêm thư viện bạn vừa tải xuống.

Thư viện ArduinoJson

Bạn cũng phải cài đặt thư viện ArduinoJson . Làm theo các bước tiếp theo để cài đặt thư viện.

  1. Đi tới Skech Include Library > Manage Libraries.
  2. Tìm kiếm “ArduinoJson”.
  3. Cài đặt thư viện.
Hình 10: thêm thư viện ArduinoJson

Chuẩn bị phần cứng

Đối với ví dụ này, chúng tôi sẽ điều khiển các đèn LED trên bo mạch của ESP:

Điều khiển đầu ra bằng Telegram-ESP32/ESP8266 Sketch

Đoạn mã sau cho phép bạn điều khiển các GPIO NodeMCU ESP32 hoặc ESP8266 của mình bằng cách gửi tin nhắn tới Telegram Bot. Để làm cho nó hoạt động cho bạn, bạn cần phải chèn thông tin đăng nhập mạng (SSID và mật khẩu), token Bot Telegram và user ID Telegram của bạn.

/*
  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"

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
    client.setInsecure();
  #endif

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
  
  // Connect to Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  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();
  }
}

Code tương thích với các bo mạch ESP32 và ESP8266 NodeMCU

How the Code Works?

Bắt đầu bằng cách nhập các thư viện cần thiết:

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>

Thông tin đăng nhập mạng:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Xác định chân output:

Đặt GPIO bạn muốn điều khiển. Trong trường hợp của chúng tôi, chúng tôi sẽ điều khiển GPIO2 (đèn LED tích hợp) và trạng thái của nó là LOW theo mặc định.

const int ledPin = 2;
bool ledState = LOW;

Lưu ý: nếu bạn đang sử dụng ESP8266, đèn LED tích hợp hoạt động với logic đảo ngược. Vì vậy, bạn nên gửi một tín hiệu LOW để bật đèn LED và HIGH để tắt nó đi.

Telegram Bot Token:

Chèn Telegram Bot Token của bạn mà bạn có từ Botfather:

#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  // your Bot Token (Get from Botfather)

Telegram User ID:

#define CHAT_ID "XXXXXXXXXX"

Tạo WiFi client mới với WiFiClientSecure.

WiFiClientSecure client;

Tạo một bot với token và client được xác định trước đó.

UniversalTelegramBot bot(BOTtoken, client);

Các botRequestDelay và lastTimeBotRanđược sử dụng để kiểm tra các tin nhắn Telegram mới sau mỗi x giây. Trong trường hợp này, mã sẽ kiểm tra các tin nhắn mới mỗi giây (1000 mili giây). Bạn có thể thay đổi thời gian delay đó trong botRequestDelay.

int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

handleNewMessages ()

Hàm handleNewMessages() xử lý những gì sẽ xảy ra khi có tin nhắn mới.

void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

Nó kiểm tra các tin nhắn có sẵn:

for (int i=0; i<numNewMessages; i++) {

Nhận chat ID cho tin nhắn cụ thể đó và lưu trữ trong chat_id. chat ID cho phép chúng tôi xác định ai đã gửi tin nhắn điều khiển ESP32/ESP8266 qua Telegram

String chat_id = String(bot.messages[i].chat_id);

Khi chat_id khác với chat ID của bạn (CHAT_ID), có nghĩa là ai đó (không phải là bạn) đã gửi tin nhắn đến bot của bạn. Nếu đúng như vậy, hãy bỏ qua tin nhắn và đợi tin nhắn tiếp theo.

if (chat_id != CHAT_ID) {
  bot.sendMessage(chat_id, "Unauthorized user", "");
  continue;
}

Nếu không, điều đó có nghĩa là tin nhắn được gửi từ một người dùng hợp lệ. Vì vậy chúng tôi sẽ lưu nó trong biến text và kiểm tra nội dung của nó.

String text = bot.messages[i].text;
Serial.println(text);

from_name variable sẽ lưu các tên người gửi.

String from_name = bot.messages[i].from_name;

Nếu nó nhận được thông báo /start , chúng tôi sẽ gửi các lệnh hợp lệ để điều khiển ESP32/ESP8266. Điều này rất hữu ích nếu bạn tình cờ quên các lệnh điều khiển ESP32/ESP8266 qua Telegram.

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, "");
}

Gửi tin nhắn đến bot rất đơn giản. Bạn chỉ cần sử dụng phương thức sendMessage().

bool sendMessage(String chat_id, String text, String parse_mode = "")

Trong ví dụ cụ thể của chúng tôi, chúng tôi sẽ gửi thông báo đến ID được lưu trữ trên biến chat_id (tương ứng với người đã gửi tin nhắn) và gửi tin nhắn được lưu trên welcome variable.

bot.sendMessage(chat_id, welcome, "");

Trong trường hợp nhận được thông báo /led_on, bật đèn LED và gửi tin nhắn xác nhận rằng chúng tôi đã nhận được tin nhắn. Ngoài ra, hãy cập nhật biến ledState với trạng thái mới.

if (text == "/led_on") {
  bot.sendMessage(chat_id, "LED state set to ON", "");
  ledState = HIGH;
  digitalWrite(ledPin, ledState);
}

Làm điều gì đó tương tự cho thông báo /led_off.

if (text == "/led_off") {
  bot.sendMessage(chat_id, "LED state set to OFF", "");
  ledState = LOW;
  digitalWrite(ledPin, ledState);
}

Cuối cùng, nếu tin nhắn nhận được là /state, hãy kiểm tra trạng thái GPIO hiện tại và gửi tin nhắn tương ứng.

if (text == "/state") {
  if (digitalRead(ledPin)){
    bot.sendMessage(chat_id, "LED is ON", "");
  }
  else{
    bot.sendMessage(chat_id, "LED is OFF", "");
  }
}

setup()

Trong hàm setup(), khởi tạo Serial Monitor.

Serial.begin(115200);

Đặt đèn LED làm OUTPUT và đặt nó thành LOW khi ESP khởi động lần đầu:

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);

Init Wi-Fi

Khởi tạo Wi-Fi và kết nối ESP với mạng cục bộ của bạn bằng SSID và mật khẩu.

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi..");
}

loop()

bên trong loop(), kiểm tra các tin nhắn mới mỗi giây.

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();
  }
}

Khi có tin nhắn mới, hãy gọi hàm handleNewMessages().

while(numNewMessages) {
  Serial.println("got response");
  handleNewMessages(numNewMessages);
  numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}

Hoàn thành

Tải code lên board ESP32 hoặc ESP8266 của bạn. Đừng quên vào Tools Board  và chọn board bạn đang sử dụng. Đi tới Tools Port và chọn cổng COM mà bo mạch của bạn được kết nối.

Sau khi nạp code, nhấn nút EN/RST trên bo mạch để nó bắt đầu chạy. Sau đó, bạn có thể mở Serial Monitor để kiểm tra những gì đang xảy ra.

Truy cập tài khoản Telegram của bạn và mở cuộc trò chuyện với bot của bạn. Gửi các lệnh sau và xem bot phản hồi:

  • /start hiển thị thông báo chào mừng với các lệnh hợp lệ.
  • /led_on bật đèn LED.
  • /led_off tắt đèn LED.
  • /state yêu cầu trạng thái LED hiện tại.
Control ESP32 ESP8266 Outputs Telegram
Hình 11: Điều khiển led với telegram và esp

Đèn LED trên bo mạch sẽ bật và tắt tương ứng:

Bo mạch ESP32 Tích hợp đèn LED được bật CAO
Hình 12: Điều khiển led trên ESP

Đồng thời trên Serial Monitor, bạn sẽ thấy rằng ESP đang nhận tin nhắn.

Điều khiển ESP32 ESP8266 Đầu ra Trình diễn theo dõi nối tiếp Telegram
Hình 13: Kiểm tra serial

Nếu bạn cố gắng tương tác với bot của mình từ một tài khoản khác, bạn sẽ nhận được thông báo “Unauthorized user“.

Kết thúc

Trong hướng dẫn này, bạn đã học cách điều khiển ESP32/ESP8266 qua Telegram. Với bot này, bạn có thể sử dụng tài khoản Telegram của mình để gửi tin nhắn tới ESP và kiểm soát output của nó. ESP cũng có thể tương tác với bot để gửi phản hồi. Bạn có thể kết hợp thêm việc đọc cảm biến và điều khiển nhiều GPIO để cải thiện dự án, tăng tính ứng dụng.

Tham khảo thêm: ESP8266/ESP32 đọc cảm biến DHT11 và gửi về Server

You may also like

Leave a Comment