Bildiğiniz üzere Discord gerek mesajlaşma, gerek oyuncular için sunduğu avantajlar dolayısıyla son dönemlerde çok popüler oldu. Biz ise bugün Discord’u bir kişi yerine Raspberry Pi ile mesajlamak için kullanacağız.

Proje ile igili dökümanlara buradan da ulaşabilirsiniz.

Raspberry Pi üzerinden bir Discord sunucusu ve botu oluşturacağız. Daha sonra ise sunucumuza gönderdiğimiz mesajları yorumlayarak, Raspberry Pi üzerindeki GPIO pinleri aracılığı ile bir ledi kontrol edeceğiz.

Öncelikle bize bu projede gerekli olan malzemelere bakalım.

Malzeme Listesi

Şimdi projemizi gerçekleştirebilmek için kısaca hangi adımları izlememiz gerektiğine karar verelim.

Projemizin Adımları

Öncelikle ledimizi Discord üzerinden kontrol edeceğimiz için bir Discord hesabına ihtiyacımız var. Daha sonra yönetici olarak bir tane Discord sunucusu ve Bot oluşturmalıyız ki gelen mesajları sunucu üzerinden çekebilelim.

Bot’umuzun ilk önce sunucuya gelen mesajları okuması gerekiyor ve eğer mesaj, kodun içinde tanımladığımız bir komutu (ör. !led1 gibi) barındırıyorsa Raspberry Pi’ ya bir takım işlemler yaptırmalıyız. 

Örneğin !led1 ve !led0 adında iki komutumuz olduğunu varsayalım. Sunucudan gelen komut !led1 ise  Raspberry Pi ledin bağlı oluğu GPIO pinine enerji vermeli. Ya da tam tersi sunucudan !led0 komutunun geldiğinde ilgili pine verilen enerji kesilmelidir.

Kısaca proje boyunca aşmamız gereken sorunlara değindik ve adım adım yapmamız gerekenlere göz atmış olduk. Şimdi bu problemleri detaylı bir şekilde inceleyelim.

Discord Sunucusundan Led Kontrol Etmek için Gerekli Yapılandırmalar

Discord Hesabını, Sunucuyu ve Bot’ u Oluşturmak

Eğer bir Discord hesabınız yoksa buradan indirip yeni bir hesap oluşturabilirsiniz. Hesap oluşturduktan sonra yapmamız gereken ilk şey yeni bir sunucu oluşturmak.

Sunucumuzu oluşturmak için resimde ünlem ile işaretlenmiş “+” ya basıyoruz. Daha sonra sunucumuza isim koyalım ve oluştur seçeneğine basalım. Sunucumuzu oluşturduğumuza göre şimdi bu sunucudan her türlü veriyi çekebilmek için bir Bot’a ihtiyacımız var.

Discord Bot’u oluşturmak için bu adrese gidip giriş yapalım. Önümüze gelen ekrandan sağ üstteki “New Application” seçeneğine tıklayıp oluşturacağımız API’ ye bir isim verelim. 

Daha sonra sol kısımdaki menüden “Bot” kısmına gelip “Add Bot” diyorum ve sunucumuz için oluşturduğumuz Bot’a isim veriyorum.

Oluşturduğumuz Bot’un “Token” adresini kopyalayalım ve bir yere kaydedelim. Çünkü Bot’umuzu kodlarken bu “Token” bize lazım olacak.

Şimdi ise sol kısımdaki menüden “OAuth” sekmesine gelip “Bot” ve “Administrator” kutucuklarını işaretliyoruz. 

Oluşan linki kopyalıyoruz ve tarayıcımıza yapıştırıp ilgili linke gidiyoruz. Karşımıza şöyle bir ekran geliyor.

Karşımıza çıkan ekranda oluşturduğumuz sunucunun ismini seçiyor ve Bot’umuzu sunucumuza ekliyoruz. Şimdi Discord hesabınıza giderek Bot’unuzun sunucunuza eklendiğini teyit edebilirsiniz.

Modülleri Eklemek

Raspberr Pi terminalindede sırasıyla aşağıdaki komutları çalıştıralım.

sudo apt update
sudo apt full-upgrade
sudo apt-get install libssl-dev
sudo apt-get install libffi-dev
sudo apt-get install libsqlite3-dev

Daha sonra Python sürümümüzü şu komutla kontrol edelim.

python3 --version

Eğer Python sürümünüz 3.5 veya üzeri ise devam edelim. Eğer değilse Python’un kendi sitesinden 3.5 veya daha yeni bir versiyonu kurmayı unutmayın. Şimdi Bot’muzu kontrol etmek için gerekli olan modülleri indirelim.

sudo apt install python3-pip
sudo apt install python3-cffi
sudo pip3 install discord.py[voice]
sudo python3 -m pip install -U discord.py[voice]

Bot’umuzu kontrol etmek için gerekli modülleri indirdik. Şimdi ise yeni bir klasör ve klasörün içinde de bir Python dosyası oluşturalım. İsterseniz klasör ve dosya ismini değiştirebilirsiniz.

mkdir ~/discord_bot
cd ~/discord_bot
touch bot.py

Daha sonra Raspian OS ile birlikte gelen “Geany IDE” ile oluşturduğum Python dosyasını açıyorum. İsterseniz siz “Python IDE” ya da “Thonny IDE” ile de açabilirsiniz. 

