CEYD-A ile Akıllı Ev Sistemi Oluşturmak

Web servis yapısını kullanarak CEYD-A’ya metin formatında sorduğumuz sorular CEYD-A tarafından yorumlanarak dönen cevapları uygulamalarınızda kullanabilirsiniz. Web servisine bir bilgisayar üzerinden ya da Arduino, Esp, Raspberry Pi gibi devre geliştirme kartları üzerinden bağlanabiliriz. Örnek olarak Raspberry Pi üzerinden CEYD-A web servislerini kullanan bir uygulama yapacağız.

Uygulama ile gün batımı vakti araştırılıp akşam olup olmadığı tespiti yapılıyor ve duruma göre sınıftaki lambalar ESP8266 ile yaptığımız bir devre vasıtasıyla yakılıyor.

Raspberry Pi 3 Model B: Raspberry Pi ARM işlemci tabanlı olarak çalışan bir mini bilgisayardır.

Raspberry Pi için hem Linux hem de Windows ortamında uygulama geliştirilebilir. Linux ortamında Python, C veya C++ dilleri ile uygulamalar geliştirebileceğiniz gibi Windows ortamında ise C# dili ile uygulama geliştirebilirsiniz. Biz uygulamamızı Linux tabanlı Raspbian Jessie işletim sistemi yüklü olan Raspberry Pi üzerinde Python programlama dili ile geliştireceğiz. Raspbian Jessie işletim sistemi imajını

http://www.raspberrypi.org/downloads

adresinden indirebilirsiniz. İşletim sistemi imajını SD kart içerisine Windows ortamında yazdırabilmek için

http://sourceforge.net/projects/win32diskimager/

adresinden indireceğimiz win32diskimager isimli uygulamayı kullanıyoruz.

Raspberry Pi üzerinde ses algılama için bir usb mikrofon kullanılabileceği gibi, Raspberry Pi üzerindeki pinlere header şeklinde takılabilen harici shield’lar da kullanılabilir. Takılı olan usb mikrofonun Raspberry Pi tarafından algılanıp algılanmadığını komut satırından

komutunu girerek test edebilirsiniz. Herhangi bir problem yoksa takılı olan mikrofon listelenecektir.

Yapacağımız uygulamada ise Raspberry Pi üzerindeki pinlere header şeklinde takılabilen Matrix Creator harici shield kullandık. Matrix Creator, üzerinde 8 adet mikrofon ve çeşitli sensörler bulunan bir shield’dır. Bu ürünle standart mikrofonlara göre daha profesyonel olarak ses algılaması yapmanız mümkündür.

İlgili ürünle alakalı detaylı bilgiye

https://www.matrix.one/products/creator

adresinden ulaşabilirsiniz.

İlk adım olarak Matrix Creator için gerekli kütüphaneleri Raspberry Pi üzerine yüklememiz gerekiyor.

Öncelikle Matrix GitHub reposundan gerekli dosyaları indireceğiz.

Ardından Raspberry Pi işletim sistemini güncelliyoruz.

Daha sonra Matrix Core paketlerini yüklüyoruz.

Raspberry Pi kartımızı yeniden başlatıyoruz.

Son olarak ZeroMQ kütüphanesini kuruyoruz.

ZeroMQ yüksek performanslı bir asenkron mesajlaşma kütüphanesidir. Uygulamamızda Raspberry Pi ile Matrix Core shield’ın haberleşmesi amacıyla kullanılmaktadır.

Matrix Core ses sürücülerinin yüklenip yüklenmediğini

komutu ile test edebilirsiniz. Sürücüler doğru yüklendiğinde

gibi bir sonuç çıkacaktır. Eğer bir hata oluşursa

komutu ile nano editörünü kullanarak alsa.conf dosyasını açınız ve

pcm.front cards.pcm.front

şeklinde gördüğünüz satırları

pcm.front cards.pcm.default

şeklinde değiştirerek dosyayı kaydediniz.

Ses codec dosyalarını kurmak için

komutunu kullanıyoruz.

Bu işlem adımlarını

https://matrix-io.github.io/matrix-documentation/matrix-core/getting-started/core-installation/

kısmen adresinden de okuyabilirsiniz.

Artık Python programlama dili için gerekli kütüphaneleri kurmaya başlayabiliriz. İlk olarak Matrix Creator Python kütüphanelerini kuracağız. Kütüphaneleri kuracağımız klasörü oluşturuyoruz.

