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.

Saturday, 3 March 2018

Raspberry Pi Install wiringPi

Update untuk wiringPi Raspberry Pi 3 Model B+ 

Wiring Pi adalah library pin GPIO raspberry pi yang ditulis dengan C untuk BCM2835, BCM2836 dan BCM2837 SoC yang dapat digunakan oleh C, C++ dan RTB (BASIC), dan katanya bisa juga dipakai oleh beberapa program lainnya (saya tidak begitu tahu soal itu).

Dengan menggunakan wiringPi, beberapa nomor GPIO berubah.
Perubahan nomor GPIO ini bisa dilihat dengan perintah 
"gpio readall" di terminal, perintah tersebut akan mengeluarkan keterangan gpio menggunakan BCM dan wiringPi pada masing-masing GPIO.



WiringPi dimaintain oleh GIT untuk memudahkan pencaharian. Jadi kita harus install dahulu GIT-nya bila belum.

Install GIT :

sudo apt-get install git-core


Bila terdapat error, salah satu penyelesainya update dan upgrade dahulu Raspberry Pi nya. dengan:


sudo apt-get update
sudo apt-get upgrade


bila sudah diupdate dan upgrade, coba lagi install git-core nya.

Setelah kita menginstall GIT, sekarang kita install wiringPi menggunakan GIT dengan perintah:

git clone git://git.drogon.net/wiringPi 

Langkah selanjutnya adalah meng-update wiringPi
Masuk ke direktori wiringPi

cd wiringPi <enter>
git pull origin <enter>

Lalu kita Build/install

cd wiringPi <enter>
./build <enter>

Script akan di-compile dan install semuanya.
Bila perintah terakhir tidak berhasil, boleh dicoba menggunakan perintah sudo didepannya.

Lalu kita coba gpio wiringPi nya
test versi:

gpio -v

lalu muncul keterangan seperti dibawah ini:

gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B, Revision: 02, Memory: 512MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi Model B Rev 2
  * This Raspberry Pi supports user-level GPIO access.

{ Update 17 Maret 2018
Bila menggunakan Raspberry Pi 3 Model B+ (function readall bermasalah pada RasPi ini, belum update), bisa kita update wiringPi-nya disini:
Update untuk wiringPi Raspberry Pi 3 Model B+  }

Lalu kita test pin-nya:

gpio readall

lalu muncul keterangan seperti ini :



Gambar dan versi diatas adalah RaspberryPi jadul saya, masih Pi 1 model B.
Berarti semua berkerja sesuai yang kita harapkan (paling tidak, sesuai dengan pembuat wiringPi harapkan). Kita telah sukses kita menginstall wiringPi

Untuk melakukan cek fisik apakah wiringPi  berfungsi dengan baik kita gunakan LED, dan kita bisa mengcek semua gpio. Pada gambar dibawah ini kita menggunakan gpio 6 (wiringPi) atau pin 26 (BCM).

Buka terminal, lalu:

gpio mode 6 out
gpio write 6 1
gpio write 6 0

"gpio mode 6 out"  kita perintahkan raspberry pi untuk membuat output di pin no.6
"gpio write 6 1" kita perintahkan RaspPi untuk memberi listrik pada pin 6
"gpio write 6 0" kita perintahkan RaspPi untuk mematikan listrik pada pin 6

Dan untuk input:

Seperti pada rangkaian push button diatas, kita menggunakan gpio 10 (wiringPi).
Lalu:

gpio mode 10 in

Lalu kita test

gpio read 10

bila hasilnya '0', berarti tidak ada input pada gpio tersebut
kita perintahkan lagi "gpio read 10" (jangan tekan <enter> dulu), dengan menekan tahan push button lalu tekan <enter>.
bila hasilnya 1, maka gpio 10 mendeteksi input.

Wednesday, 28 February 2018

C Komen Comments

Kita harus membiasakan menggunakan komen (comments) dalam pembuatan program, walaupun kelihatannya simple. Saat kita membuat program yang simple, comments dirasakan sangat memakan waktu, tapi bila program yang kita buat sudah lebih dari 100 baris (masih bisa didebatkan, tapi kalau sudah mencapai 1000 baris, sudah pasti tidak diragukan lagi) kita memerlukan comments ini.

Comments memudahkan kita mencari baris yang hendak kita perbaiki atau modifikasi. Tanpa comments pencaharian akan membingungkan, dan ada kemungkinan kita memperbaiki baris yang bukan seharusnya kita perbaiki.