Sunucumuzu ve Bot’umuzu oluşturduk, modüllerimizi kurduk ve kod yazmak için gerekli dosyamızı oluşturduk. Sıra devremizi kurmaya geldi.

Raspberry Pi – Discord Sunucusundan Led Kontrol Devresi

Gördüğünüz gibi devremiz oldukça basit. Tek yapmamız gereken ledimizin katotunu GND hattına, anotunu ise 11.sıradaki GPIO17 pinine bağlamak.

Raspberry Pi – Discord Sunucusundan Led Kontrol Kodları

import discord
from discord.ext import commands
import RPi.GPIO as GPIO          #modüllerimizi ekledik

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)      
GPIO.setup(11, GPIO.OUT)       #11.sıradaki GPIO17 pinini OUTPUT olarak ayarladık

TOKEN = "kaydettiğimiz Bot Token adresini yapıştıralım"

description = '''Python Discord Bot'''
bot = commands.Bot(command_prefix='!', description=description)  
#ayırt edici simgemizi "!" (ünlem) olarak ayarladık. Yani komut girerken !komut şeklinde gireceğiz.

@bot.event
async def on_ready():         #Bot'umuz hazır ise ...
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')


@bot.command()
async def led1(ctx):               #eğer gelen veri "led1" ise... (ctx=contex=~bağlam)
    await ctx.send("led açıldı :bulb:")   #Bot'umuz bize geri dönüş yapsın ve...
    GPIO.output(11,1)             # GPIO17 lojik1 olsun 

@bot.command()
async def led0(ctx):                #eğer gelen veri "led0" ise..
    await ctx.send("led kapatıldı :bulb:")  #Bot'umuz bize geri dönüş yapsın ve...
    GPIO.output(11,0)           # GPIO17 lojik0 olsun 
    
@bot.command() 
async def sıcaklık(ctx):      #eğer gelen veri "sıcaklık" ise...
    temp=open("/sys/class/thermal/thermal_zone0/temp", "r")   
#Raspberry Pi için işlemci sıcaklığını saklayan dosyayı açtık

    temp= str(round((float(temp.readline())/1000),1))    
#Dosyanın içindeki sıcaklık verisini aldık ve str formatına çevirdik.
    
    await ctx.send("İşlemci sıcaklığı: "+ temp + " °C") #Sıcaklığı yazdırdık

#sıcaklığı öğrenmek istememizin sebebi Raspberry Pi uzun süre boyunca açık kalacak ve 
#sonuçta bir Bot "host"ladığı için ısınma ihtimali var 
    
@bot.command() 
async def yardım(ctx):   #tüm komutları görmek için "yardım" komutunu tanımladık
    await ctx.send(":card_box: Komut Listesi:\n:arrow_right: **led1** : ledi yakar \n:arrow_right:** led0** : ledi kapatır \n:arrow_right: **sıcaklık** : Raspberry Pi işlemci sıcaklığını gösterir")
    
bot.run(TOKEN)

Test Aşaması ve Sonuç

Kodumuz çalıştığında şöyle bir ekran ile karşılaşmamız gerek.

Ve Discord sunucumuzda komutlar yazdığımızda ekranımız buna benzer olacaktır.

Eğer sunucuya herhangi birini eklerseniz o kişinin de bu komutlarla Raspberry Pi üzerinde bir yetkiye sahip olabileceğini unutmayın. Projemizdeki led, devremizde olabilecek herhangi bir yükü temsil etmekteydi. Siz led yerine röle bağlayarak ışıklarınızı, perdenizi kısacası evinizdeki tüm elektrikli eşyaları kontrol edebilirsiniz. Ayrıca sunucuya aileden birini ekleyerek onların da kontrol etmesini sağlayabilirsiniz. Ya da sunucu içinde bir kanal oluşturup hem aile grubunuz üzerinden yazışabilir hem de aynı sunucu üzerinden ev otomasyonunuzu kontrol edebilirsiniz. 

Bir sunucu kullanmak bize bu işlemleri internet erişimi olan her yerden yapabilmek gibi bir artı da sağlıyor. Local’ de kalmak zorunda değilsiniz.

Proje ile İlgili Karşılaşabileceğiniz Sorunlar

1. Geany IDE’ de Derleme Hatası Alıyorum

  • Modüllerin kurulu olduğundan emin olun.
  • Projenizi Pyhton3 ile derlediğinizden emin olun. Kontrol etmek için Geany IDE -> Build -> Set Build Commands gelip Compile ve Execute kısımlarının karşısında yazan satırı sırasıyla python3 -m py_compile “%f” ve python3 “%f” olarak değiştirin.

2. Bot Cevap Vermiyor

  • Bot’unuzu doğru sunucuya eklediğinizden emin olun.
  • Bot’unuzun çevrimiçi kalması ve komutlara cevap verebilmesi için Python kodunun arkada her daim çalışması gerektiğini unutmayın.

Bir projemizin daha sonuna geldik. “Raspberry Pi – Discord Sunucusu ile Led Kontrolü” projesi hakkında herhangi bir sorunuz olursa bu gönderiye yorum olarak yazabilir ya da mail adresimden bana ulaşabilirsiniz.

İyi çalışmalar dilerim…

#ProjeBaşlasın

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz