0% menganggap dokumen ini bermanfaat (0 suara)
244 tayangan39 halaman

Arduino Dasar 1

Struktur program sketch Arduino terdiri dari 3 bagian utama: deklarasi awal, setup, dan loop. Deklarasi awal berisi deklarasi variabel dan library yang dibutuhkan. Setup digunakan untuk menginisialisasi pin dan variabel. Loop adalah bagian utama yang dijalankan berulang-ulang.

Diunggah oleh

Aan 28
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
244 tayangan39 halaman

Arduino Dasar 1

Struktur program sketch Arduino terdiri dari 3 bagian utama: deklarasi awal, setup, dan loop. Deklarasi awal berisi deklarasi variabel dan library yang dibutuhkan. Setup digunakan untuk menginisialisasi pin dan variabel. Loop adalah bagian utama yang dijalankan berulang-ulang.

Diunggah oleh

Aan 28
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 39

ARDUINO DASAR I

2017
STRUKTUR PROGRAM SKETCH PADA ARDUINO

Struktur program sketch ardunio sama dengan struktur pemograman bahasa C untuk mikrokontroller,
namun bahasa pemograman sketch arduino jauh lebih sederhana bila dibandingkan dengan bahasa program C
untuk mikrokontrller. Pada pemograman bahasa C untuk mikrokontroller seperti program AVR Studio4, sebulum
kita membuat program utama, terlebih dahulu kita harus mengatur register-register mikrokontroller yang akan kita
gunakan sesuai dengan program utama yang akan dibuat. Lain halnya dengan program sketch arduino, proses
pengaturan register mikrokontroller telah disediakan dalam bentuk prototipe program yang tidak ditampilkan
dalam program sketch. Program-program ini tinggal dipanggil pada saat kita akan membuat menulis program
sketch.
Sebelum mempelajari program sketch arduino, terlebih dahulu harus memahami konfigurasi pin pada
board arduino yang akan diprogram. Pada tutorial ini kita menggunakan arduino UNO R3 seperti pada gambar
berikut ini.

Gambar 1 konfigurasi pin board Arduino Uno R3

Pada gambar 1 terlihat konfigurasi pin pada board arduino Uno R3. Pin-pin tersebut terdiri dari:

1. Pin 0 – pin 13
Pin ini dapat digunakan sebagai pin input dan output digital. Artinya pin-pin ini hanya dapat digunakan
untuk keluar data digital. Bila pin – pin ini diatur sebagai pin output, maka pin – pin hanya dapat mengeluar
tegangan 0V untuk kondisi OFF dan mengeluarkan tegangan 5V untuk kondisi ON. Dalam penulisan program
sketch, 0V dinyatakan dengan kondisi LOW dan 5V dinyatakan dengan kondisi HIGH.
Jika pin-pin digital ini diatur sebagai pin input, maka pin-pin ini hanya dapat menerima data digital. Bila pin diberi
tegangan 0V, maka pin mendapat logika rendah (LOW) dan jika pin mendapat tegangan 5V, maka pin mendapat
logika tinggi (HIGH).
2. Pin A0 – pin A5.
Pin A0 – pin A5 adalah pin analog, artinya pin ini dapat menerima dan mengeluarkan data data analog. Pin
A0 – pin A5 terhubung ke ADC (analog to digital converter). Board arduino uno menggunakan mikrokontroller
ATMega 328 yang mempunyai 2 macam konfigurasi ADC yaitu ADC 8 bit dan ADC 12 bit. Pin analog ini dapat
mengolah tegangan analog dari tegangan 0 V hingga 5 V. Selain dapat digunakan untuk data analog, pin ini juga
dapat difungsikan sebagai pin input/output digital.

3. Pin Utilitas
Pin utilitas terdiri dari :
1. Pin V input; untuk input tegangan DC 5 V
2. Pin V output 5V; pin ini mengeluarkan tegangan 5V
3. Pin V output 3,3 V; pin ini mengeluarkan tegangan 3,3 V
4. Pin Ground (-)
5. Pin Aref ; pin ini untuk memberikan tegangan referensi eksternal pada ADC.
6. Pin reset; pin ini untuk reset mikrokontroller.

4. Terminal USB
Terminal USB digunakan untuk menghubungkan board arduino dengan komputer, terminal ini digunakan
untuk memprogram mikrokontroller dan juga dapat digunakan untuk komunikasi mikrokontroller dengan
komputer (serial komunikasi).

5. Terminal Catudaya eksternal.


Board arduino selain dapat menggunakan datudaya dari USB komputer, juga dapat diberi catudaya
eksternal melalui terminal catudaya ini. Pada board arduino telah dilengkapi dengan regulator tegangan 5V,
sehingga board arduino ini dapat diberikan tegangan eksternal berkisar dari 5 V hingga 12 VDC.

6. Tombol reset
Tombol reset digunakan untuk mereset mikrokontroller.

7. Terminal Header ISP


Terminal Header ISP digunakan untuk pemograman boatloader mikrokontroller. Supaya mikrokontroller
atmega328 dapat bekerja pada board arduino, maka atmega328 harus diisi dengan program boatloader terlebih
dahulu. Pada saat kita membeli board arduino, board telah dilengkapi dengan sebuah IC atmega328 yang telah
diisi dengan program boatloader, tetapi jika kita hendak mengganti IC atmega 328 dengan yang baru, maka IC
tersebut terlebih dahulu harus diisi dengan program boatloader dengan menggunakan terminal header ISP yang
dihubungkan ke downloader lain.

Struktur program sketch dapat dibagi menjadi 3 bagian yaitu:


1.Bagian deklarisi awal
Bagian deklarasi awal digunakan untuk mendeskripsikan variabel-variabel yang akan digunakan dalam program
utama dan juga untuk menambahkan file-file program yang dibutuhkan untuk menjalankan program utama.
Berikut contoh deklarasi program:
#include<AVR/io.h>

int tombol1 = 3;
char lampu1 = 0;
2.BagianSetup
Bagian setup digunakan untuk menginisiasi variabel, mengatur mode pin pada board, mengatur timer, mengatur
baudrate serial port dan sebagainya. Bagian setup hanya dijalankan sekali saja yaitu pada saat awal program
dijalankan atau ketika program direset. Berikut contoh program setup:

void setup()
{ pinMode(tombol1, INPUT);
pinMode(Lampu1, OUTPUT);
serial.begin(9600);
}

3. Bagian loop
Bagian loop adalah fungsi utama program yang akan dijalankan berulang-ulang. Berikut ini contoh penulisan
Program sketch lengkap:

#include<AVR.io.h>
int lampu1 = 3;

void setup()
{ pinMode(lampu1, OUTPUT);}

void loop()
{ digitalWrite(lampu1, HIGH);
delay(1000);
digitalWrite(lampu1, LOW);
delay(1000);
}

Penjelasan program :

#include<AVR/io.h>

int tombol1 = 3;
char lampu1 = 0;

Bagian ini merupakan deklarasi awal yang menyatakan variabel “lampu1” adalah pin no3 board arduino Uno dan
menambahkan file io.h ke program.

void setup()
{ pinMode(lampu1, OUTPUT);}

Bagian ini mengatur variabel “lampu1” atau pin3 sebagai pin output. Karena pin no 3 adalah pin digital dan diatur
sebagai pin output, maka pin ini hanya dapat mengeluarkan tegangan 5V ketika HIGH dan tegangan 0V ketika
LOW.

void loop()
{ digitalWrite(lampu1, HIGH);
delay(1000);
digitalWrite(lampu1, LOW);
delay(1000);
}

Bagian ini adalah program utama yang akan dijalankan berulang-ulang oleh mikrokontroller. Pertama-tama
mikrokontroller akan mengeluarkan tegangan 5V (logika HIGH) pada pin3 (lampu1), kemudian menahan nyala
lampu selama 1000 ms, setelah itu lampu akan dimatikan selama 1000ms, dan berulang kembali.
Gambar berikut ini menunnjukan contoh penulisan sketch pada IDE program Arduino:

Gambar 2: Contoh penulisan sketch pada IDE program Arduino


VARIABEL, TIPE DATA DAN KONSTANTA

Variabel
Variabel harus dipahami lebih dahulu sebelum membuat suatu program mikrokontroller, karena di dalam
program mikrokontroller, banyak variabel yang bekerja di dalamnya. Variabel yang digunakan harus ditentukan
juga tipe datanya.
Variabel adalah nama yang dibuat dan disimpan di dalam memori mikrokontroller. Variabel ini
mempunyai nilai dan nilainya dapat diubah sewaktu-waktu pada saat program dijalankan. Misalnya suatu variabel
bernama “lampu1”. Variabel ini merupakan suatu nilai yang memiliki tipe data tertentu. Nilai dalam variabel
“lampu1” dapat diubah, misalnya variabel “lampu1” mula-mula bernilai 0, kemudian dalam suatu proses, variabel
“lampu1” dapat berubah menjadi bernilai 1. Nilai 0 dan 1 adalah tipe data dalam variabel “lampu1”.
Contoh lainnya, misalnya kita mendeklarasikan suatu variabel bernama “cacah”, kemudian ditentukan tipe data
adalah byte. Maka program akan membuat suatu variabel “cacah” dan memberikan tipe data “cacah” sebagai
bilangan byte dan menyimpannya ke memori. Artinya “ variabel “cacah” hanya dapat menghitung dari 0 hingga
255 ( 8 bit).
Deklarasi suatu variabel dapat dilakukan tanpa pemberian nilai awal atau dapat juga langsung diberikan
nilai awal. Misalnya jika kita mendeklarasikan variabel “hitung” sebagai bilangan bulat (integer) dengan nilai awal 1
maka dapat ditulis :

int hitung = 1;

maka mikrokontroller akan membuat sebuah variabel “hitung” dengan tipe data integer (bilangan bulat) dan
memberikan nilai awal 1 ke variabel “hitung” tersebut.
Dalam pemograman mikrokontroller dikenal ada 2 macam variabel yaitu :
1. Variabel global; yaitu variabel yang dideklarasi diluar fungsi dan berlaku secara umum atau dapat diakses
dimana saja
2. Variabel lokal; yaitu variabel yang dideklarasi di dalam fungsi dan hanya dapat diakses oleh pernyataan yang
ada di dalam fungsi.

Tipe Data
Tipe data yang dapat digunakan di dalam program sketch bermacam-macam antara lain:
1. boolean
Tipe data boolean hanya memiliki 2 data yaitu benar (true) dan salah (false). Tipe data boolean hanya
membutuhkan 1 byte memori. Contoh penulisan deklarasi tipe data boolean.

boolean running = false;

Artinya: variabel “running” ditentukan mempunyai tipe data boolean dengan nilai awal “false”.

2.byte
Tipe data byte memiliki 8 bit data (0 – 255). Tipe data byte tidak memiliki nilai negatif. Contoh penulisan deklarasi
tipe data byte :
byte b = 128;
atau
byte b = B10000000;
Artinya variabel “b” ditentukan sebagai tipe daya byte dengan nilai awal 128 (decan) atau B10000000.
3. char
char atau karakter adalah tipe data untuk menyatakan suatu karakter seperti “A”, “B”, “C” , “+” , “.” dan
sebagainya. Karakter ini disimpan dalam bentuk angka. Untuk mengkonversikan bentuk angka ke bentuk karakter
dapat menggunakan tabel ASCII berikut ini.

Contoh penulisan deklarasi variabel tipe char:

char karakterku = 68;

artinya mendeklarasikan suatu variabel dengan nama “karakterku” dengan nilai awal 68 atau karakter “D”.
4. unsigned char
unsigned char serupa dengan tipe char tetapi tanpa nilai negatif sehingga unsigned char memiliki nilai dari 0 hingga
255 atau sama dengan tipe data byte.
Contoh penulisan deklarasi variabel tipe unsigned char:

Unsigned char bilangan = -1;

Artinya mendeklarasikan suatu variabel dengan nama “bilangan” dengan nilai awal -1.

5. int
int digunakan untuk menyatakan tipe data integer (bilangan bulat). Tipe data integer berkisar antara -32768
sampai 32768 (-215 hingga (215-1)). Nilai bilangan ini membutuhkan 2 byte memori mikrokontroller. Contoh
penulisan deklarasi tipe integer :

int bilangan = 0;

artinya mendeklarasikan suatu variabel dengan nama “bilangan” dengan nilai awal 0.

6. unsigned int
unsigned int digunakan untuk mendeklarasikan tipe data bilangan bulat positif atau bernilai 0 hingga 65535. Sama
dengan integer, tipe data ini juga membutuhkan 2 byte memori mikrokontroller. Contoh penulisannya:

unsigned int angka = 12;

artinya mendeklarasikan suatu variabel dengan nama “angka” dengan nilai awal 12.

7. word
Tipe data word sama dengan tipe data unsigned int. Besar data word adalah 16 bit atau membutuhkan 2 byte
memori mikrokontroller. Tipe data ini jarang digunakan. Contoh penulisan pada program sketch:

word bilangan = 1000;

Artinya mendeklarasikan variabel dengan nama “angka” dengan nilai awal 1000.

8. long
Tipe data long adalah tipe data untuk menampung bilangan bulat yang berkisar antara
-2.147.483.648 hingga 2.147.483.647. variabel bertipe long ditulis dengan akhiran L atau l. Contoh 456789980L.
Contoh penulisan pada program sketch :

long speedoflight = 298756L

artinya program akan mendeklarasikan variabel dengan nama “speedoflight” dengan nilai 298756.

9. unsigned long
unsigned long adalah tipe data yang sama dengan long, tetapi dihitung dari angka 0 atau mempunyai nilai berkisar
0 hingga 4.292.967.295. Nilai variabel ini ditulis dengan kode UL diakhir konstanta seperti contoh berikut ini
unsigned long speed = 123345623UL
artinya program mendeklarasikan variabel dengan nama “speed” dengan nilai awal 123345623.
10. float
Tipe ini berguna untuk menyimpan bilangan real. Angka yang bisa disimpan dari -3,4028235 x 1038 hingga
3,4028235 x 1038. Angka dengan tipe float sangat besar sekali, sehingga sangat jarang digunakan karena akan
memperlambat kerja prosessor mikrokontroller dan banyak memakai memori, kecuali bila memang sangat
dibutuhkan dalam program.

11. double
Tipe data double dan float untuk arduino tidak ada bedanya.

Konstanta
Konstanta adalah nilai suatu besaran yang tidak berubah besarnya atau memiliki nilai yang tetap. Dalam
pemograman arduino ditulis dengan kata “const” yang artinya konstanta. Contoh penulisan konstanta :

const int harga = 12;

artinya variabel “harga” adalah sebuah konstanta bilangan bulat integer yang memiliki nilai tetap yaitu 12. Nilai ini
hanya bisa dibaca dan tidak dapat diubah selama program dijalankan.
Penamaan untuk variabel dan konstanta tidak boleh menggunakan kata-kata yang digunakan dalam program
sketch arduino seperti for, if, while dan sebagainya. Selain itu nama tidak boleh ada spasi, bila hendak memisahkan
2 buah kata untuk menyatakan variabel atau konstanta harus dihubungkan dengan tanda garis bawah ( _ )
misalnya : “waktu_tunggu”.

Pernyataan, Operand dan Operator


Pernyataan atau disebut juga ekspresi adalah suatu rangkaian dari operator, variabel, fungsi atau
konstanta yang ditujukan untuk menghasilkan suatu nilai dengan tipe data tertentu, misalnya suatu pernyataan
untuk luas empat persegipanjang berikut ini.

luas = panjang * lebar ;

contoh di atas menyatakan hubungan antara luas dengan panjang dan lebar. Luas, panjang dan lebar disebut
sebagai operand sedangkan tanda “ = ” dan “ * ” disebut operator. Ada beberapa operator yang dikenal di program
sketch arduino antara lain :
PERNYATAAN UNTUK PEMILIHAN
DALAM PEMOGRAMAN ARDUINO

Ada 2 macam pernyataan yang dapat digunakan untuk memilih suatu kondisi dalam proses pemograman
arduino yaitu:
1. pernyataan pemilihan dengan menggunakan if – else
2. pernyataan pemilihan dengan menggunakan switch – case
Kedua pernyataan ini sama-sama digunakan untuk memilih suatu percabangan dalam program.
Bagaimana cara penggunaannya, akan dibahas berikut ini:

1. Pernyataan if – else
Format penulisan pernyataan if – else adalah sebagai berikut :

if (variabel dibandingkan)
{ pernyataan 1;}
else
{ pernyataan 2;}

Dengan menggunakan flowchart dapat digambar sebagai berikut:

Gambar 1: Flowchart untuk pernyataan if – else

Contoh pemograman dengan menggunakan if – else:

int pininput = 1;
int pinoutput1 = 2;

void setup()
{
pinMode(pininput,INPUT);
pinMode(pinoutput1,OUTPUT);
}
void loop()
{
if(pininput == 1)
{digitalWrite(pinoutput1, HIGH);}
else
{digitalWrite(pinoutput1, LOW);}
}
Pernyataan if-else digunakan untuk membandingkan variabel dengan suatu kondisi logika. Bila variabel
bernilai benar, maka pernyataan1 akan dieksekusi bila tidak (else) maka pernyataan2 yang akan dieksekusi.
Pernyataan if dapat juga ditulis tanpa else. Bila demikian, maka if hanya akan menjalankan pernyataan1 jika nilai
variabel yang dibandingkan benar.

2. Pernyataan switch – case


Format penulisan pernyataan switch – case adalah sebagai berikut :
switch (variabel)
{
Case konstanta1:
Pernyataan 1;
break;
case konstanta2:
Pernyataan 2;
break;
case konstanta3:
Pernyataan 3;
break;
case konstanta n:
Pernyataan n;
break;
default:
Pernyataan X;
break;
}

Dengan menggunakan flowchart dapat digambar sebagai berikut:

Gambar 2 : Flowchart untuk pernyataan switch – case


Contoh pemograman dengan menggunakan switch – case:

int pininput = 1;
int pinoutput1 = 2;
int pinoutput2 = 3;
int pinoutput3 = 4;
int pinoutput4 = 5;

void setup()
{
pinMode(pininput,INPUT);
pinMode(pinoutput1,OUTPUT);
pinMode(pinoutput2,OUTPUT);
pinMode(pinoutput3,OUTPUT);
pinMode(pinoutput4,OUTPUT);
}

void loop()
{
switch (pininput)
{case 1:
digitalWrite(pinoutput1,HIGH);
break;
case 2:
digitalWrite(pinoutput2,HIGH);
break;
case 3:
digitalWrite(pinoutput3,HIGH);
break;
default :
digitalWrite(pinoutput4,HIGH);
break;}
}

Variabel adalah nilai yang akan dibandingkan dengan konstanta-konstanta atau dapat juga berupa
ekspresi aritmatika. Konstanta 1 hingga konstanta ke n adalah nilai pembanding untuk variabel. Dalam pernyataan
switch-case, konstanta tidak boleh ada yang sama atau berulang. Pernyataan 1 hingga pernyataan n adalah suatu
pernyataan atau proses yang harus dikerjakan jika variabel sesuai dengan suatu konstanta. Pernyataan X adalah
pernyataan yang dikerjakan bila tidak ada variabel yang sesuai dengan konstanta pembanding.
Switch – case digunakan untuk membandingkan suatu variabel dengan beberapa konstanta. Konstanta
diawali dengan “case” dan setiap blok case diakhiri dengan “break”. Jika nilai variabel sama dengan suatu
konstanta, maka pernyataan yang ada pada blok tersebut akan dieksekusi dan jika variabel tidak ada yang sama
dengan konstanta – konstanta yang ada maka pernyataan pada blok “default” yang akan dieksekusi. Blok “default”
adalah opsional artinya boleh ada boleh juga tidak.
Pada contoh program, pada mulanya program akan melakukan deklarasi yaitu :
int pininput = 1;
int pinoutput1 = 2;
int pinoutput2 = 3;
int pinoutput3 = 4;
int pinoutput4 = 5;

deklarasi ini menyatakan bahwa kata “pininput” identik dengan pin1 terminal arduino, sedangkan kata-kata
“pinoutput1, pinoutput2, pinoutput3 dan pinoutput4” berturut-turut identik dengan pin2, pin3, pin4 dan pin5
terminal arduino.
Selanjutnya program melakukan pengaturan yaitu :
void setup()
{
pinMode(pininput,INPUT);
pinMode(pinoutput1,OUTPUT);
pinMode(pinoutput2,OUTPUT);
pinMode(pinoutput3,OUTPUT);
pinMode(pinoutput4,OUTPUT);
}

Pada blok ini mikrokontroler akan mengatur “pininput” (pin1 arduino) sebagai pin input dan berturut-turut
“pinoutput1” (pin2 arduino), “pinoutput2″ (pin3 arduino),” pinoutput3″ (pin4 arduino) dan “pinoutput4” (pin5
arduino) sebagai pin output.

Selanjutnya program utama yaitu :


void loop()
{
switch (pininput)
{case 1:
digitalWrite(pinoutput1,HIGH);
break;
case 2:
digitalWrite(pinoutput2,HIGH);
break;
case 3:
digitalWrite(pinoutput3,HIGH);
break;
default :
digitalWrite(pinoutput4,HIGH);
break;}
}

Program utama ini akan berulang terus menerus. Perintah switch akan membandingkan variabel
“pininput” dengan beberapa konstanta atau sama saja membandingkan data masukan pada pin1 arduino dengan
beberapa konstanta. Jika “pininput” bernilai sama dengan 1 maka “pinoutput1” akan diperintahkan untuk bernilai
tinggi (HIGH) atau memberikan tegangan 5V, jika “pininput” bernilai sama dengan 2, maka “pinoutput2” akan
bernilai tinggi, jika “pininput” bernilai sama dengan 3 maka “pinoutput3” yang akan bernilai tinggi dan jika nilai
“pininput” tidak ada yang sama dengan ketiga konstanta, maka perintah dalam blok “default” yang akan dijalankan
yaitu “pinoutput4” yang akan bernilai tinggi. Perintah “break” akan mengulang program.
ON – OFF LAMPU LED DENGAN 1 TOMBOL

Project berikut ini kita akan mencoba menyalahkan dan mematikan lampu LED dengan menggunakan 1
buah tombol tekan. Tombol tekan (push button) dipasang di pin A0 dan lampu LED dipasang di pin D2. Kondisi
awal, lampu LED tidak menyalah (OFF), ketika tombol ditekan 1 kali, maka lampu LED akan menyalah (ON) dan
ketika lampu LED menyalah dan tombol ditekan 1 kali, maka lampu LED akan padam (OFF).

Flowchart :
Sebelum menulis kode program terlebih dahulu, kita menyusun flowchart program sebagai berikut:

Gambar 1: Flowchart
Kode program arduino :
/* menyalahkan dan mematikan lampu LED dengan menggunakan 1 tombol
by djukarna @ STKIP SURYA */
char tombol = A0;
char led = 2;
char A = 0;
char B = 0;
void setup()
{
pinMode(tombol, INPUT);
pinMode(led, OUTPUT);
}
void loop()
{
label: A = digitalRead(tombol);
delay(300);
if(A == 0) {goto label;}
if (A == 1)
{
if(B == 0 )
{ digitalWrite(led,HIGH);
B = 1;}
else
{ digitalWrite(led,LOW);
B = 0;}
}
}

Penjelasan program :
char tombol = A0;
char led = 2;
char A = 0;
char B = 0;

Mula-mula dideskripsikan terlebih dahulu variabel-variabel yang akan digunakan. Dalam program ini akan
digunakan 4 variabel yaitu variabel “tombol” sebagai pin A0 yang akan digunakan untuk sebagai pin input, variabel
“led” sebagai pin D2 yang akan digunakan sebagai pin output, variabel “A” yang nilai awal 0 yang akan digunakan
sebagai variabel input dari tombol dan variabel “B” yang nilai awalnya 0 yang akan digunakan sebagai proses logika
dalam program utama.

