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;);
}
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.
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
Bagus nih, kebetulan saya juga lagi ngerjain tugas akhir pake dht11. kalo boleh tau, program nya untuk atmega16 sama dengan yang diatas ato tidak?
BalasHapusterima kasih sebelumnya :D
untuk ATmega16 sama saja, tinggal menyesuaikan pin dan ada perbedaan di register yang berhubungan dengan interrupt
BalasHapusmas, klo di bagian interrupt programnya apa?
BalasHapusOm Yudi, yg listing kedua ini artinya apa ya uint8_t a ?
BalasHapusuint8_t a , ini artinya variable a tipenya unsigned integer 8 bit
BalasHapuschar dum; untuk apa Om?
BalasHapusterus, ini apa bisa om,humi=hitung();?
kan beda bentrok ama type data om.
Matur sukseme
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
BalasHapusMas, ini perlu library tambahan?
BalasHapusmas 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
BalasHapusDht 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
Hapusoke mas , lanjut via sms ya . terimakasih
BalasHapusmaaf mas, mau tny..perbedaan sensor SHT dengan DHT apa ya mas..masih belajar ni
BalasHapusmohon dbantu ya mas
Komentar ini telah dihapus oleh pengarang.
HapusBli nyoman mau nanya .cotoh lib,sama coding dht11 bahasa c ada nggak tolong kirimin ya...wayanmertayasa174@gmail.com
BalasHapuslalu yg saya tulis diatas itu napi pak wayan ? coding C bukan ya namanya?
BalasHapusterima kasih mas tutorialnya, data yang dikirim sensor dalam bentuk biner kan mas? yang diprogram geser-geser bit, terus bagaimana caranya diterjemahkan jadi desimal ya?
BalasHapusMuhammad Aldrin
Assalamualaikum om..mau tanya bila pembacaannya untuk 2 dht11 gimana ya ? Mohon bimbingannya om..soalnya ada tugas Akhir matkul , buat alat monitoring
BalasHapus