Arduino DHT11 Kütüphane İncelemesi -1- Datasheet Okuma

Bizim bu çalışmada Arduino’dan bahsetmemiz sizi aldatmasın. Oldukça ileri seviye bir konuya gireceğiz ve bir sürücünün nasıl yazıldığını inceleyeceğiz. Günümüzde internette DHT algılayıcılar hakkında belki de onlarca farklı kaynak olsa da hepsi birbirinin tekrarı olmakta ve hiçbiri bir ilavede bulunamamaktadır. Bu aslında sadece DHT için değil bütün Arduino kütüphaneleri, fonksiyonları ve uygulamaları için geçerlidir. Aslında çoğu eğitimciler bilgide de birbirini taklit etmekten öte gidememektedir. Bir eğitimcinin kendi yöntemi, üslubu, kaynağı ve çalışma metodu olmalı değil mi ?

Ben yöntemlerim arasında yer alan kütüphane ve kaynak kod incelemeye ayrı bir önem vermekteyim. En zor işlerden biri olsa da öğrenci meseleyi anlamakta ve yapılan bir işi en ince noktasına kadar öğrendikten sonra kendi işini kolaylıkla yapabilmektedir. Biz burada size bir bilgisayar sisteminin donanımını ve programlama dilini en ince ayrıntısına kadar öğretsek de bu bilgilerle bir iş yapmanız biraz zor olmaktadır. Bunun için bilgiyi uygulamada görmeniz gereklidir. Yapılmış bir işi inceleyip ondan ilham almak ve yöntemleri öğrenmek kendi küçük küçük uygulama yaparak kendi yöntemlerinizi geliştirmekten daha etkili olmaktadır. Örneğin değişkenlere nasıl ad vereceğinizi uzun zaman pratik yaparak öğrenmek yerine yazılmış kodları inceleyerek daha kısa sürede öğrenebilirsiniz. İki yöntem de hemen hemen aynı yola çıkmaktadır. Gömülü sistemlerde en zor işlerden biri de sürücü yazmaktır. Bu çalışmanın da sürücü yazmak noktasında size faydalı olacağını umuyoruz.

Konuya Başlarken

Gömülü sistemlerde olduğu gibi bütün dijital sistemlerde de donanım ve yazılım olmak üzere iki keskin ayrım bulunmaktadır. Donanım ve yazılım kendi kulvarlarında sıkıntısız iken donanım ve yazılım arasında bağ kurmak istediğimiz zaman sıkıntılar başlar. Yazılımın en zor alanlarından biri donanım ile yazılım arasında bağ kuran sürücü yazılımlarını yazmaktır. Yazılım üzerine yazılım bina etmek donanım ile yazılım arasındaki bağı kurmaktan daha kolaydır. Normalde biz bilgisayar kullanırken iki tık ile yüklediğimiz ve gerisine karışmadığımız sürücü yazılımları gömülü sistemlerin büyük bir bölümünü teşkil etmektedir. Bir donanım karşınıza çıktığı zaman öncelikle bu donanımı yazılıma sağlıklı bir şekilde aktarabilmeniz gereklidir. Bunun için de bizim “kütüphane” olarak zikrettiğimiz sürücü yazılımlarını yazmak gereklidir.

Diğer eğitimciler DHT11 algılayıcısının ne olduğunu öğrenmek için başka eğitim içeriklerine bakabilir. Orada birkaç cümleden ibaret bir bilgiyi tekrar edip aktarmayı ben doğru bulmuyorum. Bir konuyu anlatmak için o konuda yazılmış birincil kaynakları okuyabilmek gereklidir. O yüzden ben de DHT11 için datasheet yani teknik bilgi kitapçığını indirdim ve okumaya başladım. Şu ana kadar DHT11 ile sadece deneme uygulamaları yapmış ve 2 yıldan fazladır ilgilenmemiş biri olarak bile datasheet okumakla bu konuda elde edilecek en yüksek seviye bilgiyi elde edeceğim.

DHT11 Datasheet