void setup()
{
pinMode(tombol, INPUT);
pinMode(led, OUTPUT);
}

Tahap berikutnya kita mengatur fungsi pin mikrokontroller yaitu pin A0 sebagai pin input (dalam hal ini diwakili
oleh variabel “tombol”) dan pin D2 sebagai variabel output yang diwakili oleh variabel “led”.
void loop()
{
label: A = digitalRead(tombol);
delay(300); //waktu tunda untuk debouncing
if(A == 0) {goto label;} //looping untuk debouncing
if (A == 1)
{
if(B == 0 )
{ digitalWrite(led,HIGH);
B = 1;}
else
{ digitalWrite(led,LOW);
B = 0;}
}
}

Pada program utama, pertama – tama program akan membaca pin A0 dan memindahkan isi pin A0 ke
variabel “A”. Untuk menjaga kestabilan tombol, maka digunakan waktu tunda (delay) selama 300 ms dan “looping”
selama nilai “A” masih sama dengan 0. Jika tombol ditekan, maka A akan bernilai 1, sehingga program akan
menjalan perintah setelah proses debouncing, tetapi jika A bernilai 0 (tombol tidak ditekan) maka program akan
looping mengulang membaca kembali tombol A.
Jika tombol ditekan, maka variabel “A” akan bernilai 1 dan program akan pindah ke baris di bagian bawah
dan kemudian membandingkan nilai variabel B dengan angka 0. Karena di bagian deklarasi awal, variabel “B”
sudah diberi nilai awal sebesar 0, maka pernyataan ini akan bernilai benar dan program di baris berikutnya akan
dijalankan yaitu menyalahkan lampu LED dan mengganti nilai B dengan 1. Setelah itu program akan melakukan
pengulangan ke awal yaitu membaca kembali tombol. Selama tombol tidak ditekan, maka program dibawahnya
tidak akan dijalankan.
Ketika tombol kembali ditekan, maka pernyataan ” A == 1″ akan kembali bernilai benar dan program akan
menjalankan baris berikutnya yaitu membandingkan nilai B dengan 0 (B==0), karena pada proses sebelumnya nilai
B sudah diganti dengan 1, maka pernyataan menjadi salah sehingga pembacaan program loncat ke pernyataan
“else” dan menjalankan perintah yang ada dibawah “else” yaitu mematikan lampu LED dan kembali mengganti
nilai B dengan 0. Demikian proses berulang-ulang.
Pada program ini yang menjadi masalah adalah mengatasi kondisi bouncing yang timbul pada tombo,l
ketika toombol ditekan. Untuk mengatasi hal ini, dapat digunakan waktu tunda sebesar beberapa mili detik supaya
data yang masuk benar-benar stabil baru nilai data diambil. Penentuan waktu tunda ini dapat dilakukan dengan
coba-coba dan sangat tergantung pada jenis tombol yang digunakan.
PROYEK LED

01 - Project Led Blink



Led Blink, program akan mengakses pin 10 dan memerintahkan arduino untuk mengulang blink led. Dengan
mengerjakan proyek ini, kita akan mempelajari beberapa dasar-dasar elektronik dan sketch programming Arduino.

Skema:

Note Karena saya mempelajari arduino dari nol, jadi saya share juga yang hal-hal yang mungkin terlihat remeh
bagi para expert. Warna kabel jumper tidak harus sesuai gambar, namun untuk kebiasaan yang baik, usahakn
untuk positif gunakan warna merah, untuk ground gunakan hitam. Lubang pada breadboard pun tidak masalah,
kita bisa memasang di lubang yang mana saja. Yang harus betul-betul diperhatikan adalah hubungan antar
komponen dan pin pada arduino, harus sesuai gambar.

Sketch:

// Project 1 - LED Flasher


int ledPin = 10;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

setelah sketch diketik, tekan tombol verivy, bila tidak ada error, tekan tombol upload. (silakan lihat cara upload
dan konek arduino uno dengan komputer).

Pembahasan Sketch:

// Project 1 - LED Flasher

Ini adalah komentar baris yang berguna untuk dokumentasi program, kompiler akan mengabaikan bagian ini. Baris
komentar berguna bagi programmer agar bisa mengerti maksud program.

int ledPin = 10;


Inisialisasi variable, dalam hal ini inisialisasi variable bernama ledPin dengan type data integer dan nilai 10.

void setup() {
pinMode(ledPin, OUTPUT);
}
Setiap sketch arduino wajib memiliki fungsi setup() dan loop(). Fungsi setup() dipanggil hanya sekali saat pertama
kali program berjalan. Fungsi setup() biasanya tempat untuk men-setup hal-hal umum agar program Anda siap
dijalankan, seperti setup pin modes, setting serial baud rates, dan lainnya.

Pada sketch Led Blink, fungsi setup hanya memiliki 1 baris perintah yaitu:

pinMode(ledPin, OUTPUT);

pinMode fungsi yang berguna untuk memberitahu arduino bahwa pin pada board akan digunakan sebagai input
atau output.Dalam baris program diatas, kita memberitahu arduino untuk menset pin 10 (nilai ledPin adalah 10)
sebagai OUTPUT.

void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

Fungsi loop() function adalah program utama yang dipanggil secara continue selama arduino menyala (dialiri
power). Setiap perintah dalam fungsi loop() akan dipanggil satu persatu sampai perintah terakhir dalam blok loop
dicapai, lalu Arduino akan kembali ke awal perintah di blok fungsi loop(), sampai Arduino dimatikan atau tombol
reset ditekan.

Jadi dalam proyek ini Arduino akan menyalakan led, menunggu selama 1 detik, lalu mematikan led, lalu menunggu
1 detik. Urutan perintah ini akan diulang terus menerus sampai arduino dimatikan atau direset.
02 - Project LED Blinker Advanced - SOS Signal

Dari rangkaian proyek LED Blinker sebelumnya, kita dapat membuat lebih advanced dengan kreatifitas dalam
programming. Salah satu contohnya adalah S.O.S kode morse dengan LED. LED akan menyala lebih lama untuk
menunjukkan kode garis, dan menyala lebih sebentar untuk kode titik. (Morse merupakan code dengan garis dan
titik.

Sketch S.O.S Morse:

// LED connected to digital pin 10


int ledPin = 10;

// run once, when the sketch starts


void setup()
{
// sets the digital pin as output
pinMode(ledPin, OUTPUT);
}

// run over and over again


void loop()
{
// 3 dits (3 titik atau huruf S)
for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(150); // waits for 150ms
digitalWrite(ledPin, LOW); // sets the LED off
delay(100); // waits for 100ms
}

// 100ms delay to cause slight gap between letters


delay(100);

// 3 dahs (3 garis atau huruf O)


for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(400); // waits for 400ms
digitalWrite(ledPin, LOW); // sets the LED off
delay(100); // waits for 100ms
}

// 100ms delay to cause slight gap between letters


delay(100);

// 3 dits again (3 titik atau huruf S)


for (int x=0; x<3; x++) {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(150); // waits for 150ms
digitalWrite(ledPin, LOW); // sets the LED off
delay(100); // waits for 100ms
}

// wait 5 seconds before repeating the SOS signal


delay(5000);
}

Pembahasan Kode:

Untuk fungsi setup, kita hanya mengidentifikasikan pinout dari LED, masih seperti sketch sebelumnya (proyek Led
Blinker).

Perubahan cukup banyak, dilakukan pada fungsi loop(). Secara umum, fungsi loop() memiliki logika menyalakan
LED dengan kode morse S.O.S secara terus menerus, diantara sinyal SOS diberikan jeda selama 5 detik.

Hal yang baru disini adalah fungsi for(), ini adalah fungsi perulangan. memiliki parameter nilai awal, nilai akhir dan
nilai penambahan. Nilai awal untuk menentukan awal loop, nilai akhir untuk mengecek apakah nilai saat ini sudah
mencapai nilai akhir, bila belum maka nilai sekarang akan ditambahkan sesuai nilai increment, dan blok kode
didalam loop akan dijalankan.

