30 Kasım 2018 Cuma

ASENKRON SERİ HABERLEŞME LAMBA VE KLİMA OTOMASYON UYGULAMASI

Asenkron Seri Haberleşme Lamba ve Klima Otomasyon Uygulaması

Bu yazımızda bir otomasyon uygulaması yapacağız. Bunun diğer programlardan farkı seri ekrandan bir komut gireceğiz ve her komutun Orange pi üzerinde yapacağı bir işlem olacak. 

Daha önceki yazılarda genelde yapmak istediklerimizi '1', '2' gibi gibi isimlendirip kullanıcılardan bu kategori sırasına göre bir giriş yapmasını istiyorduk. Bu uygulamada kullanıcıdan yapmak istediği işlem için belirlediğimiz komutları girmesini isteyeceğiz. Lambanın yanması için kullanıcının bizim belirlediğimiz "lambayak" gibi bir komut girmesi lazım. 

Bu aşamada önceki programlarda kullandığımız kullanıcıdan veri alma ve veri gönderme bilgimizi kullanacağız fakat burada ek olarak bir kaç işlem daha uygulayacağız.


Program kodlarının yazmaya başlayalım. Kütüphane olarak burada yapacağız işlemler için gerekli olan serial, time, gpio, port kütüphanelerini ekliyoruz. Daha sonra kullanacağız pinlere program içinde kolaylık olsun diye isim atıyoruz. Ledi "PC4" fanı ise "PD14" pinine bağlamayı düşündüğümüz için bu şekilde bir atama yapıyoruz. Daha sonra kullanacağımız pinler birer çıkış pini olacağı için "gpio.setcfg()" ile pin giriş/çıkış durumunu ayarlıyoruz.

Seri haberleşme parametrelerini tanıttıktan sonra hem seri ekrana hem de Orange pi terminal ekranına programın başladığına dair bir yazı yazdırdıktan sonra program içinde kullanılacak komutları, kullanıcıya bildirmek için seri ekrana yazdırıyoruz. Siz bu komutları çeşitlendirebilir, sadeleştirebilirsiniz.


Burası aslında bu programın daha teorik olan kısmı. Kullanıcıdan bir veri almamız lazım. Bu veri string veri tipinde ve boyutu belli değil. Normalde ser.read(n) ile belirli sayıda karakterde veri alabiliyorduk fakat burada girilecek komutların hepsi aynı uzunlukta değil. Bu yüzden tek seçeneğimiz ve bu da "ser.readline()".

Bu komutu daha önce yaş-burç uygulamasında kullanmıştık.Bahsettiğim uygulamada doğum tarihini ay-gün şeklinde alırken "readline()" ile almış ve bunu "int(secenek)" ile sayıya dönüştürüp devam etmiştim ve bir sıkıntı çıkmamıştı. Örneğin ben seri ekranda '123' girip enter'a tıkladığımda bu veri Orange pi'ye '123Enter' diye gelir.  Bunu aldığımız veriyi binary formatına dönüştürüp ekrana yazdırdığımızda rahatça görürüz. Sonrasında ben gelen bu veriyi integer veri tipine dönüştürdüğümde 'enter' karakteri atılır ve geriye '123' sayısı kalır. Bu işlemi yaparken bir sorun çıkmaz. Bunu koda çok küçük bir ekleme yapıp görelim.


Koda aldığımız verinin binary halini ve sayı halini ekrana yazdıran 2 satır kod ekledim.


Burada da gördüğünüz gibi '1', '2' ve '3' karakterlerinin yanı sıra iki karakter daha gelmiş. Bunlar enter'a bastığımız için gelen karakterler. Yukarıda enter karakteri dedim fakat enter iki karakteri temsil eder. Buna bilgisayarda kullanabileceğimiz seri arayüz programları yazısında detaylıca değindim. Kısaca enter'a bastığımızda Orange pi'ye veri olarak CR(13-1101) ve LF(10-1010) gelir. Bunun sebebi windows'da satır sonu bu şekilde belirtiliyor. Biz gelen veriyi sayı formatına dönüştürdüğümüzde bu karakterler atılıyor fakat veriyi string(karakter dizisi ) veya karakter formatında kullanırsak enter karakterini de göz önünde bulundurmak gerekiyor.

Gelen veriyi bir string(karakter dizisi) ile karşılaştıracaksak 'enter' ile gelen karakterleri de göz önünde bulundurmak gerekiyor. Bunun için karşılaştırma yapacağımız verilerin sonuna "\r\n" eklemesi yaparız.  Burada "\r" ifadeyi satır başına döndürür yani CR işlevi görür. "\n" ise bir alt satıra indirir bu da LF işlevi görür.


Koda sadece gelen veriyi binary haline döndürmek için ekleme yapıp  Orange pi'ye gelen veriyi görelim.


Yukarıdaki görüntüden program çıktısına bakarsak bir veri girip enter'a tıkladığımızda(ser.readline() ile veri aldığımız için ) son iki karakterin enter karakteri olduğunu görürüz.

Bu yüzden alınan veri ile istediğimiz bir karakteri karşılaştırma yaparken bu karakterin sonuna "\r\n" ekleriz. Örneğin girilen veriyi "lambayak" ile karşılaştırmak için; if secenek =='lambayak\r\n' diye kodlamak gerekiyor.

Bu şekilde istediğimiz komutları if yapısında karşılaştırarak ayarlayabiliriz. Daha sonrasında her komut için yapılması gereken işlemleri if bloğuna yazabilirsiniz.

 

Son olarak hem seri ekrana hem de Orange pi terminaline kullanıcıya kolaylık sağlamak için Orange pi çıkışlarının durumunu yazdırıyoruz. Burada pin okumak için "gpio.input(pin ismi)" kullanıyoruz. 

Bu şekilde lamba ve klima için 4 farklı durum olabilir. Lamba açık klima kapalı, lamba açık klima açık, lamba kapalı klima açık ve lamba kapalı klima kapalı. Her bir durum için ekrana toplu durum çıktısı yazdırıyoruz.


Yukarıdaki görüntüye bakarak programın nasıl ilerlediğini görebilirsiniz.

Okuduğunuz için teşekkür ederim. Aklınıza takılan bir soru veya karşılaştığınız bir sorun olduğunda yorumlarda belirtebilirsiniz. Burada eksik olarak anlattığımı düşündüğünüz veya sizlerin gerekli olarak gördüğünüz bilgileri yine yorumlarda yazarsanız, bundan herkesin faydalanmasını sağlamış olursunuz. Herkese iyi çalışmalar.

Hiç yorum yok:

Yorum Gönder

Öne Çıkan Yayın

ORANGE PI PYTHON UART

ORANGE PI PYTHON UART Python kurulum  yazısında Orange pi'de Python konusuna giriş yapmıştık. Daha sonra  Python Gpio  yazısında gir...