05 - Bahasa C Arduino
05 - Bahasa C Arduino
05 - Bahasa C Arduino
Target:
● Memahami dasar-dasar pemrograman pada Arduino
● Memahami dasar-dasar pemrograman C++
● Dapat menggunakan percabangan, pengulangan, operasi aritmatika, serta membuat
fungsi sederhana pada bahasa pemrograman C++
Pendahuluan
● Pada bagian ini akan dijelaskan mengenai dasar-dasar pemrograman
Arduino (C++)
● Bacaan yang disarankan untuk pembelajaran lebih lanjut mengenai
bahasa pemrograman C++:
○ Pemrograman C++ oleh Budi Raharjo, penerbit Informatika Bandung
○ Tutorial versi PDF dari cplusplus.com,
http://www.cplusplus.com/files/tutorial.pdf
Pemrograman pada Arduino
Struktur Dasar
● Pemrograman pada Arduino selalu dilakukan dengan menyertakan
dua fungsi utama yaitu void setup() dan void loop()
void setup() {
void loop() {
}
Pemrograman pada Arduino
/*
komentar
dengan
banyak
baris
*/
Komentar (cont’d)
● Pemberian komentar pada kode program hendaknya dilakukan
seperlunya saja, dan digunakan untuk menjelaskan alasan dan tujuan
dari kode program yang dimaksudkan
● Code Tells You How, Comments Tell You Why
Contoh gaya pemberian komentar pada program (diambil dari library Servo)
...
Servo::Servo()
{
if( ServoCount < MAX_SERVOS) {
// assign a servo index to this instance
this->servoIndex = ServoCount++;
// store default values - 12 Aug 2009
servos[this->servoIndex].ticks =
usToTicks(DEFAULT_PULSE_WIDTH);
}
...
Identifier
● Identifier digunakan sebagai pengenal/identitas dari variabel,
konstanta, fungsi, structure, maupun class agar compiler dapat
membedakan antara satu dengan yang lainnya
Contoh penggunaan identifier
#define angka1 5
long angka2 = 2;
void setup() {
Serial.begin(9600);
}
void loop() {
}
Identifier (cont’d)
● Pada contoh di atas, dua buah identifier yaitu setup dan loop
digunakan sebagai nama fungsi, sedangkan dua buah identifier
lainnya digunakan sebagai nama konstanta (angka1) dan nama
variabel (angka2)
● Aturan penulisan identifier pada bahasa C/C++ adalah sebagai
berikut:
○ Bersifat case sensitive, angka1 dan Angka1 dianggap berbeda
○ Tidak dapat diawali dengan karakter angka
○ Tidak dapat menggunakan karakter space
○ Tidak dapat menggunakan karakter simbol (#, @, ?, !, $, %, &, *, dll.)
○ Tidak dapat mengguakan kata kunci yang telah digunakan oleh C/C++
ataupun oleh Arduino IDE
○ Hindari penggunaan nama identifier yang sama dengan nama identifier
yang sebelumnya telah digunakan
Konstanta
● Konstanta digunakan untuk menyimpan nilai tetap yang nantinya tidak
dapat diubah pada saat program dieksekusi
● Salah satu kegunaannya adalah untuk menentukan nilai yang bersifat
tetapan seperti nilai pi (n), kecepatan suara, batas pembacaan nilai
sensor (sebagai contoh panas didefinisikan dengan nilai 55), batas
pengulangan, dll.
● Konstanta dapat dibuat dengan dua cara, yaitu menggunakan
preprocessor directive #define ataupun menggunakan kata kunci
const
Konstanta (cont’d)
● Contoh penggunaan #define adalah seperti di bawah
#define MOTOR 5
void setup() {
pinMode(MOTOR, OUTPUT);
}
void loop() {
digitalWrite(MOTOR, HIGH);
}
Apabila terdapat revisi pada rangkaian hardware, yaitu pin yang digunakan untuk
menggendalikan motor bukan lagi pin 5, kita hanya perlu mengubah nilai dari baris
konstanta MOTOR.
Konstanta (cont’d)
● Contoh penggunaan const adalah seperti di bawah
void setup() {
Serial.begin(9600);
}
void loop() {
for(unsigned char i = MAX; i > 0; i--)
Serial.print("hello");
}
Apabila terdapat revisi pada program, yaitu jumlah pengulangan yang dilakukan bukan
lagi 5 kali, kita hanya perlu mengubah nilai dari baris konstanta MAX.
Variabel
● Variabel merupakan sebuah lokasi pada memori yang digunakan
untuk penyimpanan data/nilai yang dapat diubah
Contoh proses deklarasi variabel
//cara 1
tipe_data identifier;
//cara 2
tipe_data identifier = nilai;
//cara 3
tipe_data identifier1, identifier2;
//cara 4
tipe_data identifier1 = nilai1, identifier2 = nilai2;
Tipe Data
● Variabel memiliki tipe data yang akan digunakan oleh compiler untuk
mengetahui jenis data yang disimpan
Tipe Data Ukuran Memori Rentang Nilai
Tipe-tipe data yang disebutkan pada tabel di atas merupakan tipe data umum pada
bahasa pemrograman C++. Adapun tipe-tipe data tersebut bersifat architecture
dependent, yang berarti, rentang nilai sebuah tipe data dapat berbeda dari sebuah sistem
dengan sistem lainnya (arsitektur 8-bit, arsitektur16-bit, arsitektur 32-bit, arsitektur 64-bit,
dll.).
Tipe Data stdint.h
● Selain menggunakan tipe-tipe data di atas, variabel integer dapat
dibuat dengan mengacu pada tipe yang telah dideklarasikan di dalam
file header stdint.h
● Penggunaan tipe variabel pada stdint.h memungkinkan agar kita
mendapatkan lebar data yang pasti, terlepas dari arsitektur yang
digunakan
byte readSensor;
void setup() {
void loop() {
}
Variabel Global (cont’d)
● Keleluasaan pengaksesan oleh semua fungsi yang ada pada program
merupakan kelebihan kelebihan dari variabel global, namun hal
tersebut juga sekaligus menjadi kekurangan
● Apabila kode program menjadi sangat panjang dan kompleks, maka
keleluasaan pengaksesan tersebut akan menjadi salah satu sumber
error/bug, dimana proses pelacakan error akan sulit dilakukan apabila
seluruh bagian kode program dapat mengakses variabel tersebut
● Berdasarkan alasan tersebut maka hendaknya penggunaan variabel
global harus dibatasi dan jika memang benar-benar diperlukan
Variabel Lokal
● Seperti namanya, variabel lokal merupakan variabel yang hanya
dapat diakses pada lingkup lokal, yaitu di dalam sebuah fungsi
tertentu saja
Contoh deklarasi variabel lokal
void setup() {
byte angka1;
}
void loop() {
byte angka2;
}
Variabel angka1 hanya akan dikenali pada fungsi void setup(), sedangkan variabel
angka2 hanya akan dikenali pada fungsi void loop(). Pengaksesan variabel angka1
pada fungsi void loop() akan mengakibatkan error, demikian juga sebaliknya.
Operator
● Pada program, seringkali kita membutuhkan sebuah solusi dimana
solusi tersebut dihasilkan dari operasi dari satu atau beberapa
variabel/operand
● Bahasa C++ memiliki beberapa jenis operator yaitu:
○ Assignment
○ Arithmetic
○ Compound assignment
○ Increase dan decrease
○ Relational dan equality
○ Logical
○ Conditional
○ Comma
○ Bitwise
Operator (cont’d)
○ Explicit type casting
○ sizeof()
○ dll.
● Masing-masing operator memiliki tingkat eksekusi masing-masing,
sebagai contoh operator * (perkalian) akan didahulukan dari operator
+ (penjumlahan)
● Penjelasan dari masing-masing jenis operator serta tingkat
eksekusinya akan dijabarkan lebih lanjut pada beberapa slide
selanjutnya
Operator
Assignment
● Operator yang digunakan untuk menentukan nilai sebuah variabel
Arithmetic
● Operator yang digunakan untuk membuat ekspresi matematis pada
kode program
Simbol Keterangan
+ Penjumlahan
- Pengurangan
* Perkalian
/ Pembagian
Compound Assignment
● Operator yang digunakan untuk mengubah nilai suatu variabel
dengan cara melakukan operasi pada nilai yang masih terdapat pada
variabel tersebut
Ekspresi Ekspresi yang sesuai
a += 5 a = a + 5
a -= 5 a = a - 5
a *= 5 a = a * 5
a /= 5 a = a / 5
a %= 5 a = a % 5
b = 3;
a = b++;
//nilai a = 3, nilai b = 4
b = 3
a = ++b;
//nilai a = 4, nilai b = 4
Suffix: nilai variabel akan ditambah setelah baris kode program dieksekusi
Prefix: nilai variabel akan ditambah sebelum baris kode program dieksekusi
Operator
Simbol Keterangan
== Sama dengan
(7 == 5) //false
(5 > 4) //true
(13 < 2) //false
(2 < 2) //false
//anggap nilai a = 4, b = 5, c = 6
(a == 5) //4 tidak sama dengan 5, false
(a * b > 7) //20 lebih dari 7, true
(b - 3 < 5) //2 kurang dari 5, true
Operator
Logical
● Operator yang digunakan untuk melakukan operasi logika pada
program
Simbol Keterangan
! NOT
&& AND
|| OR
Operator
Logical (cont’d)
● Contoh penggunaan operator logical adalah seperti di bawah
((5 == 5) && (7 < 5)) //(true && false) memberikan hasil false
((7 < 5) || (13 > 6)) //(false || true) memberikan hasil true
Operator
Conditional
● Operator yang digunakan untuk mengevaluasi sebuah ekspresi
pemrograman, dimana operator ini diwakili oleh simbol ?
● Operator ini akan memberikan sebuah nilai kembalian/return value
apabila ekspresi tersebut memiliki nilai logika true, dan akan
memberikan nilai kembalian/return value yang lain apabila ekspresi
tersebut memiliki nilai logika false
● Format penulisan dari operator conditional adalah seperti di bawah
Contoh format penulisan operator conditional
23 > 5 ? 1 : 0
//memberikan return value 1 karena 23 > 5 memiliki nilai logika
//true
23 == 5 ? 1 : 0
//memberikan return value 0 karena 23 == 5 memiliki nilai logika
//false
Operator
Comma
● Operator ini digunakan untuk memisahkan beberapa ekspresi
pemrograman, dimana seharusnya hanya satu ekspresi saja yang
dibutuhkan
● Operator ini diwakili dengan simbol ,
a = (b = 5, b+2);
//nilai 5 diisikan ke variabel b, nilai b ditambah 2, kemudian
//nilai tersebut akhirnya diisikan ke variabel a, yaitu 7
Operator
Bitwise
● Operator bitwise digunakan untuk melakukan operasi sebuah nilai
berdasarkan representasi bit-nya
Simbol Keterangan
& NOT
| AND
^ OR
~ NOT
Bitwise (cont’d)
● Contoh penggunaan operator bitwise adalah seperti di bawah
byte a = 0x68;
byte b = 0x35;
byte c = a | b;
byte d = a & b;
// a = 0b01101000
// b = 0b00110101
//---------------- OR
// c = 0b01111101 = 0x7D
// a = 0b01101000
// b = 0b00110101
//---------------- AND
// c = 0b00100000 = 0x20
Operator
int a;
float b = 3.14;
a = (int)b;
Pada baris terakhir, nilai 3.14 akan dikonversi terlebih dahulu ke tipe integer (bilangan
bulat) sebelum diisikan ke variabel a. Nilai hasil konversi adalah 3, dimana sisanya, yaitu
0.14 tidak diikutkan (pembulatan ke bawah/round down).
Operator
sizeof()
● Operator ini akan digunakan untuk melakukan pemeriksaan ukuran
dari sebuah variabel atau tipe data
Contoh penggunaan operator sizeof()
int a = 5;
int b = sizeof(a);
Setelah baris kode program terakhir dieksekusi, nilai dari variabel b adalah 2 karena
ukuran dari variabel dengan tipe data int adalah 2 Byte
Operator
Eksekusi Operator
● Operator ini digunakan untuk melakukan konversi sebuah nilai
dengan tipe tertentu ke tipe yang lain
() [] . -> ++ --
dynamic_cast
2 static_cast Suffix Kiri ke kanan
reinterpret_cast
const_cast typeid
++ -- ~ ! sizeof new
Prefix
delete
3 Kanan ke kiri
* & Pointer
= *= /= %= += -= >>=
17 Assignment Kanan ke kiri
<<= &= ^= |=
Semakin nilai pada kolom Level, maka semakin tinggi prioritas eksekusi sebuah operator.
Apabila pada suatu baris kode program terdapat penggunaan beberapa operator dengan
level eksekusi yang sama, maka urutan eksekusi operator adalah sesuai dengan
informasi pada kolom Grouping.
Operator
int a = 5 + 6 / 2;
//6 / 2 akan dieksekusi terlebih dahulu, dimana hasilnya akan
//ditambah dengan 5
int a = 5 * 6 / 2;
//5 * 6 akan dieksekusi terlebih dahulu, dimana hasilnya akan
//dibagi dengan 2
Urutan eksekusi dapat diubah dengan penggunaan tanda ( (buka kurung) dan ) (tutup
kurung).
int a = (5 + 6) / 2;
//5 + 6 akan dieksekusi terlebih dahulu, dimana hasilnya akan
//dibagi dengan 2
Fungsi
● Pada umumnya, setiap bahasa pemrograman memiliki fitur yang
mengijinkan seorang programmer untuk membuat sebuah fungsi
● Pada bahasa pemrograman C/C++, sebuah program yang utuh
dibentuk melalui kumpulan dari fungsi-fungsi
● Penggunaan fungsi memungkinkan seorang programmer untuk
membuat program yang dibuat bersifat modular, sehingga kode
program akan lebih mudah dipahami dan dapat digunakan untuk
kode-kode program lain yang akan dibuat
● Arduino IDE telah dilengkapi dengan beberapa fungsi bawaan yang
siap untuk digunakan dimana beberapa contohnya adalah
pinMode(), digitalRead(), digitalWrite(), analogRead(),
analogWrite(), dll.
Fungsi (cont’d)
● Selain dari fungsi-fungsi bawaan yang ada pada Arduino IDE, kita
dimungkinkan untuk dapat membuat fungsi-fungsi sendiri
Nilai Kembalian
● Nilai kembalian/return value merupakan nilai yang akan diberikan oleh
sebuah fungsi setelah kode program yang ada di dalam fungsi
tersebut selesai dieksekusi
● Sebuah fungsi dapat memiliki nilai kembalian atau tidak
● Contoh dari pembuatan/deklarasi fungsi pada bahasa pemrograman
C++ adalah seperti di bawah
return a * b;
}
Fungsi dengan nilai kembalian ditandai dengan tipe fungsi void, sedangkan fungsi
dengan nilai kembalian ditandai dengan tipe fungsi selain void.
Fungsi dengan nilai kembalian digunakan pada saat kita mengharapkan sebuah nilai
hasil dari eksekusi kode program yang ada pada fungsi tersebut. Pada contoh di atas,
kita mengharapkan nilai dari hasil perkalian variabel a dan b.
Pada contoh sebelumnya kita tidak mengharapkan nilai kembalian karena proses kode
program pada fungsi tersebut hanyalah melakukan inisialisasi pin saja.
Fungsi
Parameter Fungsi
● Sebuah fungsi dapat memiliki parameter yang diisi pada saat
pemanggilannya pada kode program, dimana nilai tersebut akan
digunakan pada saat kode program di dalam fungsi tersebut
dieksekusi
Penggunaan parameter pada fungsi akan membuat penggunaan sebuah fungsi menjadi
lebih fleksibel.
Apabila kita melihat fungsi perkalian pada contoh sebelumnya, nilai dari variabel a dan
variabel b telah ditentukan pada fungsi, sedangkan pada contoh ini nilai dari variabel a
dan b akan ditentukan pada saat pemanggilan fungsi perkalian.
Percabangan
● Pada pemrograman pasti akan dijumpai keadaan dimana program
harus memilih kode program mana yang akan dieksekusi sesuai
dengan kondisi yang didapatkan
● Pada pemrograman C/C++ percabangan dapat dilakukan
menggunakan dua buah struktur sintaks yaitu if...else dan
switch...case
if...else
Contoh struktur penulisan if...else
if(kondisiLogika1) {
...
}
else if(kondisiLogika2) {
...
}
else if(kondisiLogika3) {
...
}
else {
...
}
else if dan else bersifat opsional. else if diletakkan setelah if, sedangkan else
diletakkan setelah if atau else if (jika ada).
switch...case
Contoh struktur penulisan switch...case
switch(kondisi) {
case nilai1:
...
break;
case nilai2:
...
break;
default:
...
break;
}
Program akan mengeksekusi ekspresi, yaitu kondisi yang ada pada switch. Nilai dari
eksekusi kondisi akan dibandingkan dengan nilai konstanta pada case pertama, yaitu
nilai1. Jika nilai kondisi sama degan nilai1, maka kode program yang ada dalam
case pertama akan dieksekusi. Jika tidak, maka pemeriksaan akan dilanjutkan ke case
berikutnya. Apabila nilai pada case tidak ada yang sesuai dengan nilai hasil eksekusi
kondisi, maka kode program yang ada pada bagian default akan dieksekusi.
Pengulangan
● Kode program secara umum bersifat sekuensial, yaitu dieksekusi dari
atas ke bawah
● Ada kalanya pada program kita menghendaki suatu bagian kode
program dieksekusi berulang dengan batasan yang kita tentukan
Contoh penulisan kode program yang tidak efisien
int a;
void setup() {
a = a + 7;
a = a + 7;
a = a + 7;
a = a + 7;
a = a + 7;
a = a + 7;
a = a + 7;
}
Pengulangan (cont’d)
Contoh penulisan kode program menggunakan pengulangan for
int a;
void setup() {
for(byte i = 0; i < 7; i++)
a += 7;
}
Nilai a akan ditambah dengan angka 7 sebanyak 7 kali. Jika dibandingkan dengan contoh
sebelumnya, penulisan ini terlihat lebih rapi dan terstruktur.
Bayangkan apabila dibutuhkan 158 baris yang sama, kita tentunya akan kesulitan dalam
menentukan banyaknya baris yang telah kita tulis (menghitung baris secara manual).
Selain itu apabila terdapat revisi program mengenai banyaknya pengulangan, maka kita
akan kesulitan dalam melakukan pengubahan.
Pengulangan
for
Contoh struktur penulisan for
word a;
void setup() {
//struktur for memiliki 3 parameter yang dapat diisi
//parameter pertama , deklarasi variabel pembatas pengulangan
//parameter kedua , kondisi yang akan diperiksa sebelum
//pengulangan dilakukan
//parameter ketiga , bagian increment atau decrement untuk
//variabel pembatas
for(int i = 0 ; i < 80; i++) {
a = a + 5;
}
}
Pengulangan
while
Contoh struktur penulisan while
word a;
void setup() {
//struktur do...while tidak memiliki parameter deklarasi
variabel
//pembatas dan parameter increment/decrement, maka dari itu
kita
//harus membuatnya secara manual
//bagian deklarasi variabel pembatas
//bagian increment/decrement
//bagian pemeriksaan kondisi
int i = 0 ;
while( i < 80) {
a = a + 5;
i++;
}
}
Pengulangan
do...while
Contoh struktur penulisan do...while
word a;
void setup() {
//struktur while tidak memiliki parameter deklarasi variabel
//pembatas dan parameter increment/decrement, maka dari itu
kita
//harus melakukannya secara manual
//bagian deklarasi variabel pembatas
//bagian increment/decrement
//bagian pemeriksaan kondisi
int i = 0 ;
do {
a = a + 5;
i++;
}
while( i < 80);
}
Penyertaan Library
● Salah satu fitur utama yang ada pada platform Arduino terdapat pada
banyaknya pilihan library yang tersedia
● Library merupakan kumpulan kode program yang telah dibuat
sebelumnya
● Umumnya sifat library adalah modular sehingga dapat kita gunakan
pada kode program yang kedepannya akan kita kembangkan
#include <BasicIOShield.h>
#include <Wire.h>
BasicIOShield shield;
void setup() {
void loop() {
if(shield.Button1State()) {
shield.RedOn();
}
else if(!shield.Button1State()) {
shield.RedOff();
}