Bitirme Projeleri Raspberry Pi Raspberry Pi ile Akıllı Ev Otomasyonu By Fatih Mehmet Yılmaz Posted on 10 Ekim 2017 36 min read 1 0 21,302 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr 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/