Tanpa comments, bila kita sisir baris-baris program yang telah kita buat, sering kali tampak tidak seperti yang kita harapkan, terutama saat kita harus berhenti pembuatan program karena harus tidur, dan besoknya kita akan meneruskan program tersebut, ini yang selalu menjadi masalah, saat kita melanjutkan pembuatan program kita lupa apa yang kita kerjakan kemarin dibaris mana dan fungsinya apa baris tersebut, setelah dicek dan memakan waktu yang panjang, kita bikin kesimpulan bahwa program yang kita buat kemarin tidak nyambung lg, padahal semua baris programnya bisa berkerja dengan baik.

Ada 2 (dua) cara untuk membuat comments ini:

  1. Dengan comments baris, diawal baris kita sisipkan  "//", maka pada baris tersebut merupakan comment, dan tanpa akhiran.
    contoh :
    // comment ini akan berakhir sendirinya. comment yang hanya 1 baris.
  2. Dengan blok comments. Dengan comments ini kita bisa membuat comment berbaris-baris sepanjang kita mau. Untuk membuat comments demikian kita awali comment dengan tanda "/*" dan diakhiri dengan "*/".
    Contoh:
    /*blok comment
    kita bisa membuat comment ini
    hingga berbaris-baris
    sampai ketemu tanda -> */
Jangan takut comments kita akan masuk ke execute file setelah kita compile nanti. Compiler tidak akan membaca atau akan melompati bagian comment. sehingga bila ada orang iseng yang membuka/membedah  program kita, bagian comment tidak ada.

Comments tidak harus berada pada baris baru, comment bisa kita tulis didalam baris program yang kita buat, untuk mengingatkan kita pada hal penting pada baris program tersebut yang jarang atau kita tidak familiar dengan kondisi tersebut. Contoh:

int cariMantan (int tinggi, int tahun, int cuci /*apa ini cuci? cuci adalah cucah cinta lagi, atau yang seperti itulah */ );


int ukuranSepatu = 40 ; // ukuran sepatu yang terakhir digunakan/dibeli

Tapi aturan diatas tidak berlaku bila berada diantara string literal. // atau /* ...*/ oleh compiler merupakan string juga.

printf ("Hello World /*cetak tulisan hello world */ \nhello world //cetak lagi ");

contoh diatas akan dicetak seperti:

Hello World /*cetak tulisan hello world */ 
hello world //cetak lagi

Pada blok comments compiler melewati bagian /* sampai */, jika didalam blok kita isi dengan apapun, compiler tidak akan membacanya sampai ketemu */.

Kenyataanya comment ini jiplakan dari C++ yang ditambahkan kemudian kedalam C oleh C99 standard, sehingga comment tersebut disebut "C++ style", walaupun sebenarnya merupakan jiplakan juga dari sebuah program yang mempelopori C, yaitu BCPL (Basic Combined Programming Language).

Comments ini juga berguna untuk melakukan percobaan, bila kita frustasi menulis ulang secara terus menerus karena compiler menemukan sebuah error yang tidak jelas. Illustrasinya seperti dibawah ini:

percobaan pertama /*kedua*/ dilakukan ;

maka hasilnya adalah percobaan pertama dilakukan. Karena kata "kedua" merupakan comment saja.





C Konstanta (Constants)

Ada cara lain untuk mengganti variabel yang bisa kita pakai, yaitu dengan konstanta / constants.
Konstanta digunakan untuk memudahkan penggunaan variable yg tidak berubah setelah eksekusi, nilai fix ini juga disebut literals.

Konstanta dapat diisi dengan semua basic data type seperti integer literals, float point literals, karakter literals, dan string literal.

Format konstanta:

#define (Nama Konstant) (Value)


Sekali lagi Constanta ini sama seperti variable, tetapi value nya tidak bisa berubah.
Misalnya gravitasi g = 9,8

Kita bisa tulis :

#define GRAVITASI 9.8

Integer literals
Sebuah integer literals bisa menggunakan decimal, oktadecimal, atau hexadecimal. Dengan awalan khusus 0x atau 0X untuk hexadesimal, 0 untuk oktadecimal, dan tanpa awalan untuk decimal.
Dan bisa juga menggunakan akhiran U dan atau L untuk unsigned dan long. Boleh menggunakan hurup kapital maupun hurup kecil.

