Ebay dan sipariş verdiğim DHT11 sıcaklık ve nem sensörü elime ulaşır ulaşmaz hemen bir deneme yapayım dedim. DHT11 düşük maliyetli dijital (one wire) bir sıcaklık ve bağıl nem ölçer. Tam da raspberry piye göre. DHT11 in bacak şemasını aşağıdaki şekilde de görebileceğiniz gibi. 1 bacak Vcc , ikinci bacak Data ve 4. bacak ise Toprak (Gnd) 3. bacak NC (not-connected) yani kullanılmıyor. DHT11 in veri sayfasına göre göre 3.3v-5.5v aralığında beslenebiliyor ve 50 santigrat dereceye kadar sıcaklık ölçebiliyor yaptığım denemelerde 50 derecenin de üzerinde ölçüm yapabildiğini belirtmek istiyorum.
Program Kodunun Derlenmesi
Drogon un WiringPi kütüphanesini yükledikten sonra aşağıdaki kaynak kodu şu şekilde derleyin:
gcc -o dht11 dht11.c -l wiringPi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/* * Simple test program to test the wiringPi functions * DHT11 test */ #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAXTIMINGS 85 #define DHTPIN 7 int dht11_dat[5] = { 0, 0, 0, 0, 0 }; void read_dht11_dat() { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0; /* pull pin down for 18 milliseconds */ pinMode( DHTPIN, OUTPUT ); digitalWrite( DHTPIN, LOW ); delay( 18 ); /* then pull it up for 40 microseconds */ digitalWrite( DHTPIN, HIGH ); delayMicroseconds( 40 ); /* prepare to read the pin */ pinMode( DHTPIN, INPUT ); /* detect change and read data */ for ( i = 0; i < MAXTIMINGS; i++ ) { counter = 0; while ( digitalRead( DHTPIN ) == laststate ) { counter++; delayMicroseconds( 1 ); if ( counter == 255 ) { break; } } laststate = digitalRead( DHTPIN ); if ( counter == 255 ) break; /* ignore first 3 transitions */ if ( (i >= 4) && (i % 2 == 0) ) { /* shove each bit into the storage bytes */ dht11_dat[j / 8] <<= 1; if ( counter > 16 ) dht11_dat[j / 8] |= 1; j++; } } /* * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte * print it out if data is good */ if ( (j >= 40) && (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) ) { printf( "Sicaklik = %d.%d *C Nem = %d.%d %%n", dht11_dat[2], dht11_dat[3], dht11_dat[0], dht11_dat[1] ); }else { printf( "Veri alinamadi, geciliyorn" ); } } int main( void ) { printf( "Raspberry Pi wiringPi DHT11 sicaklik ve nem olcum programin" ); if ( wiringPiSetup() == -1 ) exit( 1 ); while ( 1 ) { read_dht11_dat(); delay( 500 ); /* wait 1sec to refresh */ } return(0); } |
DHT11’in Besleme ve Veri Bağlantısının Yapılması
DHT11’in beslemesini Raspberry üzerinden yapacaksanız 3.3v’luk beslemeyi kullanmalısınız, çünkü BCM chip’i de dahil asıl Raspberry bileşenleri ve GPIO pinleri 3.3v seviyesi için tasarlanmıştır. Sensörden dönecek 5v’luk sinyal portların arızalanmasına neden olur. Eğer uzun bir sensör kablosu kullanmıyorsanız 3.3v ile besleme yaptığınızdan emin olun. Eğer DHT11’in data ucu ile Vcc ucu arasına 10K’lık bir direnç (pull-up) bağlarsanız bir gerilim bölücü elde etmiş olursunuz bu durumda DHT11’i 5v ile besleyebilirsiniz. Diğer taraftan yeterince uzun bir kablo da gerilim bölücü olarak çalışacaktır (5v besleme geriliminin bir kısmı kablo üzerine düşecektir) bu durumda kablonun üzerine ne kadar gerilim düştüğünü ölçmeniz/hesaplamanız yerinde olacaktır. Raspberry 1.3v’ün üzerindeki değerleri mantıksal 1 olarak kabul eder buna göre uygun bir direç değeri seçebilirsiniz.
DHT11 in beslemesini yapıp Data bacağını GPIO4 (bcm) pinine bağladıktan (wiringPi 7 numaralı pin) sonra aşağıdaki gibi derleyip programı çalıştırabilirsiniz.
Dikkat ettiyseniz ara ara “Veri alinamadi” mesajları geçiliyor. Bunun asıl nedeni Raspbian işletim sisteminin çok görevli (multi task) bir işletim sistemi olması. Raspbian DHT11 ile çok yüksek hızlarda iletişim kurması gerekirken arada başka işlemlere de vakit ayırdığı için bu iletişim sinyal zamanlaması açısından sağlıklı bir şekilde gerçekleşemiyor ve arada sekteye uğruyor. Bunun nedeni DHT11 in sinyal işlemcisi ile seri olarak kurulan iletişimin uS (mikro saniye) ‘ler ölçeğinde gerçekleşmesi gerektiği. Yani çok hızlı gerçekleşmek zorunda olması. Aslında hali hazırda bir portu (GPIO) işgal eden ve saniyede en fazla 1 kere okuyabileceğimiz bir sensör ile neden MHz hızında iletişim kurmamız gerekiyor düşündürücü. Bunun cevabı da bir uzmanlık sorusu olsa gerek.
Aşağıdaki diyagramda da görebileceğiniz gibi mikro saniyelik sinyal zamanlamaları ile DHT11 – Raspberry arasında oluşturulan seri protokol, raspbian in başka proseslere ve kesmelere vakit ayırmasından dolayı sekteye uğruyor ve giriş çıkış komutları anlamsız değerler olarak geri dönüyor.
Raspberry Pi gibi realtime olmayan ve gerçek zamanlı işler için güvensiz kabul edilen sistemlerde bu sorunu çözmenin 2 yolu var. İlki ve en çok tercih edileni mikroişlemci yerine mikrodenetleyicili bir sistem ile arabirimleme yapmak örneğin bir PIC serisi mikrodenetleyici ile DHT11’i okuyup I2c ile Raspberry’e gönderebilirsiniz. Veya arduino ile de aynı şeyi yapabilirsiniz. Bir diğer yöntem de gerçek zamanlı bir işletim sistemi kullanmak. Örneğin RISC OS
Kısmi çözüm ise kernel mode driver (kernel modul) derlemek. Çekirdek modülü eklemek de başarısız iletişim kayıplarından tam olarak kurtarmayacak ama burada anlattığım yönteme göre bir miktar başarım artışı sağlayacaktır. DHT11 için çekirdek modülü derlemek için buradaki kodu kullanabilirsiniz. Ancak daha önce burada anlatılanları yapıp bir derleme ortamı oluşturmalısınız.
[Yükleme bulunamadı.]DHT22’yi de Merak Edebilirsiniz
DHT11’in abisi olan DHT22 daha hassas ve geniş bir ölçüm aralığına sahip ve saniyede 2 ölçüm yapabiliyor. DHT11 ve DHT22 nin belli başlı özellikleri şöyle:
DHT11
Ultra low cost
3 to 5V power and I/O
2.5mA max current use during conversion (while requesting data)
Good for 20-80% humidity readings with 5% accuracy
Good for 0-50°C temperature readings ±2°C accuracy
No more than 1 Hz sampling rate (once every second)
Body size 15.5mm x 12mm x 5.5mm
4 pins with 0.1″ spacing
DHT22
Low cost
3 to 5V power and I/O
2.5mA max current use during conversion (while requesting data)
Good for 0-100% humidity readings with 2-5% accuracy
Good for -40 to 125°C temperature readings ±0.5°C accuracy
No more than 0.5 Hz sampling rate (once every 2 seconds)
Body size 15.1mm x 25mm x 7.7mm
4 pins with 0.1″ spacing
Kaynaklar:
http://rpi-experiences.blogspot.com.tr/2013/07/rpi-monitor-use-dht11-or-dht22-humidity.html
https://raspberrypi.stackexchange.com/questions/1408/is-it-possible-to-run-real-time-software
https://learn.adafruit.com/dht/overview

