Esp8266 Gömülü Sistemler Proje

Telegram Botu İle ESP8266 Kontrol Etmek

  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ı

ESP8266 ve Telegram Bot kullanarak Ev Otomasyonu - Devre Şeması
ESP8266 ve Telegram Bot kullanarak Led Yakma – 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. 

Telegram_BotBabası
Telegram_BotBabası

Aşağıdaki pencere açılmalı ve  start düğmesine tıklamanız istenecektir.

Telegram Yeni bir Bot Oluşturmak için BotFather'ı Başlatın

/newbot yazın ve  botunuzu  oluşturmak için talimatları izleyin. Bir ad ve kullanıcı adı verin

Telegram BotFather Yeni Bir Bot Oluştur

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 BotFather Bot Jetonunu Al

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.

  1. TaslakLibrary Ekle > Kütüphaneleri Yönet seçeneğine gidin .
  2. “ArduinoJson” arayın.
  3. 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:

https://youtu.be/6fWS57wFEhw

Kaynak: https://electrosome.com/led-control-esp8266-telegram-bot/
https://randomnerdtutorials.com/telegram-control-esp32-esp8266-nodemcu-outputs/#demonstration

Similar Posts

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir