Cách dùng ESP32 Telegram điều khiển đèn LED với Arduino IDE

Trong chủ đề ESP32 Telegram này, chúng ta sẽ tìm hiểu cách điều khiển đầu ra của ESP32 (hoặc của ESP8266) thông qua ứng dụng Telegram. Đây là một ứng dụng nhắn tin trên Internet đa nền tảng, miễn phí và được dùng để gửi tin nhắn, hình ảnh và video với nhau.

Chúng ta có thể tận dụng Telegram để điều khiển mọi thiết bị AC thông qua Internet, với cách tương tác cực kỳ đơn giản. Trong dự án này, chúng ta chỉ cần có điện thoại, laptop, máy tính bảng,… có cài đặt ứng dụng Telegram và có kết nối Internet ổn định.

Bài viết này cung cấp cho bạn hướng dẫn cơ bản để khai thác tốt hơn các tiềm năng của mạch lập trình ESP32, ESP8266 và ứng dụng tốt hơn vào các dự án ESP32 IoT.

Hướng dẫn điều khiển LED qua ESP32 Telegram
Hướng dẫn điều khiển LED qua ESP32 Telegram

Trong hướng dẫn này, IoTZone sẽ hướng dẫn đơn giản hóa cách điều khiển đèn LED thông qua ESP32 Telegram, với Arduino IDE. Cụ thể, chúng ta sẽ gửi tin nhắn từ Bot Telegram đến ESP32 / ESP8266 để bật tắt đèn LED. Sau khi hoàn thành dự án này, bạn có thể dễ dàng điều khiển Relay bằng ESP32 Telegram, nhằm điều khiển các thiết bị gia dụng khác.

Giới thiệu Telegram

Telegram là một công cụ nhắn tin trực tuyến, cho phép bạn gửi tin nhắn, hình ảnh hoặc thực hiện cuộc gọi video. Chúng ta có thể cài đặt ứng dụng này trên mọi hệ điều hành phổ biến như macOS, Windows, Android hoặc iOS. Bạn cũng có thể tận dụng tính năng dành cho nhà phát triển bên thứ ba để tạo bot.

Chúng ta có thể thiết lập các bot này một cách dễ dàng và thực thi lệnh thông qua việc nhắn tin. Chúng ta cũng có thể cấu hình các nhóm khác nhau và giao tiếp với các phần mềm để kích hoạt một sự kiện nào đó.

Trong hướng dẫn này, chúng ta sẽ dùng ESP32 / ESP8266 để tương tác với bot. Chúng sẽ nhận tin nhắn và xử lý, gửi phản hồi phù hợp về cho người dùng.

Tổng quan dự án ESP32 Telegram

Với dự án điều khiển đèn LED trên ESP32 / ESP8266 này, đầu tiên chúng ta cần cài đặt phần mềm Telegram trên máy tính, điện thoại của mình. Trong phạm vi bài hướng dẫn, chúng ta sẽ cài trên điện thoại.

Sau đó, chúng ta sẽ cài Bot Telegram cho mạch ESP32 và dùng code để chúng liên lạc với nhau.

Khi cần điều khiển đèn LED, chúng ta sẽ gửi tin nhắn đến Bot. Bot sẽ nhận tin nhắn và xử lý, thực thi lệnh đã được gửi:

Tổng quan dự án ESP32 Telegram
Tổng quan dự án ESP32 Telegram

Dưới đây là các lệnh và ý nghĩa từng câu lệnh:

  • /led2_on: Bật đèn LED
  • /led2_off: Tắt đèn LED
  • /get_state: Gửi trạng thái đèn LED hiện tại (Tắt hoặc Bật) tới Bot Telegram
  • /start: Hiển thị lời tin nhắn chào mừng và các lệnh điều khiển ESP32 kèm ý nghĩa cho người dùng

Cài đặt và cấu hình Telegram

Cài đặt Telegram

Chúng ta sẽ dùng điện thoại Android để minh họa dự án này. Bạn hãy vào Google Play (với Android) hoặc App Store (với iOS):

Cài Telegram trên điện thoại

Cài đặt ứng dụng có tên Telegram:

Cài app cho dự án ESP32 Telegram

Sau khi cài đặt xong, bạn mở ứng dụng và click vào nút Start Messaging. Nếu chưa có tài khoản, bạn nhấn vào đăng ký tài khoản, với thông tin bao gồm:

  • Tên quốc gia: Việt Nam
  • Mã SDT quốc gia: +84

Tạo Bot Telegram