Pada sketch diatas loop akan dilakukan sebanyak 3 kali


for (int x=0; x<3; x++) {
//blok kode loop
}

For I : x=0, lalu akan dibandingkan, 0 < 3, bila betul maka, nilai x akan ditambah 1, menjadi 1, lalu blok kode
didalam for akan dilakukan.
For II : x=1, lalu dibandingkan 1<3, kondisi betul, nilai x ditambah menjadi 2, lalu blok kode didalam for akan
dijalankan.
For III : x=2, lalu dibandingkan 2<3, kondisi betul, nilai x ditambah menjadi 3, lalu blok kode didalam for akan
dijalankan.
For III : x=3, lalu dibandingkan 3<3, kondisi salah, maka program akan melanjutkan kebaris perintah berikutnya,
blok for akan dilewati.
Jadi blok for ke-1 akan membuat huruf S, blok for ke-2 membuat huruf O, blok for ke-3 membuat huruf S, lalu
delay 5 detik.
03 - Proyek Lampu Lalu Lintas
Rangkaian atau Skema

Note :
Pinout yang digunakan, disini digunakan pinout digital 8, 9 dan 10. Juga ground.

Sketch Lampu Lalu Lintas

// Project 3 - Traffic Lights


int ledDelay = 5000; // delay in between changes
int redPin = 10;
int yellowPin = 9;
int greenPin = 8;

void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}

void loop() {
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 5 seconds

digitalWrite(yellowPin, HIGH); // turn on yellow


delay(2000); // wait 2 seconds

digitalWrite(greenPin, HIGH); // turn green on


digitalWrite(redPin, LOW); // turn red off
digitalWrite(yellowPin, LOW); // turn yellow off
delay(ledDelay); // wait ledDelay milliseconds

digitalWrite(yellowPin, HIGH); // turn yellow on


digitalWrite(greenPin, LOW); // turn green off
delay(2000); // wait 2 seconds

digitalWrite(yellowPin, LOW); // turn yellow off

// now our loop repeats


}

Logika programnya:
~ nyalakan lampu merah, tunggu 5 detik
~ nyalakan lampu kuning, tunggu 2 detik
~ nyalakan lampu hijau, matikan lampu merah dan kuning lalu tunggu 5 detik
~ nyalakan lampu kuning, matikan lampu hijau, tunggu 2 detik.
~ matikan lampu kuning, dan program kembali ke awal fungsi loop()
04 - Proyek Lampu Lalu Lintas Advanced

Kali ini, proyek kita akan ditambah fungsinya dari proyek sebelumnya yaitu proyek Lampu Lintas. Fungsi yang
ditambahkan adalah lampu penyebrang jalan. Saat penyebrang menekan saklar untuk menyebrang jalan, lampu
lalu lintas akan berganti menjadi orange, lalu merah, kemudian lampu penyebrang jalan akan menyala hijau.
Setelah sekian detik waktu, lampu penyebrang jalan akan berganti merah, lampu lalulintas akan kembali berjalan
normal.

Jadi dalam proyek ini kita juga belajar menangkap input dari luar sistem, juga mengenal tipe data baru yaitu
unsigned long.

Komponen :
~ 2 LED merah
~ 1 LED kuning
~ 2 LED hijau
~ 1 resistor 10 kiloohm
~ 5 resistor
~ 1 pushbutton

Skema:

Sketch
// Project 4 - Interactive Traffic Lights
int carRed = 12; // assign the car lights
int carYellow = 11;
int carGreen = 10;int pedRed = 9; // assign the pedestrian lights
int pedGreen = 8;
int button = 2; // button pin
int crossTime = 5000; // time allowed to cross
unsigned long changeTime = 0; // time last pedestrian cycle completed

void setup() {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // button on pin 2

// turn on the green light


digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}

void loop() {
int state = digitalRead(button);
/* check if button is pressed and it is over 5 seconds since last button press */
if (state == HIGH && (millis() - changeTime) > 5000) {
// Call the function to change the lights
changeLights();
}
}

void changeLights() {
digitalWrite(carGreen, LOW); // green off
digitalWrite(carYellow, HIGH); // yellow on
delay(2000); // wait 2 seconds
digitalWrite(carYellow, LOW); // yellow off
digitalWrite(carRed, HIGH); // red on
delay(1000); // wait 1 second till its safe
digitalWrite(pedRed, LOW); // ped red off
digitalWrite(pedGreen, HIGH); // ped green on
delay(crossTime); // wait for preset time period

// flash the ped green


for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}

// turn ped red on


digitalWrite(pedRed, HIGH);
delay(500);
digitalWrite(carYellow, HIGH); // yellow on
digitalWrite(carRed, LOW); // red off
delay(1000);
digitalWrite(carGreen, HIGH);
digitalWrite(carYellow, LOW); // yellow off

// record the time since last change of lights


changeTime = millis();

// then return to the main program loop


}

Penjelasan Program:

Kebanyakan dari program diatas sudah dapat Anda pahami, karena mirip dengan proyek sebelumnya. Disini ada
hal baru yaitu tipe data baru unsigned long

unsigned long changeTime = 0;

Tipe data integer mampu menyimpan angka dari −32,768 and 32,767, sementara long −2,147,483,648 to
2,147,483,647. kata keyword unsigned membuat variable changeTime mampu menampung angka 0 to
4,294,967,295. Pemilihan tipe data diatas agar variable tidak overflow dan program menjadi error secara logik.

Sempat terpikir oleh saya, mengapa gak semua pake tipe data long aja.. biar gak pusing. Nah, dikarenakan chip
ATMega328 ini dibuat dengan resource yang minimum, kita harus pintar memilah tipe data agar tidak
memboroskan resource.

Untuk menunggu input dari luar sistem, kita harus menentukan pin mana yang akan menjadi input.

pinMode(button, INPUT); // set pin sebagai input

Kemudian pada fungsi loop() kita menunggu input dari user, dan melakukan pengecekan, apakah ada input dari
luar sistem.

void loop() {
int state = digitalRead(button);
/* check if button is pressed and it is over 5 seconds since last button press */
if (state == HIGH && (millis() - changeTime) > 5000) {
// Call the function to change the lights
changeLights();
}
}

Perintah if diatas akan melakukan cek, jika button ditekan dan waktu sekarang (semenjak Arduino menyala) -
kurangi variable changeTime lebih besar dari 5000. Jika kedua syarat dipenuhi maka perintah fungsi changeLights()
didalam blok if akan dijalankan.

Pada Proyek ini, kita juga belajar mengenai pull-down resistor.


05 - LED Chase Effect

Di project ke-5 kita akan membuat LED yang memiliki efek bergerak saling mengejar. Disini kita akan belajar
mengenai konsep dari arrays.

Skema:

Sketch:

// Project 5 - LED Chase Effect


byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay = 65; // delay between changes
int direction = 1;
int currentLED = 0;
unsigned long changeTime;

void setup() {
for (int x=0; x<10; x++) { // set all pins to output
pinMode(ledPin[x], OUTPUT);
}
changeTime = millis();
}

void loop() {
if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
changeLED();
changeTime = millis();
}
}

void changeLED() {
for (int x=0; x<10; x++) { //turn off all LED's
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); //turn on the current LED
currentLED += direction; //increment by the direction value
// change direction if we reach the end
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
}

Penjelasan Sketch

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

Perintah diatas untuk mendeklarasikan variable dengan tipe array dengan tipe data byte. semua element dapat
diakses melalui nama yang sama, dalam hal ini adalah variable ledPin. contoh ledPin[0] akan menunjukkan nilai 4.
Tanda [] setelah nama variable menunjukkan pada compiler tipe array adalah array variable. Pada array ini kita
inisialisasi nilai untuk menunjukkan pin Arduino.
Jika hendak mengdeklarasikan array tanpa inisialisasi nilai, kita perlu memberi tahu Arduino besar dari array.
Contoh:

byte ledPin[10];
Pada sketch kita, variable array ini digunakan untuk mengakses LED. Pada fungsi loop(), kita cek apakah ledDelay
sudah dilewati sejak perubahan LED terakhir, jika sudah, maka fungsi ChangeLED() akan dipanggil.
Yang dilakukan fungsi ChangeLEDadalah mematikan semua LED dan menyalakan LED yg harus aktif saat ini., yang
disimpan di variable currentLED.
Setelah currentLED dinyalakan, nilai currentLED akan ditambahkan atau dikurangkan, berdasar variable direction.
Variable direction ditentukan oleh blok if, jika currentLED bernilai 9, direction akan -1, bila currentLED bernilai 0
maka direction akan +1;
Program kita akan membuat nyala LED bergerak bolak-balik.

06 - Project LED Chase Advanced

Biarkan layout sirkuit pada proyek 05, kita akan menambahkan potentiiometer pada rangkaian tersebut. Dengan
potentiometer kita dapat mengubah kecepatan LED saat "berlari".

Komponen yang diperlukan


• 4.7 K.Ohm Rotaray Potentiometer

Skema

Sketch:

byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay; // delay between changes
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2; // select the input pin for the potentiomete

void setup() {
for (int x=0; x<10; x++) { // set all pins to output
pinMode(ledPin[x], OUTPUT);
}
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin); // read the value from the pot
if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x=0; x<10; x++) { // turn off all LED's
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); // turn on the current LED
currentLED += direction; // increment by the direction value
// change direction if we reach the end
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
}
Penjelasan Sketch

Sketch kita cukup mirip dengan proyek sebelumnya. Kita hanya menambahkan potentiometer pada sisi hardware
dan pada sisi program kita menambahkan perintah untuk membaca input dari potenstiometer dan digunakan
untuk mengatur kecepatan LED berlari.

int potPin = 2;

perintah diatas mendeklarasikan variable untuk menampung input dari potentiometer, tipe data adalah integer.
Perintah yang digunakan untuk membaca input adalah analogRead.

Analog pin dapat membaca voltage dari 0 - 5 volts, dalam integer dari 0 (0 volts) sampai 1.023 (5 volts). Berarti
resolusi 4.9mV per unit (5 volts / 1.024 units).

ledDelay = analogRead(potPin);

Kita membaca input dari potentiometer dan meng-adjust delay diantara 0 dan 1023 millisecond dengan
menggunakan nilai dari ledDelay yang diperoleh dari input potentiometer. Perhatikan kita tidak perlu mengatur
analog sebagai input atau output seperti juga dengan digital pin

Tantangan Programming
1. Dengan mengubah program, Anda dapat membuat efek bouncing. Led bergerak dari kiri ke
kanan, lalu langsung start dari kanan ke kiri.
2. Tantangan kedua, ubah juga program Anda untuk efek bouncing bola yang makin lama makin
melemah.

07 - LED Dimmer

Proyek ini memiliki rangkaian sederhana, hanya untuk memberikan ide mengontrol tingkat kecerahan LED melalui
arduino. Pada proyek sebelumnya, kita hanya mematikan dan menyalakan LED. Pada proyek ini kita akan
menyalakan dari tingkat kecerahan rendah hingga maksimum, lalu mematikan dari dari tingkat kecerahan tinggi
hingga padam.

Skema:

Sketch:
// Project 11 - LED Dimmer
int ledPin = 11;
float sinVal;
int ledVal;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
ledVal = int(sinVal*255);
analogWrite(ledPin, ledVal);
delay(25);
}
}
Verifikasi dan upload sketch diatas, LED akan menyala dari redup hingga terang, lalu dari terang, redup hingga
padam.
Untuk melakukan hal tersebut, kita menggunakan gelombang sinus. Sinus memilki gelombang dari 0 merambat
naik ke 1 dan kembali merambat turun ke 0 (seperti berbentuk setengah lingkaran).

Fungsi yang digunakan adalah sin(), fungsi trigonometri matematika untuk perhitungan sudut. Pada sketch, kiat
hanya menggunakan interval 0-179 (kita tidak memerlukan nilai negatif).

Fungsi sin memerlukan nilai dalam radian, bukan dalam sudut. Jadi persamaan yang digunakan adalah
sin(x*(3.1412/180)), setelah mendapatkan nilai radian, untuk kebutuhan kita, nilai dari persamaan tadi dikalikan
255. Setelah itu kita akan menulis nilai tersebut ke pin dimana LED tersambung.

Nilai yang diperoleh dari perhitungan diatas akan berkisar dari 0 s/d 1. 0 untuk LED kondisi padam, 1 untuk LED
menyala dengan tingkat kecerahan maksimum.

08 - RGB Mood Lamp

Pada proyek kali ini, kita akan menggunakan fitur PWM dari Atmega untuk mengatur tingkat kecerahan pada LED.
Dengan menggunakan fitur ini, kita dapat menggunakan 3 LED (merah, hijau dan biru) untuk menghasilkan warna
cahaya yang kita inginkan.

Gunakan Silinder Cover untuk menutup 3 Led yang digunakan, agar gabungan warna cahaya dari led bisa
disebarkan melalui cover.

Skema:

Sketch :
// Project 12 - Mood Lamp
float RGB1[3];
float RGB2[3];
float INC[3];
int red, green, blue;
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9;

void setup(){
Serial.begin(9600);
randomSeed(analogRead(0));
RGB1[0] = 0;
RGB1[1] = 0;
RGB1[2] = 0;

RGB2[0] = random(256);
RGB2[1] = random(256);
RGB2[2] = random(256);
}

void loop(){
randomSeed(analogRead(0));
for (int x=0; x<3; x++) {
INC[x] = (RGB1[x] - RGB2[x]) / 256;
}
for (int x=0; x<256; x++) {
red = int(RGB1[0]);
green = int(RGB1[1]);
blue = int(RGB1[2]);
analogWrite (RedPin, red);
analogWrite (GreenPin, green);
analogWrite (BluePin, blue);
delay(100);
RGB1[0] -= INC[0];
RGB1[1] -= INC[1];
RGB1[2] -= INC[2];
}
for (int x=0; x<3; x++) {
RGB2[x] = random(556)-300;
RGB2[x] = constrain(RGB2[x], 0, 255);
delay(1000);
}
}

Setelah diupload, LED akan berubah warna secara perlahan menjadi mood lamp.

Penjelasan Code :
Yang perlu diperhatikan adalah aturan warna dari cahaya, dengan kombinasi 3 elemen dasar cahaya yaitu Red,
Green dan Blue, kita bisa menghasilkan warna yang kita ingingkan dengan mengatur intesitas masing-masing
warna.

Gambar dibawah menunjukkan pencampuran warna dari RGB:

Dengan mengatur tingkat brightness menggunakan PWM, kita dapat menghasilkan variasi warna. Gunakan plastic
diffuser untuk menutupi 3 LED pada skema kita, agar cahaya menyatu. Contoh masukkan 3 LED kedalam bola
pingpong.
Total rentang warna yang dapat diperoleh dengan menggunakan PWM adalah 16.777.216 warna (256 x 256 x
256).
Pada code, kita deklarasikan floating point arrays dan integer untuk menyimpan nilai RGB.

float RGB1[3];
float RGB2[3];
float INC[3];
int red, green, blue;

randomSeed(analogRead(0));

Perintah randomSeed untuk menghasilkan angka random, sebetulnya chip komputer tidak bisa menghasilkan
angka random. Prosesor akan menggunakan fungsi matematika untuk menghasilkan angka pseudo-random.
Dengan “seed,” kita memberitahu processor kapan untuk mengembalikan nilai random. Pada code kita, value yang
kita berikan pada perintah randomSeed adalah value dari hasil pembacaan pada analog pin ke -0. Dimana kita tidak
melakukan koneksi apa-apa di pin analog 0, angka random akan dihasilkan dari analog noise. Setelah kita mengatur
"seed" untuk angka random, kita dapat menghasilkan angka random melalui fungsi random(). Dari sini kita
memiliki 2 angka random RGB yang disimpan dalam variable array.

RGB1 adalah variable untuk menyimpan warna awal. Dalam hal ini 0, alias tidak ada cahaya sama sekali.

RGB1[0] = 0;
RGB1[1] = 0;
RGB1[2] = 0;
RGB2 adalah variable untuk menyimpan warna yang dituju. Program akan membuat peralihan warna dari RGB1 ke
RGB2.

RGB2[0] = random(256);
RGB2[1] = random(256);
RGB2[2] = random(256);

Dalam hal ini kita membuat warna random dengan fungsi random(256) dimana value yang diperoleh diantara 0 -
255. Fungsi random juga bisa menggunakan 2 parameter, contoh random (10-50) angka menghasilan value antara
10-49.

Logika program selanjutnya adalah, kita akan menentukan nilai increment warna. Lalu code akan menuliskan ke
pinout arduino. Saat sesudah melewati 256 loop, nilai RGB1 akan sama atau mendekati nilai RGB2, pada blok for
ke-3 kita akan mengatur nilai RGB2 yang baru. Perintah constrain untuk memastikan nilai positif (PWM tidak bisa
menerima nilai negatif).

Fungsi constrain memerlukan 3 parameter, yaitu constrain(x, a, b)


x adalah angka yang akan di constrain
a adalah range terendah
b adalah range tertinggi.

Dalam hal ini kita akan membatasi fungsi contrain dari 0 hingga 255.

for (int x=0; x<3; x++) {


INC[x] = (RGB1[x] - RGB2[x]) / 256;
}
for (int x=0; x<256; x++) {
red = int(RGB1[0]);
green = int(RGB1[1]);
blue = int(RGB1[2]);
analogWrite (RedPin, red);
analogWrite (GreenPin, green);
analogWrite (BluePin, blue);
delay(100);
RGB1[0] -= INC[0];
RGB1[1] -= INC[1];
RGB1[2] -= INC[2];
}
for (int x=0; x<3; x++) {
RGB2[x] = random(556)-300;
RGB2[x] = constrain(RGB2[x], 0, 255);
delay(1000);
}

Chalange :
Untuk meningkatkan kreatifitas dalam programming, coba buat perubahan warna beradarkan urutan tertentu,
misalnya urutan warna pelangi.
09 - Piezo Sounder Alarm

Aplikasi dari suara bisa banyak, alarm, warning beeps atau alert notification. Code yang digunakan adalah tone().
Pada project 11 ini kita akan mencoba membuat alarm sederhana, seperti alarm mobil.

Komponen yang digunakan

• Piezo Sounder
• 2 way screw terminal

Saat memilih piezo sounder, pastikan jangan membeli tipe active buzzer, yang digunakan pada proyek ini adalah
piezo sounder pasif AC.

Skema:

Sketch:

// Project 11 - Piezo Sounder Alarm


float sinVal;
int toneVal;

void setup() {
pinMode(8, OUTPUT);
}

void loop() {
for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));
tone(8, toneVal);
delay(2);
}
}

Program diatas mirip dengan projek led dimmer, hanya saja output pada projek ini menggunakan piezo sounder.

Pertama kita siapkan 2 variables

float sinVal;
int toneVal;

variable sinVal float digunakan untuk menyimpang nilai sin, yang menghasilkan suara naik turun sesuai nilai sin.
Variabel toneVal untuk menyimpan nilai sinVal yang telah kita konversi ke frekuensi yang dibutuhkan.

Pada fungsi setup, kita assign pin 8 sebagai output.

void setup() {
pinMode(8, OUTPUT);
}

Pada fungsi main loop, kita akan melakukan loop dari 0 - 179.

for (int x=0; x<180; x++)

lalu nilai x akan kita convert ke radian dan ditampung dalam variable sinVal. Setelah nilai sinVal kita peroleh, kita
convert ke frequency dan ditampung dalam variable toneVal.
sinVal = (sin(x*(3.1412/180)));
// generate a frequency from the sin value
toneVal = 2000+(int(sinVal*1000));

Berikutnya kita menggunakan perintah tone() untuk menghasilkan suara pada piezo sounder.

tone(8, toneVal);

Perintah tone() membutuhkan 2 atau 3 parameters.

tone(pin, frequency)
tone(pin, frequency, duration)

Parameter pin adalah digital pin yang digunakan sebagai output ke piezo dan frequency adalah frequency dari tone
dalam hertz. Parameter duration adalah optional, dalam satuan milisekon. Jika tidak diisi, maka tone akan terus
dibunyikan hingga kita memainkan nada lainnya, atau hingga kita memberikan perintah berhenti dengan perintah
noTone(pin).

Pada akhir sketch, kita memberikan perintah delay selama 2 milliseconds untuk memberikan jeda antara bunyi.

delay(2);

Mungkin timbul pertanyaan, kenapa gak pake perintah seperti ini saja tone(8, toneVal, 2); Karena loop yang kita
gunakan sangat pendek, akan menyebabkan perubahan frequency kurang dari millisecond, jadi bila menggunakan
perintah diatas, maka perubahan suara tidak akan terdengar. Dengan perintah delay 2 millisecond, kita
memastikan piezo akan berbunyi di frekuensi yang kita assign selama 2 milliseconds.

Projek ini dapat dikembangkan sesuai kebutuhan dan kreatifitas Anda, bisa digunakan sebagai alert bila suhu
mencapai derajat tertentu, atau bila ada orang mendekat atau apa saja.. silakan berimajinasi.. :)

Nilai 2000 dan 1000 pada perhitungan toneVal dan waktu delay dapat Anda mainkan juga, silakan bereksperimen
untuk mendapatkan suara yang Anda inginkan.

10 - Piezo-Sounder Melody Player

Daripada bikin bunyi yang mengganggu, kita bikin piezo memainkan melodi. Pada proyek ini akan kita bikin arduino
memainkan lagu "Oh My Darling Clementine". Biarkan rangkaian tetap seperti proyek sebelumnya.

Code:

// Project 14 - Piezo Sounder Melody Player

#define NOTE_C3 131


#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625

int tune[] = {
NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,
NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,
NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,
NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,
NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,
NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3
};

float duration[] = {
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,
EIGHTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF
};

int length;

void setup() {
pinMode(8, OUTPUT);
length = sizeof(tune) / sizeof(tune[0]);
}

void loop() {
for (int x=0; x<length; x++) {
tone(8, tune[x]);
delay(1500 * duration[x]);
noTone(8);
}
delay(5000);
}

Pembahasan Kode:

Kode kali ini diawali dengan perintah define, perintah ini berguna untuk mendifinisikan sebuah token berserta
nilainya.
Pada proyek ini kita melakukan perintah define untuk set not dari C3 - B4 beserta nilai frekuensi tiap-tiap not.
Sebetulnya lagu pada proyek ini tidak menggunakan semua lagu, namun kita sediakan, barangkali pembaca hendak
bikin lagu pilihan sendiri.
Direktif berikutnya adalah panjang not. Yang sudah lupa pelajaran seni musik waktu SMP atau SMA, monggo
dibuka-buka lagi bukunya.. ;) Panjang note bisa berupa penuh, setengah, seperempat, seperdelapan atau
seperenambelas. Angka tersebut akan kita gunakan untuk perhitungan panjang setiap note. Sebagai contoh note
seperempat adalah 0.25, pada contoh kasus kita maka 1500 x 0.25 untuk mendapatkan panjang sebuah note
seperempat.

Berikutnya kita akan mendefinisikan tune yang berisi lagu ‘Oh My Darling Clementine’.

int tune[] = {
NOTE_F3, NOTE_F3, NOTE_F3, NOTE_C3,
NOTE_A3, NOTE_A3, NOTE_A3, NOTE_F3,
NOTE_F3, NOTE_A3, NOTE_C4, NOTE_C4, NOTE_AS3, NOTE_A3, NOTE_G3,
NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_AS3,
NOTE_A3, NOTE_G3, NOTE_A3, NOTE_F3,
NOTE_F3, NOTE_A3, NOTE_G3, NOTE_C3, NOTE_E3, NOTE_G3, NOTE_F3
};

Setelah itu, kita buat array baru dengan tipe float, untuk mengatur durasi setiap note pada array int.

float duration[] = {
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, EIGHTH, HALF,
EIGHTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER, QUARTER,
EIGHTH+SIXTEENTH, SIXTEENTH, QUARTER+EIGHTH, EIGHTH, EIGHTH, SIXTEENTH, HALF
};
Nah, tentu sekarang jelaskan, kenapa kita menggunakan perintah define, karena dengan perintah define, kode
program kita akan lebih terbaca, dan bila ada salah, cukup merubah value di area define.

Berikutnya kita buat satu variable integer length.

int length;

variable length ini digunakan untuk menghitung dan menyimpan panjang array.

Pada routing setup, pertama kali kita atur digital pin 8 sebagai output.

pinMode(8, OUTPUT);

kemudian initialisasi variable lenght

length = sizeof(tune) / sizeof(tune[0]);

Fungsi sizeof() mengembalikan nilai bytes dari parameter yang kita kirimkan. Pada contoh kasus kita maka hasilnya
adalah 26 / 2, yaitu 13.

Pada main loop, kita gunakan perintah for untuk looping seluruh note dari lagu.
for (int x=0; x<length; x++) {

Kemudian memainkan note tersebut pada pin 8 dengan perintah berikut

tone(8, tune[x]);

Kemudian kita gunakan delay, panjang delay adalah 1500 milliseconds dikalikan dengan panjang note.

delay(1500 * duration[x]);

Sebelum dilanjut ke note berikutnya, kita matikan dahulu tone yang telah kita assign di pin 8

noTone(8);

Perintah ini untuk memastikan tidak ada 2 nada yang bermain bersamaan. Tanpa perintah noTone, note akan
bercampur, anda bisa bereksperimen untuk melihat hasilnya dengan menghapus perintah noTone.

Akhir program, setelah lagu selesai dimainkan oleh perintah for, kita delay selama 5 detik sebelum memulai lagu
dari awal lagi.

delay(5000);

Jika kamu ingin mempercepat atau memperlambat lagu, dapat mengubah nilai 1500 pada delay fuction.

11 - Projek Piezo Knock Sensor

Piezo disc bekerja ketika terjadi medan listrik pada materi ceramic pada disc yang menyebabkan ceramic berubah
bentuk dan menimbulkan suara. Piezo juga bekerja sebaliknya, saat kita mengetuknya atau menekan, gaya pada
material dapat menimbulkan arus listrik dan dengan menggunakan arduino, kita dapat membaca arus yang terjadi.
Nah ini dapat kita gunakan sebagai sensor ketuk.

Komponen:

• Piezo Sounder (or piezo disc)


• 2-Way Screw Terminal
• 5mm LED (any color)
• 1MW Resistor
• 150W Current-Limiting Resistor
Skema:

Sketch:
// Project 15 - Piezo Knock Sensor
int ledPin = 9; // LED on Digital Pin 9
int piezoPin = 5; // Piezo on Analog Pin 5
int threshold = 120; // The sensor value to reach before activation
int sensorValue = 0; // A variable to store the value read from the sensor
float ledValue = 0; // The brightness of the LED

void setup() {
pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT

// Flash the LED twice to show the program has started


digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW);delay(150);
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}

void loop() {
sensorValue = analogRead(piezoPin); // Read the value from the sensor
if (sensorValue >= threshold) { // If knock detected set brightness to max
ledValue = 255;
}
analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED
ledValue = ledValue - 0.05; // Dim the LED slowly
if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero
}

Setelah kode diupload, LED akan berkedip cepat sebanyak dua kali, menunjukan program telah jalan. Kita dapat
coba sensor ketuk kita. Bila ingin test ketuk, letakan pada permukaan datar, lalu coba ketuk atau tekan dengan jari
kamu. Setiap Arduino mendeteksi ketukan atau tekanan, LED akan menyala dan meredup hingga padam secara
perlahan.

Nilai treshold sensitive untuk piezo disc bisa berbeda, kamu mesti coba-coba. Makin rendah makin sensitif, makan
tinggi makin tidak sensitif.

Pembahasan Kode:

Pertama kita inisialisasi variable.

int ledPin = 9; // LED on Digital Pin 9


int piezoPin = 5; // Piezo on Analog Pin 5
int threshold = 120; // The sensor value to reach before activation
int sensorValue = 0; // A variable to store the value read from the sensor
float ledValue = 0; // The brightness of the LED

Pada fungsi setuup, set output dengan variable ledPin dan LED akan berkedip 2 kali sebagai indikator program
telah berjalan.

void setup() {
pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT

// Flash the LED twice to show the program has started


digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}
Pada main loop, pertama kita membaca nilai analog dari pin 5 yang terhubung dengan piezo

sensorValue = analogRead(piezoPin); // Read the value from the sensor

Lalu kita akan bandingkan nilai tersebut dengan varaible treshold untuk menentukan apakah terjadi ketukan atau
tekanan pada piezo. Jika terjadi, set ledValue ke 255, yaitu voltage maksimum pin PWM di no 9.

if (sensorValue >= threshold) { // If knock detected set brightness to max


ledValue = 255;
}

Kemudian tulis nilai tersebut ke pin PWM 9. perintah int() adalah cara kita mengkonversi tipe data, karena variable
ledValue bertipe float.

analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED

Kemudian kita kurangi nilai dari variable ledValue sebesear 0.05. LED akan meredup dengan perlahan, karena kita
menggunakan angka 0.05 untuk menurunkan tingkat kecerahan LED. Bila ingin lebih cepat atau lebih lambat, bisa
diubah nilai 0.05 tersebut.

ledValue = ledValue - 0.05; // Dim the LED slowly

Pada akhir program, kita periksa nilai ledValue tidak dibawah 0, karena PWM pin 9 hanya menerima nilai 0-255.
Jika lebih kecil atau sama dengan 0, kita kembalikan ke nilai 0.

if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero

Program akan kembali keawal, LED akan meredup perlahan hingga padam atau ketukan berikutnya terdeteksi dan
kecerahan LED akan kembali ke maksimum.

12 - Proyek Light Sensor

Pada proyek kali ini, kita akan menggunakan LDR (Light Dependent Resistor), sesuai dengan namanya, komponen
resistor ini tergantung pada cahaya. Pada situasi gelap nilai resistance akan tinggi. Saat terang, nilai resistance akan
rendah. Makin terang, makin rendah nilai resistance.

Proyek ini akan membaca nilai resistance pada LDR dan menggunakan piezo untuk output suara.

Rangkain pada proyek ini menggunakan rangkaian dasar potential divider, merupakan rangkaian dasar elektro
yang cukup penting.

Komponen yang digunakan

• Piezo Sounder (or Piezo Disc)


• 2-Way Screw Terminal
• Light-Dependent Resistor
• 10kW Resistor

Skema:

LDR dapat dipasang bolak-balik, karena tidak memiliki kaki polarity. Pada proyek ini, digunakan 10kW resistor,
mungkin pada kasus yang lain dibutuhkan resistor yang berbeda yang sesuai dengan LDR yang kamu gunakan.
Kamu bisa gunakan resistor antara 1kW and 10kW.
Sketch:

// Project 16 - Light Sensor


int piezoPin = 8; // Piezo on Pin 8
int ldrPin = 0; // LDR on Analog Pin 0
int ldrValue = 0; // Value read from the LDR

void setup() {
// nothing to do here
}

void loop() {
ldrValue = analogRead(ldrPin); // read the value from the LDR
tone(piezoPin,1000); // play a 1000Hz tone from the piezo
delay(25); // wait a bit
noTone(piezoPin); // stop the tone
delay(ldrValue); // wait the amount of milliseconds in ldrValue
}

Setelah diupload, Arduino akan mengeluarkan beep pendek. Interval antara beep akan panjang bila LDR kurang
mendapat cahaya, dan jarak antara beep akan pendek bila LDR cukup mendapat cahaya.

Jadi proyek ini seperti geiger counter, namun fungsinya adalah mendeteksi photon cahaya. Coba solder LDR pada
kabel yang panjang untuk memudahkan kamu memposisikan LDR, misalnya dibawah meja, dekat lampu atau
lainnya.

Anda mungkin juga menyukai