Gerekli Matrix Core kütüphanelerini indirip kuruyoruz.

Kurulumda python pip kütüphanesi yerine pip3 kullanacağımız için python pip3 kütüphanesini kuruyoruz.

Son olarak python 3 için gerekli paketleri yüklüyoruz.

Bu işlem adımlarını

https://matrix-io.github.io/matrix-documentation/matrix-core/getting-started/python-installation/

adresinden de okuyabilirsiniz.

Sonraki aşamada ses işlemek için gerekli kütüphaneleri Python içerisine yükleyeceğiz. Python ile sesi algılayarak yazıya çevirmek için SpeechRecognition kütüphanesini kullanabilirsiniz. Online ya da offline olarak çalışabilmektedir. Bu kütüphane aşağıdaki ses motorları ve apilerini desteklemektedir:

  • CMU Sphinx (offline)
  • Google Speech Recognition
  • Google Cloud Speech API
  • Wit.ai
  • Microsoft Bing Voice Recognition
  • Houndify API
  • IBM Speech to Text
  • Snowboy Hotword Detection (offline)

SpeechRecognition kütüphanesini Python 3 içerisine kuruyoruz.

Daha sonra PyAudio kütüphanesini ve gerekli diğer ses kütüphanelerini kuruyoruz.

Yazıyı sese dönüştürmek için Google Text-To-Speech api kütüphanesini kullanıyoruz.

Mp3 dosyaları ile işlem yapabilmek için sox mp3 kütüphanesini yüklüyoruz.

Artık kodlama aşamasına geçebiliriz.

https://beta.ceyd-a.com/

sitesinden kayıt olarak user name ve token bilgilerimizi alıyoruz.

Bu işlemin ardından Öncelikle CEYD dilini kullanarak soru kalıbını oluşturalım. Komutumuz aşağıdaki gibi olacak:

Sorumuz ile eğer hafta içi ve gündüzse lambaları yakmayı, aksi takdirde lambaların yakılmamasını hedefliyoruz. Dolayısı ile hem hafta içi / hafta sonu kontrolü, hem de gece / gündüz kontrolünü yapacağız.

Soru ve şablonumuz şu şekilde olacak:

BAŞ şeklindeki ifadeler herhangi bir ifade olabilir.

Hafta içi / hafta sonu olup olmadığını anlamak için öncelikle haftanın hangi günü olduğunu öğrenmemiz gerekiyor. Bunun için

Satırı ile günü öğrenerek gun değişkenine aktarıyoruz.

Satırında ise eğer gun değişkeninin değeri “Cumartesi” veya “Pazar” ise gundurumu değişkenine “haftasonu”, değilse “haftaici” değerini aktarıyoruz.

Gece / gündüz olup olmadığını anlamak için CEYD-A’nın ezan vaktinin geçip geçmediğini anlamakta kullandığı komutları kullanacağız.

 

Şeklindeki komut kullanımında örneğin bu soruyu sorduğumuzda vakit yatsı vakti ise “çoktan geçti” şeklinde bir cevap dönecektir. Bu komutu

şeklinde kullanabiliriz. Böylece “akşam oldu mu?” sorusuna cevap olarak eğer “geçti” değeri dönerse vakit değişkeni “Gece” değerini alırken, aksi takdirde “Gündüz” değerini alacaktır.

Ancak kod satırlarını kısaltmak için hafta içi / hafta sonu ve gece / gündüz kontrolünü bir arada yaparak iki değişkenin sonucuna göre lamba yakma / söndürme işlemi yapacağız. Komutumuzu bunun için aşağıdaki gibi yazıyoruz:

Bu şekilde eğer hafta içi ve gündüzse komut değişkeni “LEDOn” değeri alırken, diğer durumlarda “LEDOff” değeri alacaktır.

Son olarak

satırı ile yapılan işlemler sonucunda komut değişkeninin içeriğini geriye döndürüyoruz. “LEDOn” ve “LEDOff” değerlerini Raspberry Pi içerisinde Python dili ile yapacağımız uygulamanın kodlanmasında kullanarak buna göre lamba yakma / söndürme işlemi gerçekleştireceğiz.

Oluşturmuş olduğumuz komutu

http://ceyd-a.net/komutekle

adresinden yüklüyoruz. Burada kırmızı kalem simgesine tıklayarak komutumuzu oluşturuyoruz.

Burada oluşturmuş olduğumuz komutun tüm CEYD-A kullanıcıları tarafından kullanılmasını istersek YAYIL butonuna tıklamalıyız. (Bu işlem için komutun önce onaylanması gerekmektedir.) Aksi takdirde bu komutu sadece biz kullanabiliriz. Komutu şimdilik sadece kendimiz kullanacağımız için bu seçeneği tercih ediyoruz.

Şimdi Raspberry Pi içerisinde Python dili ile yazacağımız kodlama işlemine geçelim. Öncelikle CEYD-A web api bağlantımızı test etmek için aşağıdaki gibi bir kod yazalım:

Kodumuzda params değişkeni içerisindeki username, token, code ve type değerlerini POST yöntemini kullanarak CEYD-A web servisine ulaşıyoruz. code alanında yazdığımız metin yorumlanıp cevap olarak döndürülüyor. Cevap olarak düz metin formatında dönüş olması için type alanını text olarak belirlememiz gerekiyor.

Dönen cevap metnindeki JSON verilerini json.loads() metoduyla Python dictionary verisine çeviriyoruz. Dictionary içerisindeki değerlerden ilgili cevap metnini alarak ekrana yazdırıyoruz. Örneğin yukarıdaki kod satırlarını çalıştırdığımızda CEYD-A sistem saatini cevap olarak bize geri döndürecektir.

Eğer yukarıdaki kod satırlarını çalıştırdığınızda herhangi bir hata oluşmadıysa asıl uygulamamızın kodlamasına geçebiliriz.

 

Kodumuzda speech_recognition kütüphanesini sesi algılayarak yazıya dönüştürmek için kullanırken google_speech kütüphanesini ise yazıyı sese dönüştürmek için kullanıyoruz.

satırında mikrofondan gelen sesi algılayan getSound() metodunu çağırarak dönen değeri data değişkenine aktarıyoruz.

satırlarında mikrofondan veri almaya başlıyoruz. adjust_for_ambient_noise () metodu, ses tanıyıcıyı sesin gürültü seviyesine göre ayarlamak için bir ses akışının ilk saniyesini okur. Bu genellikle sesin konuşma içermeyen kısımlarının transkripsiyona sokulmasını engeller. r.listen() metodu ile ilk sözcüğü dinleyerek ses verisini alıyoruz.

satırında Google Speech Recognition kütüphanesini kullanarak ses verisini işleyerek tanıma işlemini gerçekleştiriyoruz ve elde edilen değeri data değişkenine aktarıyoruz.

satırında ise sesinizin tonuna göre veriler büyük küçük harf şeklinde geldiği için veriyi küçük harfe çeviriyoruz. Metodumuz son olarak

satırında data değişkeninin değerini geriye döndürecektir.

satırı ile ilgili açıklamayı bir önceki örneğimizde açıklamıştık. Lambayı kontrol etmek için iki yöntem kullanacağız. Birincisinde basitçe sesle verilen komuta göre data değişkeninin değerine bakarak lambayı kontrol ederken, diğeri ise sesle verilen komutu CEYD-A’ya göndererek dönen cevap değişkeninin değerine bakarak lambayı kontrol edeceğiz.

Birinci işleme göre

ya da

şeklinde data değişkeninin değerine göre doğrudan sesle verilen komuta göre işlem yapmaktadır.

İkinci işleme göre ise

ya da

şeklinde CEYD-A ya gönderilen soru ifadesine dönen cevap değişkeninin değerine göre işlem yapmaktadır.

Her iki yöntemde de işlem sonucuna göre

satırlarında request nesnesinin post metodunu kullanarak 192.168.4.2 IP adresine LEDOn ya da LEDOff parametresini göndermektedir. 192.168.4.2 IP adresi ESP 8266’nın varsayılan IP adresidir. ESP 8266 içerisine yazdığımız kodlara göre bu parametreleri kullanarak lambayı yakacak ya da söndüreceğiz.

satırlarında görüldüğü gibi lamba ile işlem yaptıktan sonra kullanıcıyı sesle bilgilendiriyoruz. Lang parametresini daha yukarıdaki kod satırlarında lang = “tr” şeklinde Türkçe olarak belirlemiştik.

Uygulamamızın elektronik kısmında sesli asistan komutlarını kullanarak bir lambayı kontrol edeceğiz. Öncelikle uygulamanın bu kısmının profesyonel bir elektronik bilgisi gerektirdiğini belirtmeliyim. Çünkü 220V ile beslenen bir lambayı bir röle yardımıyla ESP8266 yardımıyla wi-fi üzerinden kontrol edeceğiz. Bu işlem 220V ile işlem gerektirdiği için uygulamayı iki seçenekli olarak gerçekleştireceğiz. Birinci şekliyle ESP8266 ile 3V kullanarak bir led lambayı yakan, ikinci halinde ise bir röle yardımıyla 220V bağlı olan bir lambayı kontrol eden uygulama yapacağız. Elektronik bilgisi amatör ya da giriş seviyesinde olanların güvenlik açısından birinci uygulamayı yapmalarını tavsiye ediyorum.

ESP8266 küçük boyutlu, az güç harcayan wi-fi özellikli bir devre geliştirme kartıdır. Üzerinde bulunan iki adet GPIO portu yardımıyla portlara değer gönderme ve portlardan değer okuma işlemi gerçekleştirebilirsiniz. Düşük fiyatıyla ön plana çıkmaktadır.

ESP uygulamalarınızı Arduino IDE’si ile yazarak bir USB/Seri Dönüştürücü üzerinden ya da Arduino üzerinden yükleyebilirsiniz.

İlk uygulamamız olan ESP8266 ile 3V kullanarak bir led lambayı yakmak için devre bağlantımız aşağıdaki gibi olacak:

Diğer uygulamamızda bir röle yardımıyla 220V bağlı olan bir lambayı kontrol eden uygulamanın devre şeması ve baskı devresi aşağıdaki gibi olacak:

 

Devreyi beslemekte kullanacağımız 220V’u 3.3V’a dönüştüren devrenin bağlantı şeması ise aşağıdaki gibi olacak:

220V’u 3.3V’a dönüştüren bağlantı şeması

Bu devreyi kendiniz yamka yerine, hazır olarak satılan 220V’dan 3.3V’a düşüren hazır bir devre alıp voltaj besleme işlemini bu şekilde gerçekleştirebilirsiniz. Devremizde trafo kullanıldığı ve trafo sarma işlemini gerçekleştirmemiz zor olacağı için biz de bu yöntemi tercih ettik ve size de yandaki resimde görüldüğü gibi hazır bir devre kullanmanızı öneriyoruz.

 

Her iki devre bağlantısı için de ESP 8266 içerisine yükleyeceğimiz kod ise aynı olacak.

Kodumuzda bir web server oluşturmak için yazdığımız html kodlarını HtmlString değişkenine aktarıyoruz. Bu kodlarla bir web sayfası üzerinde butonlar oluşturarak 192.168.4.2 ip adresine bağlanıldığında bu sayfanın görüntülenmesini sağlayacağız.

Satırı ile server kuruyoruz. Parentez içerisindeki “80” ifadesi ise port numarasıdır ve genelde “80” numaralı port kullanılır. Böylece bir server kurarak, buna bir port ataması yapıyoruz.

satırında ise htmlRes isimli değişkenin içerisine aktardığımız HTML kodlarını, sunucuya gönderiyoruz. 200 numaralı durum kodu, sunucu ile başarılı bir şekilde bağlantı kurulduğunda onay vermek amacıyla kullanılır.

satırlarında server’ı çalıştırıyoruz. İlk satırda “/” karakteri ile, dizin oluşturup, handleRoot metodumuzdaki bilgileri çağırıyor ve html kodlarımızın çalıştırılıp ilgili sayfanın gösterilmesini sağlıyoruz. Daha sonra sırasıyla ip adresi üzerinden /LEDOn ve /LEDOff yazıldığında çalışacak olan handleLedOn ve handleLedOff metotlarımızı çağırıyoruz.

satırında ise server’ı başlatıyoruz. Böylece 192.168.4.2 IP adresine bağlanıldığında görüntülenecek olan HTML sayfası kodlarını oluşturmuş olduk. Bu sayfaya 192.168.4.2/LEDOn şeklinde bağlanıldığında lamba yakılacak, 192.168.4.2/LEDOff şeklinde bağlanıldığında ise lamba söndürülecektir. Bu değerleri raspberry pi üzerinden esp8266 vasıtasıyla ip adresine göndereceğiz.

Uygulamanın çalışır haline dair videoya aşağıdan ulaşabilirsiniz.

 

 

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.