Sürücü yazılımı yazabilmeniz kadar sürücüleri yani kütüphaneleri anlayabilmeniz için de datasheet okuyabilmeniz şarttır. Her ne kadar yazılımsal boyutta buna gerek olmasa da yazılım donanım komutları üzerine bina edildiğinden işin temeli donanım fonksiyonlarını anlayabilmektir. Donanımı bilmeden kütüphane incelerseniz ne yaptığı konusunda bilgi sahibi olup bunu kullanabilirsiniz. Fakat nasıl çalıştığını tam anlamanız mümkün olmaz ve donanım tarafı hep karanlık kalır.

Bu yüzden ben de donanım tarafından başlayıp örnek kod ile bitireceğim. Bunun için datasheet arayışına girsem de DHT11 sensörünün datasheet konusunda sıkıntılı olduğunu görmekteyim. Datasheet diğer büyük firmaların datasheetleri gibi ustaca hazırlanmamış ve pek çok üçüncü parti sürümü mevcut. Bunlar arasında bulabildiğim en gerçek datasheet ise firmanın logosunu içeren ve mizanpajı daha düzgün olan bir belgeydi. Bu belgeyi aşağıdan indirebilirsiniz.

http://www.produktinfo.conrad.com/datenblaetter/1400000-1499999/001405544-da-01-en-TEMP_UND_FEUCHTESENSOR_DHT11.pdf

Burada en başta DHT11’in dijital bir nem ve sıcaklık algılayıcısı olduğunu görüyoruz. Dijital olmasının en olumlu yanı bizi kalibrasyon derdinden kurtarmasıdır.

DHT11’in iç yapısı hakkında datasheette pek fazla bilgi bulamıyoruz. NTC ile sıcaklık ve rezistif parça ile nemi ölçtüğünden bahsedilmiş. Diğer İngilizce siteleri araştırdığımda ise DHT11’in iç yapısı ve çalışma prensibi hakkında ek bilgiler yer almakta. Aslında ben de merak edip zamanında plastik kapağını kaldırıp baktığımda bir entegre, bir NTC ve cama benzer iki elektrotlu rezistif sensör ile karşılaşmıştım. Bu rezistif sensörün çalışma prensibi suyun elektrik direnci ile alakalıdır. Ortada bulunan nem çeken elemanın havadaki nem miktarına göre direncinde değişme olmakta ve bu böyle ölçülmektedir.

Resim: https://lastminuteengineers.com/wp-content/uploads/2018/06/Internal-Structure-of-Humidity-Sensor-in-DHT11-DHT22.jpg

Konuyla ilgili ayrıntılı bilgi için kaynaklar kısmına bakabilirsiniz.

DHT11’in uygulama alanları oldukça geniş olsa da her uygulama için doğru bir algılayıcı olmadığını belirtmemde fayda var. Çoğu yerde istenilen hassasiyet ve doğruluğa sahip olmadığı için ancak en ucuz çözümlerde tercih edilen bir algılayıcı olarak karşımıza çıkmaktadır. Bazen algılayıcılar 100 doları bile geçen fiyatlara sahip olmaktadır. Bizim DHT11’i seçmemiz iyi bir algılayıcı olmasından dolayı değil meşhur bir örnek üzerinden size sürücü yazmayı anlatmak istememdendir.

Algılayıcının parametrelerine baktığımda nem ve sıcaklık için 16-bitlik çözünürlük olduğunu görmekteyim. Bunu bir yere kaydetmem gerekecek çünkü buradan bu değerlerin 16’şar bit olarak bize aktarıldığını anlıyorum. Doğruluk ve hassasiyete baktığımızda pek iç açıcı değerler görememekteyiz. Çalışma gerilimi ise 3.3V ile 5V arasındadır.

Ayak açıklamasına baktığımda besleme ve şase ayaklarının yanı sıra DATA ayağının olduğunu ve bunun tek hat üzerinden çalıştığını görmekteyim. Yani bizim veri hattımız asenkron seri hat olacak ve program yazarken zamanlama önem arz edecek. Bunu da bir kenara kaydettikten sonra bizim için asıl önem teşkil eden yere geliyoruz. “Serial Communications Description” başlığında bu iletişimin nasıl gerçekleştiği konusunda bize bilgi verilmekte.

Seri İletişim

Seri iletişim kısmının zor olması aslında bunun bir protokole bağlanmamasından dolayıdır. Eğer UART, I2C gibi bir protokole bağlı olsaydı basit fonksiyonlarla bile bunu kontrol edebilecektir. Şimdi ise burada yazanları tek tek dikkate alarak bir kütüphane yazmamız ve genel maksatlı giriş ve çıkış portlarındaki bir ayağı buna tahsis etmemiz gereklidir.

Tek hat üzerinde iki yönlü iletişimin sağlanması biraz daha karmaşıklaştırmakta. Öncelikle bu hatta 5.1K pull-up direncinin bağlanması gerektiğini öğreniyoruz. İnternette bazı örnekler bu direnci kullansa da bazıları kullanmamaktadır. 5.1K değerin yaklaşık değer olduğunu bildiğimizden daha yaygın olan 4.7K direnci de kullanabiliriz.

Burada iletişimin ana ve uydu yöntemine dayandığını da okumaktayız. Kısacası bu hattı kontrol eden bir aygıt var ve iletişim bu aygıtın hattı sıfıra çekmesiyle başlamakta. Hat boş haldeyken ise yukarıda bahsettiğimiz pull-up direnci vasıtasıyla 1 konumunda beklemektedir.

Veri iletişiminde 40 bitlik bir paket gönderilmekte ve yüksek bit ilk yollanan bit olmaktadır. Veri formatı ise 8 bit nem tam sayı + 8-bit ondalık + 8-bit sıcaklık verisi + 8-bit sıcaklık ondalık tam sayı verisi + 8-bit eşlik biti şeklindedir.

Yukarıda saydığımız formatı şu şekilde gösterebiliriz.

Burada eşlik biti sol taraftaki dört baytın toplamını bize vermektedir. Yani bu dört baytı toplayıp eşlik baytı ile karşılaştırdığımızda verinin doğru olup olmadığını kolaylıkla bulabiliriz. Aşağıda örnek hesaplaması verilmiştir.
0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101

Eğer bunların toplamı eşlik bitine eşit değilse veri aktarımında hata olduğuna dair bir uyarı verebiliriz.

Şimdi 1 ve 0 şeklinde gelen verilerin mahiyetine bakalım.

Nem ve sıcaklık verileri tam sayı ve ondalık kısmı olmak üzere iki ayrı veri olarak aktarılmaktadır. Tam sayı kısmı onluk tabana çevirildiği zaman sıcaklık veya nem verisi elde edilmektedir. Aşağıdaki örneklerde bunu görebilirsiniz.

Nem: 0011 0101=35H=53%RH
Sıcaklık: 0001 1000=18H=24℃

Şimdi okunacak veriyi anlasak da bunun zamanlamasını öğrenmek zorundayız. Çünkü asenkron iletişimde zamanlama tutmadan sağlıklı veri okumamızın imkanı yoktur. UART protokolünde baud rate olarak belli başlık sabitler olsa da burada tamamen aygıta özel bir zamanlama olduğunu görmekteyiz. Buna göre mikrodenetleyicide bunun için gerekli gecikmeleri vermemiz gerekir.

Öncelikle UART protokolünde olduğu gibi START sinyalini vermemiz gerekli. Bunu ana aygıt olarak yapıyoruz. Biz START sinyalini verdiğimizde DHT11 uyku modundan çıkar ve bize yanıt sinyalini gönderir. Ondan sonrasında ise 40 bitlik veriyi yollamaktadır. Zamanlama diyagramı şu şekildedir.

Burada üçgene benzer şekilde olan ifadeleri aslında kare dalga gibi düşünmeniz gereklidir. Normalde sinyal bu şekilde üçgen değildir. Burada yükselen kenarlar daha iyi ifade edildiğinden genelde dijital aygıtların zamanlama diyagramlarında bu şekilde olduğunu görürsünüz.

Öncelikle DATA ayağının 1 konumunda olduğunu görüyoruz. Bunun 1 konumunda olmasını bağladığımız pull-up direnci ile sağladık. Sonrasında “Host send a start signal” yazan yerde mikrodenetleyicinin ayağını 0 konumuna alıyoruz ve bu durumda SINK yani akım çekme işlemi başlıyor. Akım çektiği için ayak 0 konumuna düştükten sonra bir müddet bekliyoruz ve tekrar ayağı 1 konumuna çekiyoruz. Bu durumda mikrodenetleyici okuma moduna geçmesi gerekli ki algılayıcının ayağından gelen sinyali okuyabilsin.

Mikrodenetleyici okuma moduna geçtiğinde yani ilgili port ayağını giriş olarak ayarladığında hat tekrar pull-up direnci vasıtasıyla 1 konumuna geçecektir. Sonrasında ise “Response Signal” konumunda DHT11 hatta 0 konumuna çekecek ve “Ben hazırım” bilgisini mikrodenetleyiciye verecektir. Mikrodenetleyici artık eli kulağında gelecek sinyalleri beklemektedir. Yanıt sinyalinden sonra hat tekrar 1’e çekilir ve sonrasında yüksek bitten itibaren 40 bitlik aktarım yapılır. Ondan sonra hat tekrar 1 konumuna geçer ve sensör uykuya dalar.

Ben burada sadece resimde anladıklarımı yazdım. Datasheetin devamında bu zamanlama diyagramının ayrıntıları yazmakta. Ben de sizinle beraber bunu ilk defa okumaktayım.

Yukarıdaki şemada zaman aralıklarının ne kadar olacağı konusunda bir bilgi verilmemiş. Bunu devamında öğrenmekteyiz. Öncelikle DHT11’e güç verildikten sonra kendine gelmesi için 1 saniye kadar beklenmesi gerektiği söylenmekte. Pull-up direnci ile 1 konumuna çekildiği zaman DATA ayağının gelen verileri aldığını biliyoruz. Bu durumda bu ayağa mikrodenetleyici sinyal uyguladığı zaman bu algılayıcı kendini ifade edebilecektir.

Bu sinyal de 18 mili saniyeden uzun olmak zorundadır. Kısacası biz ilk iş olarak mikrodenetleyiciden en az 18 mili saniye sürecek bir 0 çıkışı vermemiz gerekli. Bu sinyali verdikten sonra muhakkak çıkış moduna aldığımız ayağı giriş moduna almamız gereklidir. Giriş moduna aldıktan sonra tekrar hat pull-up üzerinden beslenecek ve 1 konumuna geçecektir. Aynı ayak üzerinde okuma yaptığımız için Arduino’da pinMode() fonksiyonunu kullanmamız, AVR’de ise DDR yazmacının değerini değiştirmemiz gerekli.

DHT11 algılayıcısı en az 18 milisaniye süren 0 sinyalinden sonra hattın 1’e çekildiğini görünce bizim mikrodenetleyicinin ayağını giriş yaptığımız gibi o da kendi ayağını çıkışa ayarlayacaktır. Burada bir miktar gecikme yaşandıktan sonra 80 mikro saniye “1” ve 80 mikro saniye “0” sinyali verecektir. Buna “response signal” adı verilmektedir. Kısacası ben veriyi yolluyorum demektir.

Bundan sonra artık DHT11 algılayıcısı bize veri gönderecek. Biz ise belli zaman aralıkları ile bu veriyi okuyup 1 ve 0 olarak kaydedeceğiz. Eğer bu zamanlamaya riayet etmezsek doğru veri okumamız mümkün olmaz. Burada “1” ve “0” formatının UART protokolünden çok uzakta olduğunu görmekteyiz. “0” formatındaki veri 50 mikro saniye “0” ve 26-28 mikrosaniye “1” durumunda kalmakta, “1” formatındaki veri ise 50 mikro saniye “0” ve 70 mikro saniye “1” formatında kalmaktadır. Yani ilk 50 mikro saniyede ikisi de sıfır değeri vermekte sonrasında ise sinyalin genişliğine göre verinin bir mi sıfır mı olduğunu bize söylemektedir.

 

Sinyal bittiği zaman ise algılayıcı 50 mikro saniyelik bir 0 çıkışı vermektedir.

İşte DHT11’in çalışma prensibi bundan ibarettir. Kopyala yapıştır kodla yapılan bir projenin arka planında ne kadar karmaşık işler olduğunu ve çoğu öğrencinin bu bilgilerden mahrum olmakla büyük şey kaybettiğini görebilirsiniz. Şimdi kütüphane kısmına geçelim ve işin yazılımsal boyutuna bakalım.

Kaynaklar,
https://lastminuteengineers.com/dht11-dht22-arduino-tutorial/

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.