Bu sensöre su değdiği zaman bozuluyor mu? Yani sıcaklığı ölçük de örneğin yağmur yağması gibi bir durumu veya evi su basması gibi bir durumu nasıl kontrol edebiliriz? Bu noktada bu sensör işe yarar mı?
Merhaba,
DHT11’in veri sayfasına bakarsanız azami %60 nem ölçebildiği yazılı. Sizin sorduğunuz sıvı formdaki nem yani su ise %100 bağıl neme (RH) karşılık geldiği için bu sensör ile bunu yapmanız mümkün değil.
Sıvı ölçmek için ebay’dan bulabileceğiniz şu sensor işinizi görebilir:
http://www.ebay.com/itm/Humidity-Detection-Sensor-Module-Rain-Detection-for-Arduino-Raspberry-pi-/221401995410?pt=LH_DefaultDomain_0&hash=item338c965892
İşinizi görebilir dedim çünkü bu tür sensörler ölçme yerine şunu yapıyorlar: üzerindeki trimpot ile eşik değerini ayarlıyorsunuz bu eşiği geçtiğinden raspberry’e (dijital input) 1 sinyali gönderiyor. Yani sadece belli bir eşiği geçip geçmediğini algılatabiliyorsunuz. Diğer taraftan yağmur miktarını/metrekareye düşümünü ölçmek için özel bir tasarım yapmak gerekir.
Biraz önce yaptığım kablo uzunluk testini not düşüyorum. Vcc ve Vdd kablolarına dokunmadan (30cm) data kablosunu 23 metreye kadar okutabildim. Kullandığım kablolar 72cm’den bir ek yapılmış çok damarlı bakır iletkenden oluşuyor.
Merhabalar, öncelikle güzel yazılarınız için teşekkür etmek isiyorum. Merak ettiğim bu kodlar DHT22 ile de uyumlu olarak çalışır mı?
iyi çalışmalar