Ana Sayfa Bitirme Projeleri Raspberry Pi ile Akıllı Ev Otomasyonu

Raspberry Pi ile Akıllı Ev Otomasyonu

36 min read
1
0
21,146

Merhaba Raspberry pi3 ile IoT Smart Home bitirme projesini sizlerle paylaşmak istedik. Bu projede mobil uygulama ile raspyi internet üzerinden haberleştirerek bir evin lambalarını, prizlerini, sıcaklığının anlık olarak ölçülüp klimayı devreye sokma ve garaj kapsının kontrolünden bahsedeceğim. Karışık bir proje ve üzerinde çok zaman harcandı. Hatta proje sunumundan birkaç saat önce de donanım kısmını yaptık. Bu projeyi birkaç kısıma ayırarak anlaşılabilir hale getirmeye çalıştık ve kullanacağınız kompenentleri yani donanımları, devre elemanlarını kesinlikle test etmelisiniz. Aksi taktirde “bu kod çalışmıyor hatalı”, “aynısını yapıyorum olmuyor” diyebilirsiniz. 🙂 Umarım işinize yarar. İyi çalışmalar

1.1    DHT11(SICAKLIK/NEM) SENSÖR UYGULAMASI

1.1.1Sıcaklık Nem(DHT11) Sensörü

Şekil 5.3’de gösterilen DHT 11 sıcaklık ve nem algılayıcı kalibre edilmiş dijital sinyal çıkışı veren gelişmiş bir algılayıcı birimidir. Yüksek güvenilirliktedir ve uzun dönem çalışmalarda dengelidir. 8 bit mikroişlemci içerir, hızlı ve kaliteli tepki verir. 0 ile 50 arasında 20 hata payı ile sıcaklık ölçen birim, 20-90 % RH arasında 5% RH hata payı ile nem ölçer. Bu sensör ev içerisindeki sıcaklık ve nemi ölçmek için kullanılır. Sıcaklık bilgileri kullanıcıya bildirilir ve programlandığı sıcaklık değerini ayarlamak için gerekli modülleri ( Fan,klima) aktif eder.

Şekil 5.3. Sıcaklık ve nem sensörü

 

1.1.2     Board Üzerinde Kurulumu

Şekil 5.4 Sıcaklık/Nem Algılama Sensör Devresi

Şekil 5.4’deki gibi Raspberry pi ve Sıcaklık/nem sönsörü board üzerinde gerekli baglantılar yapılarak kuruldu.

1.1.3 Python Programlama ile Kodlanması

[php]
#!/usr/bin/phyton
import RPi.GPIO as GPIO
import dht11
import time

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

#read data using pin

instance = dht11.DH11(pin=26)

while True:
result = instance.read()
if result.instance_valid():
print("Temprature: %d C" % result.temprature)
print("Humidity: %d %%" % result.humidity)

time.sleep(5) [/php]

 

Sekil 5.5: Sıcaklık/Nem Algılama Sensör Kodu

Burada ısı ve nem ölçümlerini yapmak için python programlama dilinin dht11 kütüphanesi kullanıldı.

Şekil 5.6:Sıcaklık/Nem Algılama Sensör Testi

Şekil 5.4’deki gibi board üzerinde kurulumu yapılan, Şekil 5.5 gibi kodu yazılarak çalıştırılan Sıcaklık/Nem sensörü¸ Şekil 5.6’daki gibi çalıştırılarak test edildi.


1.2  LED UYGULAMASI

  • Board Üzerinde Kurulumu

 

Şekil 5.7:Led Devresi

 

Led yakma kodu:

[php]

#!/usr/bin/phyton
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setwarnings(False)

GPIO.setup(17,GPIO.OUT)
GPIO.setup(27,GPIO.OUT)

print"lights on"
GPIO.output(17,GPIO.HIGH)
GPIO.output(27,GPIO.HIGH)
[/php]

 

Burada Led açma kapama işlemlerini gerçekleştirmek için RPi.GPIO as GPIO kütüphananesi kullanılmıştır. GPIO.setup(17,GPIO.OUT)‘da GPIO 17 çıkış pini olarak ayarlanmaktadır. GPIO.output(17,GPIO.HIGH) kodu ledimizi açmaktadır.

Led söndürme kodu:

[php]

#!/usr/bin/phyton
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
GPIO.setwarnings(False)

GPIO.setup(17,GPIO.OUT)
GPIO.setup(27,GPIO.OUT)

print"lights on"
GPIO.output(17,GPIO.LOW)
GPIO.output(27,GPIO.LOW)// anlaşıldığı üzere GPIO.output(17,GPIO.LOW) kodu ledimizi kapatmaktadır.
[/php]

Şekil 5.10:Led Açma ve Kapatma Testi

Şekil 5.7’daki gibi board üzerinde kurulumu yapılan, Şekil 5.8 ve Şekil 5.9’daki gibi kodu yazılarak çalıştırılan Ledler¸ Şekil 5.10’daki gibi çalıştırılarak test edildi.


 

1.3  SERVO MOTOR UYGULAMASI

1.3.1 Servo Motor Hakkında

Şekil 5.10’da gösterilen Servo motor herhangi bir mekanizmanın işleyişini hatayı algılayarak yan bir geri besleme düzeneğinin yardımıyla denetleyen ve hatayı gideren otomatik aygıttır. Robot teknolojisinde en çok kullanılan motor çeşitidir. Bu sistemler mekanik olabileceği gibi elektronik. hidrolik-pnömatik veya başka alanlarda da kullanılabilmektedir.

Servo motorlar da çıkış; mekaniksel konum. hız veya ivme gibi parametrelerin kontrol edildiği bir düzenektir. Servo motor içerisinde herhangi bir motor AC, DC veya Step motor bulunmaktadır. Ayrıca sürücü ve kontrol devresini de içerisinde barındırmaktadır. D.C. servo motorları, genel olarak bir D.C. motoru olup, motora gerekli D.C. aşağıdaki metotlardan elde edilir. 1- Bir elektrik yükselteçten. 2- A.C. akımın doyumlu reaktörden geçirilmesiııden. 3- A.C. akımın tristorden geçirilmesinden.4- Amplidin, retotrol, regüleks gibi dönel yükselteçlerden elde edilir.

Servo motor mekanik cihazları kontrol etmekte kullanılır.Balıkları programlanan saat aralığında yem vermek için kullanılabilir.Çiçeklerin belli aralıklarla sulanması için kullanılabilir.

Şekil 5.10:Servo Motor

1.3.2 Servo Motor Bağlantısı

Şekil 5.11: Servo Motor Bağlantısı

1.3.3Arduino Programlama ile Kodlanması

Burada Servo Motoru Arduino’nun 9.pinine bağlandı.Servo Motoru 0 dereceden 180 dereceye kadar derece derece çalışmaktadır.


 

1.2  RÖLE UYGULAMASI

  • Röle Hakkında

Röle üzerinden akım geçtiği zaman çalışan elektromanyetik bir devre elemanıdır. Röleler küçük değerli bir akım ile yüksek güçlü bir alıcıyı anahtarlayabilmek için kullanılır. Röleler, tek bir elemanda birden fazla anahtar kontağına sahip olabilir ve böylelikle birden fazla yükü aynı anda açıp kapatabilirler. Bu özellikleri ile röleler, tristör ve triyaklardan daha avantajlıdır.

Rölelerin dezavantajı ise mekanik şekilde çalıştıklarından dolayı sık arıza yapabilmeleridir. Rölenin kontakları defalarca birbirine yapışıp açıldığı için zamanla oluşan elektrik atlamaları ile kontaklar oksitlenebilir ve iletimini kaybedebilir.

Röleler başka bir elektrik devresinin açılıp kapanmasını sağlayan elektriksel anahtarlardır. Bu özellikleri ile bir nevi transistörler gibidirler. Bobin iki kontağı mıknatısladığı zaman rölenin bir kontağı açılır bir kontağı kapanır.

Röleler, aynı anda farklı frekans ve dalga türlerinde etkilenmeden anahtarlama yapabilirler. Elektromanyetik çalışırlar, yani üzerlerinden akım geçmesiyle aktif hale gelirler. Röleler devrelerin giremediği bölgelerde (yüksek sıcaklık, nem veya sıvısal ortamlar) büyük önem kazanırlar. Tristor ve triyakların kullanımıyla popülerlikleri biraz azalsa da halen aktif olarak kullanılmaktadır.

Şekil 5.13:Röle

 

1.2.1Board Üzerinde Kurulumu

1.2.2 Python Programlama ile Kodlanması

[php]

#!/usr/bin/phyton
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

#init list with pin numbers
pinList = [2,3,26,17,27,23,24]

#loop through pins and set mode and state to ‘high’
for i int pinList:
GPIO.setup(i, GPIO.OUT)
GPIO.output(i, GPIO.HIGH)

#main loop
try:
GPIO.output(2, GPIO.LOW)
print "ONE"
time.sleep(2);
GPIO.output(3, GPIO.LOW)
print "TWO"
time.sleep(2);
GPIO.output(26, GPIO.LOW)
print "THREE"
time.sleep(2);
GPIO.output(17, GPIO.LOW)
print "FOUR"
time.sleep(2);
GPIO.cleanup()
print "Good bye!"

#End program cleanly with keyboard
except KeyboardInterrupt
print "Quit"

#Reset GPIO settings
GPIO.cleanup()

 

[/php]

 

Şekil 5.15:Röle Kodu

Kullanılacak olan GPIO pinleri bir dizide tutulur. GPIO.setup(i, GPIO.OUT) ile pinler çıkış pini olarak ayarlanır.GPIO.output(i, GPIO.HIGH) ile pinler pasif duruma getiriliyor.GPIO.output(i, GPIO.LOW) ile de pinler aktif duruma getiriliyor.Röle GPIO.LOW da aktif, GPIO.HIGH da pasif çalışır.

 

Şekil 5.14’deki gibi board üzerinde kurulumu yapılan, Şekil 5.15′ deki gibi kodu yazılarak¸ Şekil 5.16’daki gibi çalıştırılarak test edildi.


 

1.5 SICAKLIĞA BAĞLI OLARAK FAN UYGULAMASI

Eğer Android uygulamasında yaz modu aktif edilirse veritabanından gelen sıcaklık değeri 30 C0’dan fazla olursa soğutucu fan otomatik olarak çalışır.Eğer kış modu aktif edilirse veritabanından gelen sıcaklık 25 C0’dan az olursa ısıtıcı fan otomatik olarak çalışır.

[php]

print("Executing program:")
t1 = threading.Thread(target = readTempHum)
t1.start()

while True:

sicaklik=firebase.get("/Controls/Sensors/Temperature/current_inside", None)
sicaklik=sicaklik[:-1]

yazModu=firebase.get(‘/Controls/yazMode/’, ‘status’)
kisModu=firebase.get(‘/Controls/kisModu/’, ‘status’)

if tl.is_alive()is False:
del t1
t1 = threading.Thread(target=readTempHum)
t1.start()

if yazMode is True:
if sicaklik>str(30):
GPIO.output(17, GPIO.LOW)
else:
GPIO.output(17, GPIO.HIGH)

if yazMode is True:
if sicaklik<str(30):
GPIO.output(27, GPIO.LOW)
else:
GPIO.output(27, GPIO.HIGH)

time.sleep(1)

[/php]

Şekil 5.16:Fan Çalışma Kodu

 

readTempHum fonksiyonu ile sıcaklık değerleri her 30 sn’de veri tabanına kaydediliyor. sicaklik=firebase.get(“/Controls/Sensors/Temperature/current_inside”, None) ile veritabanından güncel sıcaklık değeri alınıyor.

Ayrıca veritabanından yazModu ve kisModu durumları kontrol ediliyor.if bloklarında ise yaz modu ve kış modlarına göre sıcaklık karşılaştırması yapılmıştır.Karşılaştırma sonuçlarına göre ısıtıcı veya soğutucu fan çalışmaktadır.


 

RASPBERY PI’da VERİTABANI İŞLEMLERİ

Veritabanı olarak Firebase veritabanı kullanıldı.

a-)Sensörlerden alınan Sıcaklık ve Nem değerlerinin Veritabanına Kaydedilmesi

[php]

firebase = firebase.FirebaseApplication(‘https://smarthome-308a5.firebaseio.com’)

def readTempHum()
instance = dht11.DHT11(pin=21)
result = instance.read()

#add current value
firebase.put("/Controls/Sensors", "/Humidity/current_inside", "" + str(result.Humidity) + "%")
firebase.put("/Controls/Sensors", "/Temperature/current_inside", "" + str(result.temperature) + "C")

time.sleep(30)

[/php]

firebase=firebase.FirebaseApplication(‘https://smarthome-308a5.firebaseio.com‘)                                                                                                  ile veritabanı bağlanılıyor.

firebase.put(“/Controls/Sensors”,”/Humidity/current_inside”,”” + str(result.humidity)+”%”) ile sensörlerden alınan veriler veritabanındaki hedefe kaydediliyor.Bunun için firebase’ın put methodu kullanılmıştır.

b-) Veri tabanından Gerekli Verilerin Çekilmesi

while True:
mutfakLED = firebase.get(‘/Lights/ODA1/’, ‘status’)
oturmaOdaLED = firebase.get(‘/Lights/ODA2/’,’status’)
yatakOdaLED = firebase.get(‘/Ligts/ODA3/’,’status’)

if oturmaOdaLED == ‘True’ :
GPIO.output(2, GPIO.LOW)
if oturmaOdaLED == ‘False’:
GPIO.output(2, GPIO.HIGH)
if mutfakLED == ‘True’ :
GPIO.output(3, GPIO.LOW)
if mutfakLED == ‘False’ :
GPIO.output(3,GPIO.HIGH)
if yatakOdaLED== ‘True’ :
GPIO.output(3,GPIO.LOW)
if yatakOdaLED == ‘False’ :

time.sleep(1)
mutfakLED = firebase.get(‘/Lights/ODA1/’, ‘status’) ile veri tabanından veriler çekildi.Bunun için firebase’in get metodunu kullanıldı.


Database

Tüm kodların birleşmiş hali:

[php]

#!/usr/bin/python
from firebase import firebase
import time
import os
import dht11
import time
import threading
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

# init list with pin numbers
pinList = [2, 3, 26, 17, 27, 23, 24]

# loop through pins and set mode and state to ‘high’

for i in pinList:
GPIO.setup(i, GPIO.OUT)
GPIO.output(i, GPIO.HIGH)

# Firebase hesabina baglaniyoruz …
firebase = firebase.FirebaseApplication(‘https://smarthome-308a5.firebaseio.com’)
def readTempHum():
instance = dht11.DHT11(pin=21)
result = instance.read()

# add current value
firebase.put("/Controls/Sensors", "/Humidity/current_inside", "" + str(result.humidity) + "%")
firebase.put("/Controls/Sensors", "/Temperature/current_inside", "" + str(result.temperature) + "C")

##retrive max & min humidity (remove the %)
maxHumidity = firebase.get("/Controls/Sensors/Humidity/max_inside", None)
maxHumidity = maxHumidity[:-1]

minHumidity = firebase.get("/Controls/Sensors/Humidity/min_inside", None)
minHumidity = minHumidity[:-1]

# retrieve max & min temperature (remove the C)
maxTemperature = firebase.get("/Controls/Sensors/Temperature/max_inside", None)
maxTemperature = maxTemperature[:-1]

minTemperature = firebase.get("/Controls/Sensors/Temperature/min_inside", None)
minTemperature = minTemperature[:-1]

##check for max values
if float(result.humidity) > float(maxHumidity):
firebase.put("/Controls/Sensors", "/Humidity/max_inside", "" + str(result.humidity) + "%")
print ‘Updated Humidity max_inside’
if float(result.temperature) > float(maxTemperature):
firebase.put("/Controls/Sensors", "/Temperature/max_inside", "" + str(result.temperature) + "C")
print ‘Updated Temperature max_inside’

## check for min values
if float(result.humidity) < float(minHumidity):
firebase.put("/Controls/Sensors", "/Humidity/min_inside", "" + str(result.humidity) + "%")
print ‘Updated Humidity min_inside’
if float(result.temperature) < float(minTemperature):
firebase.put("/Controls/Sensors", "/Temperature/min_inside", "" + str(result.temperature) + "C")
print ‘Updated Temperature min_inside’
time.sleep(30)

#*********************************************************************
# MAIN
#*********************************************************************
print("Executing program:")
t1 = threading.Thread(target = readTempHum)
t1.start()

while True:
mutfakLED = firebase.get(‘/Lights/ODA1/’, ‘status’)
oturmaOdaLED = firebase.get(‘/Lights/ODA2/’, ‘status’)
yatakOdaLED=firebase.get(‘/Lights/ODA3/’, ‘status’)
sicaklik=firebase.get("/Controls/Sensors/Temperature/current_inside", None)
sicaklik= sicaklik[:-1]

yazModu=True
kisModu=True

if t1.is_alive()is False:
del t1
t1 = threading.Thread(target =readTempHum)
t1.start()
if oturmaOdaLED == ‘True’:
GPIO.output(2, GPIO.LOW)
if oturmaOdaLED == ‘False’:
GPIO.output(2, GPIO.HIGH)
if mutfakLED == ‘True’:
GPIO.output(3, GPIO.LOW)
if mutfakLED == ‘False’:
GPIO.output(3, GPIO.HIGH)
if yatakOdaLED == ‘True’:
GPIO.output(26, GPIO.LOW)
if yatakOdaLED == ‘False’:
GPIO.output(26, GPIO.HIGH)
if yazModu is True:
if sicaklik>str(30):
GPIO.output(17, GPIO.LOW)
else:
GPIO.output(17, GPIO.HIGH)
if kisModu is True:
if sicaklik<str(25):
GPIO.output(27, GPIO.LOW)
else:
GPIO.output(27, GPIO.HIGH)
time.sleep(1)

[/php]

Katkılarından dolayı Sefa Cihangir‘e teşekkür ediyorum.

Buradan bazı çalışmalarını indirip inceleyebilirsiniz. https://bitbucket.org/scihangir/

Buna Benzer Yazılar Göster !
Daha Fazlasını Yükle - Fatih Mehmet Yılmaz
Daha Fazla Göster -  Bitirme Projeleri

1 Yorum

  1. Ahmet

    6 Şubat 2018 at 16:27

    Güzel bir çalışma olmuş tebrik ederim. Aşağıdaki linkteki projeyle ilgilenmek isteyen olursa yardım ederim. Ancak maliyeti çok uygun değildir özellikle belirteyim. https://www.youtube.com/edit?o=U&video_id=NfkfGOapo6E

    Reply

Ahmet için bir cevap yazın Cevabı iptal et

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

Bak Bakalım ?

EAGLE Programı ile DC Motor Sürücü Tasarımı

Devrede kullanılan malzemeler BTS7960B x8 7.5mm Klemens x5 SNx4AHC244 x2 1k direnç x16 100…