본문 바로가기
  • 재미있는 펌웨어와 코딩
ESP32/펌웨어

ESP32 텔레그램 수신

by 윤재윤호 2023. 10. 18.

텔레그램에서 ESP32로 명령을 내려 LED를 On/Off 해보겠습니다.

텔레그램에서는 명령어와 일반 메시지를 구분하기 위해서

명령어는 '/'로 시작을 합니다. 예를들어  채팅방에서 시작 버튼을

누르면 /start 라는 명령어가 자동으로 전송됩니다.

문자열 앞에 슬래시를 붙이면 클릭할 수 있고 클릭된 문자열이

자동으로 전송됩니다.

그러나, 문자열을 입력해서 제어하기 보다는 키패드 처럼 버튼을

만들어서 제어를 해보겠습니다.

 

텔레그램 챗봇과 아이디를 만들고 메시지 보내는 강좌는 아래를 참고 하세요.

https://jooduino.tistory.com/23

 

ESP32 텔레그램으로 메시지 보내기

ESP32에서 텔레그램으로 메시지를 보내 보겠습니다. 우리는 여러종류의 SNS를 사용합니다. 카카오톡, 텔레그램, 페이스북, LINE 등등... 그 중에 카카오톡을 사용하려고 했지만 사용 방법이 너무 까

jooduino.tistory.com

 

전체 소스코드

TelegramKeyboard.ino
0.00MB

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

#define BOT_TOKEN "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define CHAT_ID "XXXXXXXXXX"

WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

const unsigned long BOT_MTBS = 1000; // 메시지 검색 시간
const int LED = LED_BUILTIN;

unsigned long bot_lasttime; // 마지막으로 메시지 검색이 완료된 시간

void handleNewMessages(int numNewMessages) {
  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    if (text == "LED ON")
    {
      digitalWrite(LED, HIGH);
      bot.sendMessage(chat_id, "LED를 ON 했습니다.", "");
    }

    if (text == "LED OFF")
    {
      digitalWrite(LED, LOW);
      bot.sendMessage(chat_id, "LED를 OFF 했습니다.", "");
    }
    if (text == "/start") SendKeyboard();
  }
}

// 텔레그램에 LED on/off 버튼 만들기
void SendKeyboard() {
  String keyboardJson = "[[\"LED ON\", \"LED OFF\"]]";
  bot.sendMessageWithReplyKeyboard(CHAT_ID, "LED 제어", "", keyboardJson, true);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  // 와이파이가 연결될 때까지 기다린다.
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.printf("WiFi Failed!\n");
    return;
  }

  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // api.telegram.org 에 대한 루트 인증서 추가
  secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
}

void loop()
{
  if(millis() - bot_lasttime > BOT_MTBS) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

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

    bot_lasttime = millis();
  }
}

 

소스코드를 업로드 하여 실행하면 텔레그램에 아래와 같이 LED를 제어할 수 있는 버튼이 만들어집니다.

이제는 키패드 처럼 버튼을 누르면 LED를 On/Off 할 수 있습니다.

 

소스코드 설명

텔레그램을 사용하기 위한 방법은 이전 강좌에 자세히 설명을 했기 때문에 생략 합니다.

LED는 ESP32 내부에 빌트인된 LED를 사용합니다.

 

텔레그램에 키패드와 같은 버튼을 만드는 예제 입니다.

// 텔레그램에 LED on/off 버튼 만들기
void SendKeyboard() {
  String keyboardJson = "[[\"LED ON\", \"LED OFF\"]]";
  bot.sendMessageWithReplyKeyboard(CHAT_ID, "LED 제어", "", keyboardJson, true);
}

 

수신된 텔레그램 메시지를 분석하여 LED를 제어합니다.

void handleNewMessages(int numNewMessages) {
  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    if (text == "LED ON")
    {
      digitalWrite(LED, HIGH);
      bot.sendMessage(chat_id, "LED를 ON 했습니다.", "");
    }

    if (text == "LED OFF")
    {
      digitalWrite(LED, LOW);
      bot.sendMessage(chat_id, "LED를 OFF 했습니다.", "");
    }
    if (text == "/start") SendKeyboard();
  }
}

 

일정 시간마다 텔레그램의 메시지가 있는지 확인합니다.

void loop()
{
  if(millis() - bot_lasttime > BOT_MTBS) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

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

    bot_lasttime = millis();
  }
}

 

인터럽트 방식으로 수신 메시지를 확인하는 방법이 아니라서 LED 동작 시간이 딜레이가 있습니다.

지금은 2개의 버튼만 만들었지만, 키보드 처럼 여러개의 버튼을 여러줄로 만들 수 있습니다.

void SendKeyboard() {
  String keyboardJson = "[[\"LED1 ON\", \"LED1 OFF\"],[\"LED2 ON\", \"LED2 OFF\"]]";
  bot.sendMessageWithReplyKeyboard(CHAT_ID, "LED 제어", "", keyboardJson, true);
}

 

텔래그램으로 ESP32를 제어 한다면 원거리에서도 인터넷만 된다면 가능합니다.

회사에서 집에 있는 전등을 제어할 수 있습니다.