Sau khi đăng ký xong tài khoản, một giao diện mới sẽ xuất hiện. Bạn nhấn vào nút tìm kiếm ở góc trên bên phải, tìm kiếm từ khóa “BotFather”:

Tìm kiếm Bot Father trong Telegram
Tìm kiếm Bot Father trong Telegram

Click vào mục có tick xanh như hình:

Tải BotFather cho dự án ESP32 Telegram
Tải BotFather cho dự án ESP32 Telegram

Tại giao diện mới, bạn click vào Start để tiếp tục. Sau đó, bạn gõ /newbot và gửi tin nhắn đến Bot, việc này giúp tạo ra một Bot mới. Chúng ta sẽ dùng Bot này trong dự án ESP32 Telegram này:

Tải BotFather cho dự án ESP32 Telegram

Tiếp theo, chúng ta cần gọi tên người dùng cho Bot vừa tạo. Bạn có thể chọn bất kỳ tên nào bạn muốn, tuy nhiên chúng ta đôi khi phải thử nhiều tên liên tục cho đến khi chọn được tên hợp lệ.

Lưu ý: Bạn cần đảm bảo giữ an toàn cho tên người dùng của mình, vì bất kỳ ai cũng có thể truy cập vào Bot của bạn thông qua tên này.

Tải BotFather cho dự án ESP32 Telegram

Sau khi chọn được tên người dùng hợp lệ (không bị trùng với ai khác), trên màn hình sẽ hiển thị tin nhắn chúc mừng. Trong tin nhắn sẽ có kèm một URL, đây là đường link để bạn truy cập vào Bot của mình. Ngoài ra, trong tin nhắn cũng có mã thông báo Bot, đây là dòng mã dùng để tương tác giữa ESP32 và Bot Telegram.

ID người dùng Telegram

Bước tiếp theo trong dự án ESP32 Telegram Bot này là thiết lập ID người dùng. Việc này giúp lọc bớt các tin nhắn không cần thiết mà chúng ta không gửi, hoặc các tin nhắn rác không được gửi bởi người ủy quyền.

Nhìn chung, ID người dùng là một địa chỉ duy nhất cho người dùng, giúp ESP32 xác định tin nhắn được gửi tới là bởi chúng ta hay một người xa lạ nào khác đang truy cập vào Bot.

Để thực hiện, bạn mở Telegram và nhấn nút tìm kiếm, tìm từ khóa IDBot rồi nhấn Enter:

Cài ID người dùng cho dự án ESP32 Telegram
Cài ID người dùng cho dự án ESP32 Telegram

Một cửa sổ như hình dưới sẽ được mở. Bạn hãy gửi lệnh /getid để nhận được ID người dùng cho mình.

Cài đặt thư viện trên Arduino IDE

Đầu tiên, để lập trình ESP32 với Arduino, bạn cần đảm bảo rằng mình đã cài tiện ích ESP32 trên máy. Nếu chưa cài đặt, bạn có thể tham khảo và là theo hướng dẫn cài ESP32 trên Arduino.

Trong phạm vi dự án ESP32 Telegram Bot này, chúng ta sẽ dùng 2 thư viện:

Universal Telegram Bot

  1. Bạn click vào đường link mình đã gắn bên trên, tải file zip về.
  2. Mở Arduino, click vào Sketch > Include Library > Add .zip Library và thêm thư viện
  3. Khởi động lại Arduino IDE

Chúng ta không cài thư viện này trực tiếp từ trình quản lý thư viện, để tránh các vấn đề như xung đột giữa các phiên bản cũ hơn.

ArduinoJson

Bạn click vào Sketch > Include Library > Manage Libraries, tìm kiếm từ khóa ArduinoJsonvà cài đặt thư viện được phát triển bởi Benoit Blanchon.

Code mẫu cho dự án ESP32 Telegram

Đoạn code dưới đây phù hợp để dùng cho mạch ESP32 lẫn ESP8266 khi điều khiển LED bằng Telegram, bạn chỉ cần thay đổi thông tin mạng WiFi, mã thông báo Bot và ID người dùng bằng giá trị riêng của bạn và nạp code là được:

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

// Thay đổi mạng WiFi của bạn
const char* ssid = "PTCL-BB";
const char* password = "********";

// Khai báo Bot Telegram
#define BOTtoken "**********:***********************************"  // Thay thế thành Bot token của bạn

#define CHAT_ID "**********"  //Thay thế thành ID người dùng của bạn

#ifdef ESP8266
  X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

// Kiểm tra có tin nhắn mới hay không liên tục sau mỗi 1 giây
int bot_delay = 1000;
unsigned long lastTimeBotRan;

const int ledPin = 2;
bool ledState = LOW;

// Thực thi lệnh khi có tin nhắn mới
void handleNewMessages(int numNewMessages) {
  Serial.println("Handling New Message");
  Serial.println(String(numNewMessages));

  for (int i=0; i<numNewMessages; i++) {
    // Chat ID của yêu cầu
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID){
      bot.sendMessage(chat_id, "Unauthorized user", "");
      continue;
    }
    
    // In ra tin nhắn nhận được
    String user_text = bot.messages[i].text;
    Serial.println(user_text);

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

    if (user_text == "/start") {
      String welcome = "Welcome, " + your_name + ".\n";
      welcome += "Use the following commands to control your outputs.\n\n";
      welcome += "Send /led2_on to turn GPIO2 ON \n";
      welcome += "Send /led2_off to turn GPIO2 OFF \n";
      welcome += "Send /get_state to request current GPIO state \n";
      bot.sendMessage(chat_id, welcome, "");
    }

    if (user_text == "/led2_on") {
      bot.sendMessage(chat_id, "LED state set to ON", "");
      ledState = HIGH;
      digitalWrite(ledPin, ledState);
    }
    
    if (user_text == "/led2_off") {
      bot.sendMessage(chat_id, "LED state is set to OFF", "");
      ledState = LOW;
      digitalWrite(ledPin, ledState);
    }
    
    if (user_text == "/get_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
    configTime(0, 0, "pool.ntp.org");      // Nhận thời gian thực UTC qua NTP
    client.setTrustAnchors(&cert); // Thêm chứng nhận root cho api.telegram.org
  #endif

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
  
  // Kết nối WiFi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  #ifdef ESP32
    client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Thêm chứng nhận root cho api.telegram.org
  #endif
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  // In địa chỉ IP Local của ESP32
  Serial.println(WiFi.localIP());
}

void loop() {
  if (millis() > lastTimeBotRan + bot_delay)  {
    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();
  }
}

Demo dự án ESP32 Telegram

Bạn hãy chọn đúng cổng COM và board mạch, sau đó nạp code vào mạch ESP32 hoặc ESP8266 đang dùng.

Sau khi nạp code xong, bạn nhấn nút Enable (Reset) trên mạch ESP32 / ESP8266.

Bạn hãy mở màn hình Serial Monitor trên Arduino, trên đó sẽ hiển thị đại chỉ IP của mạch ESP32 / ESP8266 mà bạn đang dùng. Ở đây cũng sẽ hiển thị tất cả các thông tin kết nối Internet hoặc việc nhận lệnh từ Bot Telegram.

Bây giờ, bạn hãy mở Telegram trên điện thoại, mở BotFather và nhấn vào liên kết đã nhận lúc nãy để truy cập vào Bot:

Demo dự án ESP32 Telegram

Bạn nhập /start và gửi tin nhắn này đến Bot vừa tạo. Trên màn hình sẽ hiển thị một dòng thông báo chào mừng và các câu lệnh, kèm ý nghĩa của chúng. Bạn có thể nhập lần lượt các lệnh và xem kết quả:

  • Gửi /led2_on: Bật LED được kết nối với GPIO2
  • Gửi /led2_off: Tắt LED được kết nối với GPIO2
  • Gửi /get_state: Yêu cầu gửi trạng thái GPIO hiện tại

Sau khi gửi mỗi lệnh, Bot Telegram sẽ gửi lại phản hồi tương ứng.

Trên màn hình Serial của Arduino IDE cũng liên tục gửi ra các bản cập nhật, sau khi mỗi lệnh được thực thi:

Serial Monitor hiển thị kết quả dự án ESP32 Telegram
Serial Monitor hiển thị kết quả dự án ESP32 Telegram

Ngoài ra, đèn LED trên mạch ESP32 / ESP8266 cũng sẽ bật tắt tương ứng, tùy theo lệnh mà chúng ta gửi đi:

Demo dự án ESP32 Telegram

Lời kết

Vậy là qua bài hướng dẫn trên, chúng ta đã tìm hiểu cách dùng ESP32 Telegram để điều khiển các chân đầu ra. Bạn có thể áp dụng hướng dẫn này với ESP8266 vẫn được.

Ngoài ra, bạn có thể phát triển dự án này nâng cao hơn, như yêu cầu dữ liệu từ cảm biến, ghi hình ảnh từ ESP32 CAM hoặc nhiều ứng dụng khác.

IoTZone cũng cung cấp sẵn một số bài hướng dẫn khác về ESP32, bạn có thể tham khảo:

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *