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.



6 Aralık 2016 Salı

Ubuntu Server 16.10 Üzerinde Web Uygulaması

Merhaba arkadaşlar;
       Bu yayında işletim sistemi dersimde almış olduğum "Ubuntu Server 16.10 üzerinde web uygulaması tasarlama" konulu ödevimi nasıl yaptığımı aşamalarıyla anlatmaya çalışacağım. Veritabanı olarak MySQL'i, uygulama geliştirme dili olarak ise Python'u tercih ettim. Kullandığım bileşenler ve kısa açıklamaları ile başlayalım.


VirtualBox

       Bilgisayarımızda sanal makine oluşturup istediğimiz işletim sistemini kurabildiğimiz bir sanallaştırma programıdır. InnoTek firması tarafından geliştirilmiştir. Kurulumu kolay ve sadece bir arayüze sahip olduğundan kullanımı da basittir. 

https://www.virtualbox.org/wiki/Downloads linkinden indirebilirsiniz.


Ubuntu

   Ubuntu'nun sunucular için geliştirilmiş Linux çekirdeğini kullanan işletim sistemi dağıtımıdır. Ubuntu'nun masaüstü ve dizüstü bilgisayar platformu için sunulan sürümlerinden farklı olarak içerisinde bazı ek özellikleri ve servisleri barındırır. Yalnızca sunucu sistemleri üzerinde çalışan bir işletim sistemi dağıtımıdır. 

Ubuntu Server 16.10 sürümünü aşağıdaki siteden indirebilirsiniz.
https://wiki.ubuntu.com/YakketyYak/ReleaseNotes?_ga=1.89901532.612949330.1480098487

Kurulumunu https://youtu.be/jyZmgvse0k8 'den yardım alarak yapabilirsiniz.


MySQL

     MySQL bir ilişkisel veritabanı yönetim sistemidir. UNIX,OS/2 ve Windows platformlarında kullanılabilmektedir.Fakat Linux altında daha yüksek performans sergilemektedir. Veri tabanı gerektiren her ortamda rahatlıkla kullanılabilir fakat en çok web sunucularında tercih edilen veritabanıdır. MySQL içerisinde ODBC sürücüleri de bulunduğundan bir çok geliştirme platformunda rahatlıkla kullanılabilir.


PUTTY

     Ağ üzerindeki Linux işletim sistemli sunucunuza/makinanıza terminal üzerinden bağlantı sağlayan boyut olarak oldukça küçük ama güçlü ücretsiz ve açık kaynak kodlu bir yazılımdır. Putty ile bağlantı yaptığınız sunucunuzu terminal üzerinden çeşitli komutlar ile yönetebilirsiniz. Daha çok gelişmiş Linux kullanıcılarına hitap eder zira kullanıcı arayüzü yoktur, tüm işlemleri komutlar ile yapmamız gerekir.

http://www.putty.org/ adresinden indirebilirsiniz.


phpMyAdmin

     PHP ile yazılmış açık kaynak kodlu bir araçtır. Başlıca kullanım amacı İnternet üzerinden MySQL veritabanı yönetimidir. Veritabanı oluşturma ve silme, tablo ekleme/değiştirme/silme, alan ekleme/değiştirme/silme, SQL sorguları çalıştırma, kullanıcıları, yetkileri ve alan anahtarlarını yönetme gibi işlevleri yapabilen ücretsiz bir yazılımdır.


Kurulum Aşamaları

1) VirtualBox indirip kuralım. Yukarıda belirttiğim adresten indirebilirsiniz.

2) Ubuntu Server 16.10 yukarıda belirttiğim adresten indirip, kurulumu için belirttiğim videoyu takip ederek kurabilirsiniz. Kurulum aşamasında videodan farklı olarak sadece aşağıda paylaşacağım adımlara dikkat etmelisiniz;
 



Bu kısımda OpenSSH server ve LAMP server'ı seçip ilerlemeniz MySQL kurulumu için size yardımcı olaraktır.





İlerlediğinizde bu ekran karşınıza çıkmalı burada phpadmin'de kullanacağınız şifreyi belirliyorsunuz.

     Adımları doğru bir şekilde gerçekleştirdikten sonra Ubuntu Server kurulumunu tamamlamış olursunuz.

3) Kurduğumuz Ubuntu Server'a kullanıcı adı ve şifre ile giriş yapıyoruz. Daha sonra aşağıdaki iki adımı yazıp kurulumun ilk ayarlarını yapıyoruz.

# sudo apt-get update = Daha yeni bir sürüm var mı yok mu diye listeyi günceller.

# sudo apt-get upgrade  = Daha yeni bir sürüm varsa yeni sürümü yükler.



4) VirtualBox ağ yapılandırması. Ben NAT'ı tercih ettim, adımları aşağıda belirttiğim gibi gerçekleştiriyoruz. 






Ayarlara girdikten sonra Ağ - Gelişmiş - B Noktası Yönlendirme deyip Anamakine ve Misafir B Noktalarını resimdeki gibi doldurup adlandırıyoruz.


5) Phpmyadmin'i kurma zamanı.

# sudo apt-get install phpmyadmin = Bu komut ile indirmeye başlıyoruz. Bu komut indirme yaparken ekrana gelen seçimde sadece apache2'yi seçerek ilerliyoruz. Daha sonra tekrar bir soru gelecek ona hayır deyip işlemi tamamlıyoruz. 

# sudo /etc/init.d/apache2 start = apache2'yi yeniden başlatıyoruz.

6) Putty ile Ubuntu server'a bağlanıyor mu diye kontrol ediyoruz. Bağlandığını aşağıdaki resimden görebilirsiniz. Putty açıyoruz (Host Name = localhost) Port kısmına ise ssh için NAT' ayarında girdiğimiz Anamakine B Noktasını giriyoruz (benim 2200).



7) phpadmin'e bağlanmak için ise adres çubuğuna;

localhost:8000/phpmyadmin/ yazarak giriş sayfasına gidiyoruz. Kullanıcı adı = root, şifre ise 2. adımda MySQL root kullanıcısı için belirlediğimiz şifre ile giriş yapıyoruz.




8) MySQL Kurulumu. Aşağıdaki iki komutu sırası ile giriyoruz.

# sudo apt-get install mysql-server

# sudo apt-get install python-mysqldb



Hata verdiği için çarpı işareti bıraktım. Bende MySQL 'li büyük harfle yazınca hata veriyor.

9) Oluşturacağımız veritabanını python üzerinde görebilmek için İDLE indirmemiz lazım.

# sudo apt-get install idle 

10) Veri tabanı oluşturma kısmı.

# mysql -u root -p komutu ile mysql' e giriyoruz. Daha sonra aşağıdaki resimde işaretlediğim komutları girip öğrenci bilgi sistemini oluşturdum.




     Veritabanın da oluşturduğum tablonun çıktısını ise ;

# select *from  komutu ile açıyorum.





11) Oluşturduğumuz veritabanını python üzerinde görmeye geldi sıra ben bunu putty üzerinden yapmak istiyorum.



# sudo apt-get install phyton-pip = pip paket yöneticisidir işlemlerimizi daha hızlı yapmamızı sağlar. 

sudo apt-get install phyton-django = Django framework' ünü indiriyorum bu komutla.

# django-admin startproject mysite = mysite adında bir proje oluşturdum bu komutla.

sudo nano ~/mysite/mysite/settings.py = açtığım dosyanın içine giriyorum.


Açılan ekranda aşağı doğru inip bu kısımda daha önceden oluşturduğum veritabanı bilgilerimi girdim.(Ctrl + X) ve E deyip kaydettim.

# cd mysite = cd komutu ile mysite' ye girdim.

# python manage.py syncdb = komutunu girdikten sonra sorulan soruya “yes” cevabını veriyoruz. Bizden kullanıcı adı, e-mail adresi ve şifre girmemizi istiyor. Bu bilgileri doldurduktan sonra kulanıcın başarıyla oluşturuldu bilgisini aldım.






sudo nano ~/mysite/mysite/views.py = mysite isimli projemizde yeni bir .py uzantılı dosya oluşturdum. Daha sonra dosya içerisine aşağıdaki kodu yazdım.

# -*- coding: utf-8 -*-
from django.http import *
from django.http import HttpResponse
import MySQLdb
def DjangoDeneme(request):
        conn = MySQLdb.connect (host = "localhost",
        user = "root",
        passwd = "dilan",
        db = "bilgisistemi"
        cursor = conn.cursor ()
        cursor.execute ("select onrncisayisi, adsoyad, okulno, sehir from bilgi")
        rows = cursor.fetchall()
        html="<html><body>"
        for row in rows:
                html1 = "Kişi Numarası :  %s"% row[0]
                html2 = "&nbsp&nbsp  Adı Soyadı : %s"% row[1]
                html3 = "&nbsp&nbsp  Okul Numarası : %s"% row[2]
                html4 = "&nbsp&nbsp  Şehir : %s<br>"% row[3]
                html=html+html1+html2+html3+html4
        kapanis="</body></html>"
        html=html+kapanis
        return HttpResponse(html)  (Ctrl + X) tuşlarına basıp E ve enter diyerek kaydedip çıktım.


     Şimdi, az önce oluşturduğumuz views.py dosyasını, Django projesinde hazır olarak bulunan urls.py dosyasına eklemeliyiz. Bunun için ;

# sudo nano ~/mysite/mysite/urls.py  yazıp açılan dosyanın içeriğini aşağıdaki resimde gösterildiği gibi yaptım

Daha sonra  (Ctrl + X) tuşlarına basıp E ve enter diyerek kaydedip çıktım.

Şimdi;

cd mysite  

python manage.py runserver 0.0.0.0:8081 yazıp anamakinamın veritabanına ulaşım yolunu açıyorum. Daha sonra internet sayfasının adres çubuğuna http://localhost:8000/deneme/ yazarak veritabanından çektiğim verileri görebilirim.


Aşağıdaki ekranda görüldüğü gibi veritabanı verilerimi görebiliyorum.






Karşılaştığım Sorunlar

     İlk uygulamam olduğu için baya uğraştırdı beni LAMP kısmını seçmediğim için mysql kurulumunda bir kaç hatayla karşılaştım. sudo apt-get dist-upgrade komutu beni bir üst sürüme götürdüğü için ekran siyah kalıyordu daha sonra eski sürümü kullan diye bir seçeneğim olduğunu gördüm bunu fark edene kadar 4 defa baştan kurmak zorunda kaldım. 11. adımda baya hatayla karşılaştım eksik olan bir çok kaynağım olduğunu fark ettim ekleyince sorunlar çözüldü. Hataları yorumlamayı bilmediğimi fark ettim ve bu bakış açımı baya değiştirdi benim için verimli bir ödev olduğunu düşünüyorum.


KAYNAKÇA