Contoh:
1234
3543u
0x5aL
057

Floating-point Literals
Floating-point literals memiliki bagian integer, dan decimal atau pecahan atau bisa juga kita menggunakan exponen.

Penggunaan exponen e bisa menggunakan hurup kecil "e" atau kapital "E".

contohnya:
3.14
314e-2

Character Constants
Dengan character contant kita menggunakan sebuah karakter saja, seperti "a", "b", atau escape sequence seperti "\n" atau juga menggunakan karakter universal seperti "\u0068"

#include <stdio.h>

#define Ktab "\t" /*membuat tabulasi*/
#define Knew "\n" /*membuat garis baru*/

int main()
{
     printf ("Hello" Ktab "World" Knew);
}


String Literals
String juga bisa dipakai sebagai konstant, Seperti yang kita tahu (bila anda tau maksudnya) string memuat lebih dari satu karakter atau dengan kata lain merupakan kombinasi dari karakter, dan karakter yang dapat dimasukan tidak hanya hurup atau angka saja, tetepi escape sequence (\n, \t, dsb), spasi dan universal karakter juga bisa, value dari string dibuat didalam tanda petik (").

Kita juga bisa membuat tidak hanya satu baris, lebih dari satu baris pun bisa dilakukan.

#include <stdio.h>

#define Akata "HelloWorld" 

#define Akalimat "Hello world"
#define AmultiBaris "Hello world\nHELLO WORLD"
#define AkarakterUni "\u03b1 \u0024" 

int main()

{
printf(Akata "\n-------\n");
printf(Akalimat "\n-------\n");
printf(AmultiBaris "\n-------\n");
printf(AkarakterUni );

return 0;
}

hasilnya:

HelloWorld
-------
Hello world
-------
Hello world
HELLO WORLD
-------
α $



const Keyword
Kita juga bisa menggunakan perintah const sebagai kontant dengan data type yang specifik.
Format const :

const (type) (namaVariable)  = (value)

contoh:

#include <stdio.h>

const float Acpi = 3.14;

int main()
{
printf("%f",Acpi);
return 0;
}



Untuk membedakan antara const dan define, pada umumnya nama define ditulis dengan hurup kapital.

#define AHELLO "hello world"


Saturday, 24 February 2018

C Statement for

Statement for digunakan untuk looping sampai kondisi tertentu tercapai, ataupun selamanya. Statement for digunakan lebih detail dibandingkan dengan statement while pada contoh sebelumnya. Statement for memiliki tiga (3) bagian yang terpisah dengan semikolon (;)

for (x=0 ; x <= 50 ; x++)
      printf ("Hello World");

Bila pada statement while menunggu sampai kondisi berubah (dari true menjadi false atau sebaliknya), looping baru terhenti, tidak ada batasan berapa banyak yang harus diloop, sementara statement for memiliki batasan banyaknya looping yang harus dilakukan.

contoh Statement for
-----------------------------------------------------------------------
#include <stdio.h>
main()
{
int Ainci;
float Acm;

for (Ainci=0 ; Ainci <21 ; Ainci++){
Acm=2.54 * Ainci;
printf (" %d\t%f\n",Ainci,Acm);
}

}
-------------------------------------------------------------------------
hasilnya adalah :

0 0.000000
1 2.540000
2 5.080000
3 7.620000
4 10.160000
5 12.700000
6 15.240000
7 17.780001
8 20.320000
9 22.860001
10 25.400000
11 27.940001
12 30.480000
13 33.020000
14 35.560001
15 38.099998
16 40.639999
17 43.180000
18 45.720001
19 48.259998
20 50.799999



Perbedaan antara statement while dan for :

while:
 while (Ainci <= Abesar)

for:
for (Ainci=0 ; Ainci <21 ; Ainci++)

Pada statement while looping dilakukan tanpa mengatur perubahan Ainci dan Abesarnya, looping dilakukan sampai kondisi Ainci >Abesar, sedangkan pada statement for ada batasan yang harus dilakukan.

Kita bedah perintah for (Ainci=0 ; Ainci <21 ; Ainci++)  ini.

Ainci = 0 merupakan awal dari perhitungan, tidak selalu harus 0 (nol),
Ainci < 21 looping akan berhenti bila nilai Ainci  setidaknya 21.
Ainci++ adalah penjumlahan, dengan kata lain Ainci++ sama dengan
Ainci(baru) = Ainci(yang sedang diproses) +1

--