Monday, 5 March 2018

C Raspberry Pi DHT11 Thermal & Humidity Sensor

Sensor ini dipasaran ada beberapa jenis DTH11, 2 (dua) jenis yang paling umum seperti gambar dibawah ini, tetapi semuanya sama saja.
yang pertama DTH11 dengan resistor
yang kedua DTH 11 tanpa resistor



Kira kira begitulah barangnya, DTH11 yang menggunakan resistor ditempatkan pada sebuah pcb, dan mempunyai 3 (tiga) kaki, resistor ditempatkan pada bagian kiri (mungkin juga ada yang dikanan, atas, atau bawah, mungkin), pada DTH11 tanpa resistor, adalah barang itu sendiri dengan 4 (empat) kaki, dimana salah satu kaki nya tidak digunakan (lalu buat apa dibikin kaki?).

DTH11 dengan resistor atau tidak bukan masalah, karena kita bisa menambahkan sebuah resistor sebesar 10kΩ pada kaki signal pada DTH tanpa resistor.

Data sheet DTH11 ini kita bisa mengetahui spesifikasinya:

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

Soal harga sudah bukan masalah lagi (karena sudah dibeli)
Tegangan yang direkomendasikan adalah 3 sampai 5V dan I/O ( dan I/O? apaan tuh?)
Arus max 25mA, ketika kita meminta data
Baik digunakan pada kelembaban 20 - 80% dengan akurasi 5%
Baik digunakan pada suhu 0 - 50°C  dengan akurasi  ±2%
Data sampling tidak sampai 1 Hz (satu siklus dalam 1 detik, belajar fisika SMA lagi buat yang lupa)
Ukuran Body 15.5mmx12mmx5.5mm (padahal lagi cari yang 36 x 32 x38).
Memiliki 4 pin dengan jarak 2.54mm (tapi koq ada 1 pin yang tidak digunakan? buat apa?)


Sepertinya dengan gambar diatas langsung jelas apa gunanya dan dimana harus diletakan kaki-kakinya.

Tapi tidak salah bila saya jelaskan:
Kaki Vcc jelas harus disambungkan kemana ( 3,3V atau 5V) bila DTH11 tidak memiliki resistor, bisa ditambahkan resistor dikaki yang ini.
Kaki Signal disambungkan ke resistor dan pin I/O Raspberry Pi (lihat gambar, jangan salah merangkai komponen, bisa mengakibatkan pin Raspberry Pi jebol)
Kaki Ground disambungkan ke 0V


(Gambar diambil dari adafruit.com)

(Lha koq gambar arduino? tidak masalah, rangkaiannya sama aja)
(ya udah gitu dhe gambarnya)

Keterangan gambar:
kabel hijau (atas)/ biru (bawah) hubungkan ke pin I/O Raspberry Pi
kabel merah hubungkan ke Vcc (3,3V atau 5V)
kabel hitam hubungkan ke ground (0V)

Jadi salah satu ujung resistor disambungkan ke Vcc, dan ujung yang lain ke kaki signal. Dari kaki resistor yang terhubung ke signal ini juga dihubungkan ke Pin I/O Raspberry Pi.

Untuk DHT11  yang telah menggunakan resistor, dapat menghubungkan semua kaki-kaki DHT11 langsung.



Setelah rangkaiannya selesai, sekarang kita buat programnya:
Ada function2 yang mempermudah kita untuk mengambil data dari DTH, yaitu dengan wiringPi.
untuk mendapatkannya dan panduan installasinya  klik disini.

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define MAX_TIMINGS 85
#define DHT_PIN 6 /* GPIO11 */

int data[5] = { 0, 0, 0, 0, 0 };

void read_dht_data()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;

data[0] = data[1] = data[2] = data[3] = data[4] = 0;

pinMode( DHT_PIN, OUTPUT );  //Set pin 6 menjadi output
digitalWrite( DHT_PIN, LOW );    //Set pin 6 off
delay( 18 );                                       // stop sementara

pinMode( DHT_PIN, INPUT );     //Set pin 6 menjadi input

for ( i = 0; i < MAX_TIMINGS; i++ )  // cek data dari signal
{
counter = 0;
while ( digitalRead( DHT_PIN ) == laststate )  // jika data masih sama
{
counter++;
delayMicroseconds( 1 );    
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( DHT_PIN );   // menyimpan data baru 

if ( counter == 255 )
break;

/* 3 signal pertama tidak perlu dibaca */
if ( (i >= 4) && (i % 2 == 0) )
{
/* signal bit dimasukan dalam byte*/
data[j / 8] <<= 1;
if ( counter > 16 )
data[j / 8] |= 1;
j++;
}
}

/*cek bila signal yang masuk memiliki 40 bit (8bit x 5) + verifikasi byte terakhir 
    mencetak data lengkap, bila tidak beri peringatan */
if ( (j >= 40) &&
     (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
{
float h = (float)((data[0] << 8) + data[1]) / 10;
if ( h > 100 )
{
h = data[0]; // for DHT11
}
float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
if ( c > 125 )
{
c = data[2]; // for DHT11
}
if ( data[2] & 0x80 )
{
c = -c;
}
float f = c * 1.8f + 32;
printf( "Kelembaban udara = %.1f %% Temperatur = %.1f *C (%.1f *F)\n", h, c, f );
}else  {
printf( "Data tidak valid\n" );
}
}

int main( void )
{
printf( "Raspberry Pi Test Semsor DHT11 Temperatur dan Kelembaban Udara\n" );

if ( wiringPiSetup() == -1 )
exit( 1 );

while ( 1 )
{
read_dht_data();
delay( 2000 ); /* tunggu 2 detik sebelum membaca signal baru */
}

return(0);
}

Download kode diatas berupa .txt  klik disini

Lalu kita compile dengan:

cc -Wall dht.c -o dht -lwiringPi
./dht

atau

gcc -o dht dht11.c -lwirinngPi
./dht

Compile menggunakan Geany:
Compile dan Build pada Geany, kita harus menambahkan perintah -lwiringPi pada compile dan built-nya. Dengan cara menu Build > Set Built Command .
Lalu kita tambahkan perintah -lwiringPi pada bagian akhir dikolom compile dan built




dan klik OK.

Misalkan suatu hari nanti kode kita tidak memerlukan function wiringPi (pada program tidak ada #include <wiringPi>, akhiran -lwiringPi pada compiler dan built boleh dihapus.

No comments:

Post a Comment