텔레그램에서 ESP32로 명령을 내려 LED를 On/Off 해보겠습니다.
텔레그램에서는 명령어와 일반 메시지를 구분하기 위해서
명령어는 '/'로 시작을 합니다. 예를들어 채팅방에서 시작 버튼을
누르면 /start 라는 명령어가 자동으로 전송됩니다.
문자열 앞에 슬래시를 붙이면 클릭할 수 있고 클릭된 문자열이
자동으로 전송됩니다.
그러나, 문자열을 입력해서 제어하기 보다는 키패드 처럼 버튼을
만들어서 제어를 해보겠습니다.
텔레그램 챗봇과 아이디를 만들고 메시지 보내는 강좌는 아래를 참고 하세요.
https://jooduino.tistory.com/23
ESP32 텔레그램으로 메시지 보내기
ESP32에서 텔레그램으로 메시지를 보내 보겠습니다. 우리는 여러종류의 SNS를 사용합니다. 카카오톡, 텔레그램, 페이스북, LINE 등등... 그 중에 카카오톡을 사용하려고 했지만 사용 방법이 너무 까
jooduino.tistory.com
전체 소스코드
#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를 제어 한다면 원거리에서도 인터넷만 된다면 가능합니다.
회사에서 집에 있는 전등을 제어할 수 있습니다.
'ESP32 > 펌웨어' 카테고리의 다른 글
ESP32-CAM 웹서버 스트림 (0) | 2023.10.23 |
---|---|
ESP32-CAM 텔레그램에 이미지 전송 (0) | 2023.10.22 |
ESP32 텔레그램으로 메시지 보내기 (0) | 2023.10.16 |
아두이노 JSON 사용하기 (0) | 2023.10.09 |
ESP32 공유기 없이 통신 (1:1, 1:N) ESP-NOW (0) | 2023.10.08 |