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
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;);
}
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