"Kembali Ke Dasar Elektronika Digital ... "

Jumat, 17 Mei 2013

DHT-11: Sensor suhu dan kelembaban murah meriah

courtesy of : http://www.candrian.gr/index.php/dht-11-one-wire-bus/

Sensor DHT-11 merupakan sensor suhu & kelembaban versi LOW COST dengan hasil yang "cukup". Jika membutuhkan hasil yang lebih stabil maka kita perlu menggunakan sensor buatan sensirion SHT-11 dan seri sejenis.


Spesifikasi:

Supply Voltage: +5 V
Temperature range :0-50 °C error of ± 2 °C
Humidity :20-90% RH ± 5% RH error
Interface: Digital


  



Data bus sensor ini bukan TWI / I2C melainkan bus tersendiri dimana nilai 1 & 0 dibedakan melalui LEBAR PULSA HIGH

sebelum lanjut lebih mendalam, sebaiknya bagi yang belum menguasai penulisan ke LCD agar mempelajarinya disini.


skematik yang kita gunakan adalah sebagai berikut:






Lanjut kita akan bahas scriptnya, tapi hanya dibagian DHT11 nya, untuk detail LCD harap membaca posting sebelumnya (LCD & ADC/termometer LM35 terutama dibagian ITOA)

seperti sumber link diatas , 1 PIN I/O akan berfungsi sebagai Output dan Input bergantian, untuk langkah pertama akan dikirimkan perintah START oleh micro ke DHT 11



jadi kita kirim pulsa Low 18ms dan High 40us, lalu kita tunggu sebentar sampai ada response/jawaban dari DHT 11 berupa pulsa low - high selebar 54us & 80us



setelah itu hasil pengukuran akan dikirimkan sensor menggunakan format 8bit sebanyak 5 kali


scriptnya seperti yang dibawah ini :


void baca_sensor()
{

char dum;  // variabel sementara

suhu=0;
humi=0;
counter=0;

DDRD|=(1<<PD3); //PD3 sebagai output
_delay_ms(250);

PORTD &=~(1<<PD3); // nolkan PD3
_delay_ms(18); //tunggu 18 ms

PORTD |=(1<<PD3); // naikkan PD3
_delay_us(40); //tunggu 40us


DDRD &=~(1<<PD3); //PD3 sebagai input

//tunggu response dari DHT11

while(counter <100)
{
_delay_us(1);
counter++;
if (bit_is_set(PIND, 3)) break;
}

counter=0;

while(counter <100)
{
_delay_us(1);
counter++;
if (bit_is_clear(PIND, 3)) break;
}


//baca data setelah response, lihat script di pembahasan selanjutnya untuk routine hitung()

//8 bit pertama ( puluhan kelembaban )
humi=hitung();
//8 bit kedua( satuan kelembaban ), tidak usah di baca karena nilai selalu 0 untuk DHT11
hitung();
//8 bit ketiga ( puluhan suhu )
suhu=hitung();
//8 bit keempat ( satuan suhu ), tidak usah di baca karena nilai selalu 0 untuk DHT11
hitung();

//8 bit ke 5 tidak perlu dihitung 
//tulis lcd
lcd_gotoxy(9,0);
itoa(suhu,&dum;);
lcd_puts(&dum;);

lcd_gotoxy(9,1);
itoa(humi,&dum;);
lcd_puts(&dum;);



}
pada script diatas ada trick menggunakan variabel counter dan delay 1us, ini cara yg paling gampang dan menyederhanakan proses counter terhadap lebar pulsa
Setiap bit yang dikirim dimulai sinyal Low sepanjang 54uS , kemudian dikuti 24uS sampai 70uS sesuai bit yang diwakilinya. 
Bit '0' : ~54uS Low  kemudian ~24uS High
Bit '1' : ~54uS Low kemudian ~70uS High

Pada akhir paket data yg diberikan oleh DHT-11 akan muncul sinyal Low sepanjang 54uS dan kemudian bus menjadi high selamanya dan masuk ke sleep mode.

Script berikut menyederhanakan perhitungan dengan trick counter dan delay, dimana jika counter melebihi 24 , maka kita anggap nilainya 1 dan sebaliknya

uint8_t hitung(void)
{

uint8_t a,counter,hasil;

counter=0;
hasil=0;

for (a=8;a>0;a--) // 8 kali tiap perhitungan
{


while(counter <100) // deteksi saat LOW ( tidak ada perhitungan)
{
_delay_us(1);
counter++;
if (bit_is_set(PIND, 3)) break; //tunggu sampai high dan keluar loop
}

counter=0;

while(counter <100)
{
_delay_us(1);
counter++; // counter mendeteksi lebar pulsa
if (bit_is_clear(PIND, 3)) break; //jika low maka keluar dari loop
}

// perhitungan 8 bit decimal dengan geser-geser bit
//jika lebih 25us =1 , kurang < 25 us = 0
 
if(counter > 25) hasil += (1 << (a-1)) ; 

counter=0;

}

return hasil;


}

mudah bukan ? dan hasilnya lumayan mengecewakan jika dibanding dengan sensor yg paten sekelas SHT 11



SELAMAT MENCOBA



Share:

15 komentar:

  1. Bagus nih, kebetulan saya juga lagi ngerjain tugas akhir pake dht11. kalo boleh tau, program nya untuk atmega16 sama dengan yang diatas ato tidak?
    terima kasih sebelumnya :D

    BalasHapus
  2. untuk ATmega16 sama saja, tinggal menyesuaikan pin dan ada perbedaan di register yang berhubungan dengan interrupt

    BalasHapus
  3. mas, klo di bagian interrupt programnya apa?

    BalasHapus
  4. Om Yudi, yg listing kedua ini artinya apa ya uint8_t a ?

    BalasHapus
  5. uint8_t a , ini artinya variable a tipenya unsigned integer 8 bit

    BalasHapus
  6. char dum; untuk apa Om?
    terus, ini apa bisa om,humi=hitung();?
    kan beda bentrok ama type data om.

    Matur sukseme

    BalasHapus
  7. dum sebagai memory sementara untuk ntarnya dirubah menjadi ascii via itoa , humi=hitung(); ...lihat di sub routin hitung() kan typenya integer dan return nya ada dibelakang, jadi sub routine dapat memberikan hasil ke pemanggilnya ....belajar bahasa C dulu sana gih !! ada kok di blog ini

    BalasHapus
  8. Mas, ini perlu library tambahan?

    BalasHapus
  9. mas nyoman , saya tadi coba cari di pasar genteng , kata si penjualnya sensor suhu dht 11 skitar 300 rb an sedangkan lcd hd44780 sekitar 1 jt an ,, kira2 emang harganya segitu ya mas ? terus klo sampean ada yg lebih murah , boleh donk saya order di sampean .. soalnya lg pengen nyoba nih ,, hehehe terimakasih sebelumnya mas

    BalasHapus
    Balasan
    1. Dht 11 ga dijual di genteng, yg ada sht11 yg harganya memang segitu. Kali lcd nta mungkin salah tanggap dikira lcd tv paling. Lcd 2 baris harga cuman murah...pm untuk harga, barang ready semua

      Hapus
  10. oke mas , lanjut via sms ya . terimakasih

    BalasHapus
  11. maaf mas, mau tny..perbedaan sensor SHT dengan DHT apa ya mas..masih belajar ni
    mohon dbantu ya mas

    BalasHapus
  12. Bli nyoman mau nanya .cotoh lib,sama coding dht11 bahasa c ada nggak tolong kirimin ya...wayanmertayasa174@gmail.com

    BalasHapus
  13. lalu yg saya tulis diatas itu napi pak wayan ? coding C bukan ya namanya?

    BalasHapus
  14. terima kasih mas tutorialnya, data yang dikirim sensor dalam bentuk biner kan mas? yang diprogram geser-geser bit, terus bagaimana caranya diterjemahkan jadi desimal ya?
    Muhammad Aldrin

    BalasHapus

Kontak Langsung



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

ANTI SPAM !



Blog Ini Mendukung Blogger Indonesia Yang Jujur dan Memberikan Informasi Sebenarnya, Bukan Menyampah Demi $Rp$ Yang Hanya Merendahkan Blogger Indonesia

Site View

Categories

555 (6) 7 segmen (3) adc (3) amplifier (1) analog (9) android (11) attiny (1) attiny2313 (16) blog (1) bluetooth (1) cmos (1) dasar (31) display (2) gcc (1) infrared (2) Input Output (3) jam (6) jualan (10) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (9) komputer (3) komunikasi (1) kontrol (2) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (48) mikrokontroller (1) mikrotik (4) paket belajar (19) palang pintu otomatis (1) pcb (2) project (33) proyek (1) radio (3) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (2) sms (5) software (16) tachometer (2) telepon (7) televisi (16) transistor (1) troubleshoot (3) tulisan (34) tutorial (67) vu meter (1) vumeter (1) wav player (3) wayang (1) wifi (1)

Diskusi


kaskus
Forum Hobby Elektronika