Bu projede Esp8266’ya bağlı bir LED’i Telegram botu ile kontrol edeceğiz. Telegram, Whatsapp benzeri bir mesajlaşma uygulamasıdır. Bu, kullanıcıların Telegram’da komutları yazarak ve göndererek ESP8266’larını kontrol etmelerini sağlar. Bazı röleler veya TRIAC ekleyerek bunu bir ev otomasyon projesi yapabilirsiniz.
Gerekli Bileşenler
- ESP8266
- Led
- 470Ω Direnç
- Breadboard
- USB kablosu
- Bağlantı kablosu
Donanım
Devre şeması
Telegram Botu
Botlar, Telegram içinde çalışan üçüncü taraf uygulamalarıdır. Kullanıcılar, mesajlar, komutlar ve satır içi istekler göndererek botlarla etkileşime girebilir. Botlarımızı Telegram tarafından sağlanan HTTP API’leri aracılığıyla kontrol edebiliyoruz.
Telegram botu, Telegram Messenger istemcilerine bağlanmak için Telegram bot API’sini kullanan bir sunucuyu(ESP8266) barındırılan bir uygulamadır . Telegram botlarının büyük bir avantajı, sıfır kurulum gereksinimlerine sahip olmaları ve Telegram Messenger’ın çalıştığı tüm bilgisayar veya mobil platformlarda sorunsuz bir şekilde çalışmasıdır.
Telegram Botunu Oluştur
Telegram’ı Dizüstü Bilgisayarınıza veya Telefonunuza yükleyin ve BotFather’ı arayın. Veya akıllı telefonunuzda bu t.me/botfather bağlantısını açın.
Aşağıdaki pencere açılmalı ve start düğmesine tıklamanız istenecektir.
/newbot yazın ve botunuzu oluşturmak için talimatları izleyin. Bir ad ve kullanıcı adı verin
BotFather aracılığıyla yeni bir bot oluşturabiliriz. Yeni bir bot oluşturduktan sonra, cihaz ile Telegram bot API arasındaki etkileşim anahtarı olan token verecektir . Bunu mutlaka bir yere not etmemiz gerekiyor. Çünkü ESP32/ESP8266’nın bot ile etkileşime girebilmesi için ihtiyacınız olacak.
Telegram Botundan ID numaranızı alın
Bot isminizi bilen herkes onunla iletişim kurabilir. Bunun önüne geçmek için Telegramın IDBot botundan ID numaranızı öğrenin ve bir yere kaydedin. Programlarken kullanacağız.
Telegramdan IDBot’u arıyorsunuz ve onunla etkileşime geçiyorsunuz.
ID numaranızı /start ve /getid komutları ile alıyorsunuz.
Arduino için Telegram Bot Kütüphanesi
- Universal Telegram Bot kitaplığını indirin .
- Arduino IDE’yi açın, “Sketch”e gidin, “Include Library”yi seçin ve “Add .ZIP Library”ye tıklayın. İndirdiğiniz kütüphaneyi bulup ekleyin.
ArduinoJson Kütüphanesi
Ayrıca ArduinoJson kütüphanesini de kurmanız gerekiyor. Kitaplığı kurmak için sonraki adımları izleyin.
- Taslak> Library Ekle > Kütüphaneleri Yönet seçeneğine gidin .
- “ArduinoJson” arayın.
- Kütüphaneyi kurun.
ArduinoJson kütüphanesinin 6.15.2 sürümünü kullanıyoruz.
Program ESP8266/ESP32
Aşağıdaki kod, bir Telegram Botuna mesaj göndererek ESP32 veya ESP8266 NodeMCU GPIO’larınızı kontrol etmenizi sağlar. Kodu çalıştırmadan önce, ağ kimlik bilgilerinizi (SSID ve şifre), Telegram Bot Token ve Telegram ID numaranızı girmenizi unutmayın gerekir.
/*
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"
#ifdef ESP8266
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
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
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
#endif
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
#ifdef ESP32
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
#endif
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();
}
}
Kodlarla ilgili Açıklamalar
Ağ kimlik bilgilerinizi aşağıdaki değişkenlere ekleyin.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Kontrol etmek istediğiniz GPIO’yu ayarlayın. Bizim durumumuzda, GPIO 2’yi (yerleşik LED) kontrol edeceğiz ve başlarken sönük kalmasını istediğimiz için, Ledin varsayılan durumunu düşük LOW olarak ayarladık.;
NOT: ESP8266 kullananlar 2 yazdığımız pin GPIO numarasıdır. Ve ESP8266 kartında D4’e karşılık gelir. Donanımınızı buna göre yapmalısınız. Detaylı Bilgi
const int ledPin = 2;
bool ledState = LOW;
Telegram Bot Token
Botfather’dan aldığınız Telegram Bot Token ı buraya yapıştırın.
#define BOTtoken "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // your Bot Token (Get from Botfather)
Telegram ID
IDBot’tan aldığınız Sohbet kimliğinizi girin.
#define CHAT_ID "XXXXXXXXXX"
bubotRequestDelay ve lastTimeBotRanher x saniyede bir yeni Telegram mesajlarını kontrol etmek için kullanılır. Bu durumda, kod her saniye (1000 milisaniye) yeni mesajları kontrol edecektir. Bu gecikme süresini şuradan değiştirebilirsiniz : botRequestDelaydeğişken.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
handleNewMessages()
handleNewMessages işlevi, yeni iletiler geldiğinde ne olacağını yönetir.
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
Eğer Chat ID kimliğinizden farklı birisi botunuza bir mesaj gönderdiğinde, Botun vereceği cevap buraya ayarlanır
if (chat_id != CHAT_ID) {
bot.sendMessage(chat_id, "Unauthorized user", "");
continue;
}
Bota Mesaj Geldiğinde Verilecek Cevapları Ayarla
/start mesajını alındığında, ESP32/ESP8266’yı kontrol etmek için geçerli komutların anlatıldığı kısımdır. Tırkak işareti arasında kalan açıklamaları dilediğiniz gibi değiştirebilirsiniz.
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, "");
}
Bota verilecek Komutları Ayarla
/led_on mesajını alırsa yapılacaklar burada listelenir.
if (text == "/led_on") {
bot.sendMessage(chat_id, "LED state set to ON", "");
ledState = HIGH;
digitalWrite(ledPin, ledState);
}
/led_off mesajı için benzer bir yapı
if (text == "/led_off") {
bot.sendMessage(chat_id, "LED state set to OFF", "");
ledState = LOW;
digitalWrite(ledPin, ledState);
}
Son olarak, alınan mesaj /state ise , mevcut GPIO durumunu kontrol et ve buna göre bir mesaj gönder.
if (text == "/state") {
if (digitalRead(ledPin)){
bot.sendMessage(chat_id, "LED is ON", "");
}
else{
bot.sendMessage(chat_id, "LED is OFF", "");
}
}
Kodun işleyişi aşağı yukarı bu şekilde.
Kaynak:
Kaynak: https://electrosome.com/led-control-esp8266-telegram-bot/
https://randomnerdtutorials.com/telegram-control-esp32-esp8266-nodemcu-outputs/#demonstration