16 Ocak 2017 Pazartesi

Raspberry Pi ile Sera İklimlendirme


Merhaba arkadaşlar;
Bu yayında "Raspberry Pi ile Sera İklimlendirme" konulu projemi aşamalarıyla anlatmaya çalışacağım. Python dilini kullanarak gerçekleştirdiğim bu projede, iklimlendirme sisteminin önemli aşamalarından biri olan nem oranını belirli bir değerin üzerinde tutmaya çalıştım. Kullandığım elemanlarla başlayalım.

Raspberry Pi 3


Bir kredi kartı büyüklüğünde olan Raspberry Pi, mini bilgisayar olarak ifade edilmektedir. Raspberry
ile ev otomasyonu yapabilir; ışıkları kapatıp, kapıları kilitleyebilir, bir fincan kahve yapıp termostatı ayarlayabilir. Raspberry’ ye bir kamera bağlarsanız ev güvenlik sistemi de yapabilirsiniz, robot da, bir emulator indirip HDMI’ dan TV’ nize bağladığınızda kendi oyun konsolunuzu da yapabilirsiniz. Yani Raspberry Pi’ yi kullanmak tamamen hayal gücünüze ve isteğinize kalmıştır.

DHT11 Sıcaklık ve Nem Sensörü


Bu elektriksel eleman, herhangi bir dijital alıcı veya verici ile tek bir veri yolu üzerinden çift yönlü seri iletişim yapabilen, ortamın sıcaklık ve nem bilgisini analog 14 formdan dijital forma çevirerek alıcıya ileten nem ve sıcaklık algılayıcısıdır.  İçerisinde, nem ve sıcaklığı ayrı ayrı algılayabilen, nem için direnç tipinde, sıcaklık için ise NTC yapısında iki farklı bileşen bulunur. Sensör, 0 ile 50 ◦ C değerleri arasında, artı-eksi 2 ◦ C tolerans payında sıcaklık, yüzde 20 ile yüzde 95 RH değerleri arasında, artı-eksi yüzde 5 RH tolerans payında nem ölçümü yapabilmektedir.

Röle Kartı


Röle, elektromanyetik çalışan bir devre elemanıdır. Yani üzerinden akım geçtiğinde başka bir elektrik devresinin açılıp kapanmasını sağlayan bir elektriksel anahtardır. Bu anahtar bir elektromıknatıs tarafından kontrol edilir. Küçük akım ve gerilimlerle daha büyük akım ve gerilimlerini kontrolünü sağlar. Raspberry Pi, Arduino vb. gibi mikrodenetleyiciler için kolaylık sağlaması açısından özel hazırlanmış röle kartı bulunmaktadır. Bu projemizde röle kartı kullanılmıştır.

2X16 LCD Dispay


Liquid Crystal Display(LCD) olarak geçen 16 sütün 2 satırdan oluşan ve mavi arka plan ışıklı bir yazı ve karakter göstergesidir. Üzerinde 16 tane pin bulunmaktadır. Projede ölçtüğümüz sıcaklık ve nem değerlerini okumak için kullanılmıştır. 

Su Pompası


Pompa sıvıları taşımak için kullanılan mekanik bir mekanizmadır. Bir pompa, sıvıyı düşük basınçtan yüksek basınca hareket ettirir ve bundan dolayı basınç içinde bir fark oluşturur. Pompalar mekanik kuvvetlerin fiziksel kaldırma veya sıkıştırma kuvveti ile maddeyi itmesi prensibini kullanarak çalışır.

Geliştirilen Uygulamanın Aşamaları

1) Rasberry Pi' nin ilk kurulumu ve karşılaşılan ağ paylaştırma sorunları için aşağıda bulunan iki linki kullanabilirsiniz.

  1. http://web.bilecik.edu.tr/murat-ozalp/2016/11/27/raspberry-pi-ilk-kurulum-calistirma/
  2. http://web.bilecik.edu.tr/murat-ozalp/2017/01/07/raspberryye-internet-paylastirma-sorunlarinda-kontrol-listesi/
2) Python kodlarını yazmak için IDLE ve Xming kurulmuştur.

3) Projede kullanılan elemanların bağlantılar
          
          1. DHT11 sıcaklık ve nem sensörünün Raspberry Pi ile bağlantısı


          2. Röle kartının Raspberry Pi ile bağlantısı


          3. LCD Display' in Raspberry Pi ile bağlantısı


          4. Şebeke gerilimi su pompası ve röle kartının bağlantısı


4) Kurulumlar ve devre bağlantıları tanımlandıktan sonra kod kısmına gelebiliriz.
     
          1. DHT11 sıcaklık ve nem sensörü için Adafruit_DHT11 kütüphanesini indirmelisiniz. Aşağıdaki linkte açık bir şekilde anlatılmıştır.
  
          2. Xming' i aktif hale getirdikten sonra komut ekranına idle yazın. Açılan pencerede yeni bir dosya oluşturun ve aşağıda vermiş olduğum kodları ekleyin. Kodlar açıklamaları ile birlikte verilmiştir. 

Kodlar

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import Adafruit_DHT
import time
import datetime

humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)

       
while True:
    if humidity <= 20:
        GPIO.setmode(GPIO.BCM)#Rasp uzerindeki BCM numaralandirmalari gecerli yapildi
        GPIO.setwarnings(False)
        GPIO.setup(23, GPIO.OUT)#23 nolu pin ile +3.3v cikis verildi
       
        GPIO.output(23,True)#23 nolu pini aktif hale getirildi.
       
        humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4) # Sicaklik ve nem degerleri

    else:
        GPIO.setmode(GPIO.BCM)
        GPIO.setwarnings(False)
        GPIO.setup(23, GPIO.OUT)#23 nolu pini +3.3v cikis verdik
        GPIO.output(23,False)#23 nolu pini 0v'a dusurduk.
       
        humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)

    time.sleep(0.5)

  
    # LCD için kullanılacak GPIO pinleri planlandı
    LCD_RS = 26
    LCD_E  = 19
    LCD_D4 = 13
    LCD_D5 = 6
    LCD_D6 = 5
    LCD_D7 = 11
    
    # LCD cihazinin
    LCD_WIDTH = 16    # LCD'nin her satırı için max karakter sayısı
    LCD_CHR = True    # LCD'nin ışıkları açıldı
    LCD_CMD = False   # LCD komut modu kapatıldı
    
    LCD_LINE_1 = 0x80 # 1. satır için LCD RAM adresi
    LCD_LINE_2 = 0xC0 # 2. satır için LCD RAM adresi
    
    # Zamanlama sabitleri
    E_PULSE = 0.0005 # Darbe zamanı
    E_DELAY = 0.0005 # Gecikme zamanı
    
    def main():
      # Main program block
      GPIO.setwarnings(False)
      GPIO.setmode(GPIO.BCM)       # BCM numaraları kullanıldı
      GPIO.setup(LCD_E, GPIO.OUT)  # E
      GPIO.setup(LCD_RS, GPIO.OUT) # RS
      GPIO.setup(LCD_D4, GPIO.OUT) # DB4
      GPIO.setup(LCD_D5, GPIO.OUT) # DB5
      GPIO.setup(LCD_D6, GPIO.OUT) # DB6
      GPIO.setup(LCD_D7, GPIO.OUT) # DB7
    
      # Ekranı başlatacak metodunu çalıştır
      lcd_init()
    
     

      # Send some test
      lcd_string("Sicaklik: %d C" % temperature,LCD_LINE_1)
      lcd_string("Nem: %d %%" % humidity,LCD_LINE_2)
    
      time.sleep(3) # 3 second delay

       
    
    def lcd_init():
      # Ekran başlatıldı
      lcd_byte(0x33,LCD_CMD) # 110011 Başlatıldı
      lcd_byte(0x32,LCD_CMD) # 110010 Başlatıldı
      lcd_byte(0x06,LCD_CMD) # 000110 Sürgünün hareket yönü
      lcd_byte(0x0C,LCD_CMD) # 001100 Ekran açık, Sürgü kapatıldı, Yanıp Sönüyor
      lcd_byte(0x28,LCD_CMD) # 101000 Veri uzunluğu, satır sayısı, yazı tipi boyutu
      lcd_byte(0x01,LCD_CMD) # 000001 Ekran temizleme
      time.sleep(E_DELAY)
    
    def lcd_byte(bits, mode):
      # Data pinlerine bit gönderme
      # bits = data
      # mode = True karakter için
      #        False komut için
    
      GPIO.output(LCD_RS, mode) # RS
    
      # Yüksek bitler
      GPIO.output(LCD_D4, False)
      GPIO.output(LCD_D5, False)
      GPIO.output(LCD_D6, False)
      GPIO.output(LCD_D7, False)
      if bits&0x10==0x10:
        GPIO.output(LCD_D4, True)
      if bits&0x20==0x20:
        GPIO.output(LCD_D5, True)
      if bits&0x40==0x40:
        GPIO.output(LCD_D6, True)
      if bits&0x80==0x80:
        GPIO.output(LCD_D7, True)
    
      # 'Enable' pinini değiştirme metodunu çalıştır
      lcd_toggle_enable()
    
      # Düşük bitler
      GPIO.output(LCD_D4, False)
      GPIO.output(LCD_D5, False)
      GPIO.output(LCD_D6, False)
      GPIO.output(LCD_D7, False)
      if bits&0x01==0x01:
        GPIO.output(LCD_D4, True)
      if bits&0x02==0x02:
        GPIO.output(LCD_D5, True)
      if bits&0x04==0x04:
        GPIO.output(LCD_D6, True)
      if bits&0x08==0x08:
        GPIO.output(LCD_D7, True)
    
      # 'Enable' pinini değiştirme metodunu çalıştır
      lcd_toggle_enable()
    
    def lcd_toggle_enable():
      # Geçişi etkinleştirme
      time.sleep(E_DELAY)
      GPIO.output(LCD_E, True)
      time.sleep(E_PULSE)
      GPIO.output(LCD_E, False)
      time.sleep(E_DELAY)
    
    def lcd_string(message,line):
        # Görüntülenecek mesajı gönder
        
        message = message.ljust(LCD_WIDTH," ")
        
        lcd_byte(line, LCD_CMD)
        
        for i in range(LCD_WIDTH):
            lcd_byte(ord(message[i]),LCD_CHR)
        
    if __name__ == '__main__':
        
        try:
            main()
        except KeyboardInterrupt: #Klavye kesilmesi dışında
          pass
        finally:
            lcd_byte(0x01, LCD_CMD)
            lcd_string("",LCD_LINE_1)
            GPIO.cleanup()


 
Projenin Son Hali


Karşılaşılan Sorunlar


Projeye yeni başladığım zamanlarda Raspberry Pi'den IDLE' a bağlanamıyordum. Xming kurarak bu problemi çözdüm. Kullandığım su pompası 220V 9.1mA ile çalışmakta ve Raspberry Pi' nin kontrollü pinlerinden ise 3.3V alabiliyordum. Raspberry Pi’nin kontrollü pinlerinden alınan güç, su pompası için yetersiz geldiğinden röle kartı kullandım. Bu projede Raspberry Pi yerine daha uygun fiyatta bir elemanda kullanabilirsiniz.