Anda di halaman 1dari 336

MONSTER ARDUINO

Panduan Praktis Belajar Arduino untuk Pemula

Versi 2

|

HARI SANTOSO

www.elangsakti.com

i

KOBARKAN SEMANGAT INDONESIA!

ii

MONSTER ARDUINO 2

Ebook ini merupakan lanjutan dari ebook sebelumnya yang berjudul “Panduan Praktis Belajar Arduino untuk Pemula” yang kita bagikan secara gratis. Dengan terbitnya ebook terbaru ini, maka ebook tersebut akan kita rapikan kembali dan akan kita beri nama MONSTER ARDUINO 1.

Ebook edisi pertama berisi tentang pengenalan Arduino, cara instalasi Arduino IDE, setting driver, bahasa yang yang dipakai, tipe-tipe data, dan semua hal yang sifatnya dasar terkait dasar-dasar untuk memulai pemrograman Arduino.

Pada MONSTER ARDUINO 2, kita akan membahas sedikit lebih dalam terkait teknik dan tips dalam memprogram serta contoh pemrograman sensor, display, dan pengolah data di Arduino.

Kedepan, serial ebook MONSTER ARDUINO akan kita kembangkan lagi dengan pembahasan yang lebih dalam dan lebih spesifik. Masih banyak yang harus dipelajari agar kita dapat berinovasi dengan Arduino.

Masukan ide, kritik, dan saran yang membangun boleh dikirim ke hari@elangsakti.com. Kita tunggu email dari Anda.

Salam hangat,

Hari.

iii

KOBARKAN SEMANGAT INDONESIA!

iv

CATATAN PENULIS

Penulis sangat bersyukur, atas rahmat Allah, penulis masih diberi kemampuan untuk melanjutkan penulisan buku tentang Arduino versi 2 setelah beberapa bulan vakum. Semoga versi berikutnya bisa rilis lebih cepat.

Terima kasih penulis ucapkan kepada istri tercinta, Aprillia Dewi Kreswanti, yang telah merelakan waktu keluarga demi terselesaikannya penulisan ebook ini.

Terima kasih juga kepada kawan-kawan yang sudah request untuk join ke grup facebook MONSTER ARDUINO, berkat kalian penulis menjadi lebih bersemangat untuk berbagi pengalaman melalui media sosial.

Selanjutnya, semoga ebook ini bermanfaat bagi penggiat Arduino, bagi yang ingin berinovasi di ranah teknologi, robotika, dan IoT.

Salam hangat penuh semangat!

v

Malang, 11 September 2017,

Hari Elangsakti

KOBARKAN SEMANGAT INDONESIA!

vi

DAFTAR ISI

MONSTER ARDUINO 2

iii

CATATAN PENULIS

v

DAFTAR ISI

vii

#00 SEBELUM MULAI

1

#01 MEMINANG ARDUINO

3

1.1 Jenis Arduino untuk Pemula

6

1.2 Project yang Butuh Banyak Pin I/O

7

1.3 Program dengan Clock Tinggi

8

1.4 Project dengan Ukuran Program Besar

9

1.5 Saatnya Memilih!

11

#02 ARDUINO DAN BOOTLOADER

12

2.1 Sekilas tentang Bootloader

12

2.2 Cara Install Bootloader Arduino

16

 

2.2.1 Install Bootloader dengan USBAsp

17

2.2.2 Arduino Sebagai ISP Programmer

24

2.2.3 Install Bootloader dengan Arduino

26

2.2.4 Pengecekan Hasil Instalasi Bootloader

29

#03 HELLO BUZZER

30

3.1

Project Hello Buzzer

30

3.1.1

Rangkaian Hello Buzzer

30

vii

3.1.2 Program Hello Buzzer

31

3.2 Buzzer Aktif dan Buzzer Pasif

33

3.3 Project Dummy Logger

34

#04 TIPS MEMILIH TIPE DATA

38

4.1 Byte dan Boolean, 1 Byte

39

4.2 Char atau Unsigned Char, 1 Byte

41

4.3 Integer dan Unsigned Integer, 2 Byte

41

4.4 Long dan Unsigned Long, 4 Byte

42

4.5 Float atau Double, 4 Byte

42

4.6 Volatile & Interrupt

42

4.7 PROGMEM

44

4.8 String dengan F( )

45

#05 OPTIMALISASI DELAY

47

5.1 Seberapa Cepatkah 16MHz itu?

47

5.2 Project Perbaikan Dummy Logger

50

5.3 Program Simpel Delay yang Responsive

56

#06 RESPONSIVE DENGAN TIMER INTERRUPT

59

6.1 Seperti Apa Timer Interrupt?

59

6.2 Program Timer Interrupt Sederhana

60

6.3 Dummy Logger dengan Timer Interrupt

63

#07 WDT & PROGRAM ANTIMACET

68

7.1 Program WDT Sederhana

71

7.2 Program WDT Lanjutan

73

#08 MODUL RELAY

76

viii

8.1

Active Low atau Active High

79

8.2 Masalah yang Sering Muncul

80

8.3 Mengisolasi Power Supply

81

8.4 Sekilas tentang SSR (Solid State Relay)

83

#09 EKSPLORASI TOMBOL PUSH BUTTON

85

9.1

Internal Pullup Resistor

86

9.1.1 Rangkaian Testing Pullup Resistor

87

9.1.2 Program Tombol tanpan Pullup Resistor

88

9.1.3 Program Tombol dengan Internal Pullup Resistor

90

9.2

Membuat Tombol Multikondisi

91

9.2.1 Program Tombol yang Manusiawi

92

9.2.2 Program Tombol dengan Lock Status

94

9.2.3 Program Tombol Modular

97

9.2.4 Program Satu Tombol Banyak Menu

100

9.3

Membuat Aksi Tombol yang Ditekan Lama

104

9.3.1

Program Aksi Tombol Berdasarkan Lama Ditekan

105

9.4

Mengelola Banyak Tombol dengan Satu Pin

110

9.4.1 Rangkaian Program untuk Membaca 5 Tombol

112

9.4.2 Program Analisis Output Tombol

113

9.4.3 Program Menu 5 Tombol

115

9.4.4 Rangkain 5 Tombol 5 LED

119

9.4.5 Program 5 Tombol 5 LED

121

#10 EEPROM SEBAGAI BLACKBOX

126

ix

10.1

Program Simulasi EEPROM

128

10.2

Program EEPROM 5 Tombol 5 LED

131

#11 PIN OUTPUT YANG MELIMPAH

137

11.1 Rangkaian Dasar IC 74HC595

140

11.2 Project LED Berjalan

141

11.2.1 Rangkaian LED Berjalan

141

11.2.2 Program LED Berjalan

142

11.2.3 Rangkaian Shift Register dengan SPI

145

11.2.4 Program Shift Register dengan SPI

146

#12 SERBA-SERBI DISPLAY 7 SEGMENT

149

12.1

Seven Segment 1 Digit

151

12.1.1 Rangkaian Seven Segment 1 Digit

152

12.1.2 Program Seven Segment 1 Digit

153

12.2

Seven Segment 4 Digit

160

12.2.1 Rangkaian Seven Segment 4 Digit

160

12.2.2 Program Seven Segment 4 Digit

162

12.2.3 Program Seven Segment Rata Kanan

169

12.3

Seven Segment dengan Library SevSeg

170

12.3.1

Program Seven Segment dengan Sevseg

170

12.4

Seven Segment dengan Shift Register

172

12.4.1 Rangkaian 7 Segment 1 Digit dengan Shift Register

172

12.4.2 Program 7 Segment 1 Digit dengan Shift Register

173

12.4.3 Rangkaian Seven Segment 2 Digit dengan Shift Register

176

12.4.4 Program Seven Segment 2 Digit dengan Shift Register

177

x

12.4.5

Rangkaian Seven Segment 4 Digit dengan Shift Register

180

12.4.6

Program Seven Segment 4 Digit dengan Shift Register

182

#13 LEBIH CANTIK DENGAN LCD1602

187

13.1 Sekilas Modul I2C LCD

187

13.2 Rangkaian Dasar Modul I2C LCD

189

13.3 Program Mencari Alamat Modul I2C

191

13.4 Program Mengontrol Lampu Backlight LCD

194

13.5 Program Format Teks LCD

197

13.6 Program Efek Teks NgeBlink

200

13.7 Program Format Teks dan NgeBlink

202

13.8 Program Teks Bergerak

205

13.9 Program Membuat Custom Karakter LCD

210

#14 ALARM SENSOR PIR

214

14.1 Sensor PIR HC-SR501

216

14.2 Rangkaian Sensor HC-SR501

219

14.3 Program Alarm Sensor PIR

220

14.4 Program

Identifikasi Delay Sensor PIR

221

14.5 Program Custom Delay Alarm Sensor PIR

224

#15 SENSOR DHT11 & KUMBUNG JAMUR

228

15.1 Sensor DHT11

228

15.2 Akuisi Data Sensor DHT11

230

15.2.1 Rangkaian Dasar Sensor DHT11

230

15.2.2 Program Akuisisi Data Sensor DHT11

231

xi

15.3

Menampilkan Data pada LCD

234

15.3.1

Program Sensor Suhu dan Kelembaban Digital

235

15.4

Project Kumbung Jamur Sederhana

238

15.4.1 Rangkaian Project Kumbung Jamur

239

15.4.2 Program Kumbung Jamur Sederhana

240

#16 APLKASI REALTIME DENGAN RTC

247

16.1 Rangkaian Dasar RTC DS1307

 

249

16.2 Menampilkan Waktu di Serial Monitor

250

16.3 Menampilkan Jam di Seven Segment

253

16.3.1 Rangkaian Menampilkan Jam di Seven Segment

253

16.3.2 Program Menampilkan Jam di Seven Segment

255

16.4

Menampilkan Waktu di LCD

261

16.4.1 Rangkan Menampilkan Waktu di LCD

261

16.4.2 Program Menampilkan Waktu di LCD

262

16.5

Menampilkan Nama Hari dan Bulan

265

16.5.1

Program Menampilkan Nama Hari dan Bulan

266

16.6

Menampilkan Tanggal Bergerak

271

16.6.1

Program

Menampilkan Tanggal Bergerak

271

16.7

Project Timer Pagi Sore

278

16.7.1 Rangkaian Timer Pagi Sore

280

16.7.2 Program Timer Pagi

Sore

281

#17 KENDALI DENGAN REMOTE

INFRARED

291

17.1

Mengidentifikasi Tombol Remote

292

17.1.1

Rangkaian Modul Receiver Infrared

292

xii

17.1.2

Program Identifikasi Tombol Remote

293

17.2

Project Remote Kontrol Karakter LCD

296

17.2.1 Rangkaian Remote Kontrol Karakter LCD

297

17.2.2 Program Remote Kontrol Karakter LCD

298

#18 PENGENALAN SERVO

306

18.1

Motor Servo Dasar

307

18.1.1 Rangkain Servo dan Arduino

307

18.1.2 Program Servo Sederhana

308

18.2

Kendali Servo dengan Potensiometer

310

18.2.1 Rangkaian Kendali Servo

310

18.2.2 Program Kendali Servo

311

18.3

Kendali Servo dengan Remote

312

18.3.1 Rangkaian Kendali Servo dan IR Receiver

313

18.3.2 Program Kendali Servo dengan Remote IR

314

Tentang Penulis

320

xiii

Bagian #00

SEBELUM MULAI

Untuk mendapatkan hasil maksimal dalam belajar, maka Anda harus praktek. Jika kesulitan dalam memahami program yang ada dalam ebook ini, Anda bisa tanya di grup facebook MONSTER ARDUINO. Silakan cari postingan yang berkaitan dengan program yang ingin ditanyakan.

Selain itu, silakan hubungi penulis jika berkenan miliki paket belajar pendukung khusus ebook ini. Daftar peralatan yang digunakan dalam ebook ini yaitu :

1. Arduino Uno R3 DIP x 1

2. Kabel Data Arduino x 1

3. Paket Belajar Burning Bootloader, terdiri dari :

- IC ATMega328P x 1

- Capasitor 22pf x 2

- XTAL 16MHz x 1

4. Project Board besar MB102 x 1

5. Timer Tiny RTC x 1

6. Sensor PIR x 1

7. Sensor DHT11 x 1

8. Motor Servo SG90 x 1

9. Remote IR 1 paket x 1

MB102 x 1 5. Timer Tiny RTC x 1 6. Sensor PIR x 1 7. Sensor

1

10.

IC Shift Register 74HC595 x 2

11. LCD 1602 x 1

12. Modul LCD I2C x 1

13. 7 segment 1 Digit x 1

14. 7 segment 4 Digit x 1

15. Relay 2 Channel x 1

16. Buzzer aktif x 1

17. Tombol Push Button DIP x 1

18. Potensiometer x 1

19. Resistor 220 x 10

20. Resistor 1k x 10

21. Resistor 4k7 x 10

22. LED merah x 10

23. LED kuning x 10

24. LED hijau x 10

25. Kabel Jumper 20cm (30mm + 10 mf) x 1

ElangSakti.com TIDAK bekerja sama dengan toko manapun dalam penyusunan ebook ini. Oleh sebab itu, jika ada yang mengatasnamakan ElangSakti.com dalam menjual paket belajar sesuai isi ebook ini, kami pastikan bahwa itu bukan dari kami. Sebab, support dari kami hanya diinfokan di website project.elangsakti.com, fanpage ElangSakti.com, atau grup facebook MONSTER ARDUINO. Kami tidak bertanggungjawab apabila ada pihak yang dirugikan yang mengatasnamakan ElangSakti.com.

2

MONSTER ARDUINO . Kami tidak bertanggungjawab apabila ada pihak yang dirugikan yang mengatasnamakan ElangSakti.com. 2

Bagian #01

MEMINANG ARDUINO

Saat kita mulai bangga dan merasa bisa, itulah tanda bahwa keilmuan kita akan segera kadaluarsa.

Kekurangan dari produk open source adalah varian yang kadang terlalu banyak dan membingungkan. Belum khatam mempelajari varian A, sudah muncul varian B. Baru dapet produk varian B, sudah muncul varian C dan D. Arrggghmau nggak mau, kita harus menjadi fast learner, mampu belajar lebih cepat dari kebanyakan orang.

Ada banyak varian dari board Arduino, baik yang hanya minimum board atau yang sudah dilengkapi dengan sensor. Sebut saja Arduino Uno, Nano, Pro Mini, Mega, Intel, Due, Wemos, Lilypad, Zero, atau yang lainnya. Dari deretan varian tersebut, mana yang lebih cocok untuk Anda? Mana yang lebih cocok untuk pemula?

yang lainnya. Dari deretan varian tersebut, mana yang lebih cocok untuk Anda? Mana yang lebih cocok

* * *

3

Belajar pemrograman Arduino, berarti Anda akan belajar tentang logika, algoritma, sintaks bahasa C/C++, konsep elektronika, dan sedikit banyak tentang karakteristik hardware Arduino yang Anda pakai.

Sedikit banyak Anda perlu tahu kapasitas memori, penggunaan register, ADC, DAC, serta jumlah dan karakteristik kaki input/output yang tersedia. Merasa berat dengan semua yang harus Anda pelajari?

Santai saja, sebab semua orang yang levelnya sudah expert, pasti berawal dari level pemula. Level tersebut akan Anda dapat tanpa terasa seiring berjalannya waktu.

Yang Anda butuhkan adalah fokus belajar dan bersabar, bersabar lebih lama dari biasanya!

Kalau dalam belajar Anda merasa pusing, berbahagialah, itu artinya otak Anda sedang bertumbuh. Itu agak mirip ketika ada gigi yang mau tumbuh, sehingga gusi kadang bengkak dan sakit. Begitu juga dengan otak kita. Jika jaringan di otak kita berusaha membuat simpul-simpul keilmuan dan pengalaman baru, kadang kita akan merasa pusing. Percayalah…

4

kita berusaha membuat simpul-simpul keilmuan dan pengalaman baru, kadang kita akan merasa pusing. Percayalah…  4

Untuk belajar Arduino, Anda hanya butuh membuat programnya, upload, jika ada yang error atau aneh, segera tanya teman, atau cari solusinya di internet.

Begitu juga ketika Anda mencoba sensor : cari contoh program, sesuaikan variabel dan pin-pinya, upload, jika ada yang error atau aneh, coba betulkan, jika tetap error, cari solusinya dari teman atau internet. Banyak sekali pemula yang belajar Arduino di Indonesia, jadi Anda tidak perlu takut untuk mulai belajar Arduino. Anda juga bisa gabung di grup Facebook MONSTER ARDUINO. Jika belum join, Anda boleh join di https://goo.gl/1PcSEq.

Tabel 1.1 Perbandingan Spesifikasi Beberapa Jenis Arduino

           

Pin

Jenis

Proc.

Speed

EEPROM

SRAM

Flash

           

A/D/PWM

101

Intel® Curie

32MHz

-

24kB

196kB

6/14/4

Gemma

Attiny85

8MHz

0.5kB

0.5kB

8kB

1/3/2

LilyPad

ATmega168V

8MHz

0.5kB

1kB

16kB

6/14/6

ATmega328P

Mega 2560

ATmega2560

16MHz

4kB

8kB

256kB

16/54/15

Mega ADK

ATmega2560

16MHz

4kB

8kB

256kB

16/54/15

Pro Mini

ATmega328P

8/16MHz

1kB

2kB

32kB

16/14/6

Uno

ATmega328P

16MHz

1kB

2kB

32kB

6/14/6

Zero

ATSAMD21G18

48MHz

-

32kB

256kB

6/14/10

Due

ATSAM3X8E

84MHz

-

96kB

512kB

12/54/12

Nano

ATmega168

16MHz

0.5kB

1kB

16kB

8/14/6

ATmega328P

1kB

2kB

32kB

Yun

ATmega32U4

16MHz

1

2.5kB

32kB

12/20/7

AR9331 Linux

400MHz

16MB

64MB

Tabel 1.1 menunjukkan spesifikasi beberapa jenis Arduino berdasarkan jenis processor atau IC mikrokontroller

64MB Tabel 1.1 menunjukkan spesifikasi beberapa jenis Arduino berdasarkan jenis processor atau IC mikrokontroller 5

5

yang dipakai, kecepatan, kapasitas EEPROM, SRAM, memory flash, serta jumlah pin Analog, Digital, dan PWM. Berdasarkan tabel tersebut, kita bisa memilih Arduino sesuai kebutuhan project kita.

1.1 Jenis Arduino untuk Pemula

Ini murni pendapat pribadi, berdasarkan pengalaman ketika mulai belajar Arduino. Awalnya, Anda bisa mulai dengan Arduino Uno atau Nano. Kenapa? Sebab harganya relatif terjangkau dan referensi yang berkaitan dengan kedua jenis Arduino ini lebih banyak daripada jenis lainnya.

Dulu, penulis belajar dengan Arduino Uno. Selanjutnya, ketika mengerjakan project, penulis biasanya menggunakan Arduino nano karena harganya lebih murah, setidaknya dua kali lebih murah daripada Arduino Uno. Ada sekitar 7 buah Arduino Nano yang siap digunakan untuk mengerjakan pesanan program dari customer. Kan nggak asik kalau mau nyoba program harus lepas-pasang arduino.

Kalaupun Anda ingin langsung mulai belajar dengan Arduino Nano, penulis sarankan sekalian beli mini project board sehingga lebih mudah kalau mau pasang kabel jumper. Untuk project yang jumlahnya banyak dan hanya butuh sedikit program, penulis lebih menyarankan untuk

6

kabel jumper. Untuk project yang jumlahnya banyak dan hanya butuh sedikit program, penulis lebih menyarankan untuk

menggunakan Arduino Nano. Kenapa tidak menggunakan Arduino Pro Mini?

Arduino Nano. Kenapa tidak menggunakan Arduino Pro Mini? Gambar 1.1 Arduino Nano dengan mini project board

Gambar 1.1 Arduino Nano dengan mini project board

Arduino Pro Mini tidak memiliki jack USB yang bisa langsung dipasang ke komputer. Jadi misal mau update program, lebih simpel jika pakai Arduino Nano. Hanya saja, jika power supply yang ingin Anda gunakan adalah 3.3v, Anda bisa memilih Arduino Pro Mini yang 3.3v.

1.2 Project yang Butuh Banyak Pin I/O

Jika pin I/O yang Anda butuhkan hanya sebagai OUTPUT, maka Anda bisa menambahkan shift register. Dengan IC shift register, Anda hanya membutuhkan 3 buah pin Arduino untuk dikonversi menjadi 8, 16, atau 24 pin output. Asik kan? Pembahasan tentang IC shift register ini juga kita bahas pada buku ini.

8, 16, atau 24 pin output. Asik kan? Pembahasan tentang IC shift register ini juga kita

7

Namun jika yang dibutuhkan adalah jumlah input yang banyak, Anda bisa menggunakan Arduino Mega, entah Mega 2560 atau Mega ADK. Terdapat 54 pin I/O yang bisa dipakai pada Arduino Mega.

Terdapat 54 pin I/O yang bisa dipakai pada Arduino Mega. Gambar 1.2 Arduino Mega 2560 dan

Gambar 1.2 Arduino Mega 2560 dan Mega ADK

1.3 Program dengan Clock Tinggi

Varian Arduino memiliki kecepatan dari 8Mhz 400Mhz. Arduino Uno, Nano, dan Mega beroperasi pada kecepatan 16Mhz. Arduino Pro Mini bisa pilih yang 8Mhz atau yang 16Mhz. Jika butuh kecepatan sekitar 32Mhz, Anda bisa gunakan Arduino 101. Jika butuh kecepatan 48Mhz, Anda bisa pilih Arduino Zero.

Selanjutnya ada Arduino Due dengan kecepatan 84Mhz, dan Arduino Yun dengan kecepatan 400Mhz. Silakan gunakan sesuai kebutuhan.

8

ada Arduino Due dengan kecepatan 84Mhz, dan Arduino Yun dengan kecepatan 400Mhz. Silakan gunakan sesuai kebutuhan.
Gambar 1.3 Arduino Due dan Yun 1.4 Project dengan Ukuran Program Besar bisa menggunakan Arduino

Gambar 1.3 Arduino Due dan Yun

1.4 Project dengan Ukuran Program Besar

bisa

menggunakan Arduino Uno, Nano, atau Pro Mini. Kalau butuh yang lebih besar, Anda bisa gunakan Arduino Mega,

Due, atau Yun.

Jika

program

yang

dibuat

<

32

kB,

Anda

Oiya, selain memori untuk menyimpan program. Arduino juga memiliki 2 buah memori lainnya yaitu EEPROM dan SRAM. Apa bedanya? Semoga penjelasan tentang memori ini bisa diterima dengan baik:

1. Memori Flash, memori

untuk menyimpan program.

Program yang yang kita buat, setelah dikompilasi akan disimpan dalam memori ini. Data yang disimpan pada

program. Program yang yang kita buat, setelah dikompilasi akan disimpan dalam memori ini. Data yang disimpan

9

memori flash tidak akan hilang, kecuali ditimpa dengan program yang lain.

2. EEPROM, memori untuk menyimpan data program. Data yang disimpan pada memori ini tidak akan hilang meski arduino dimatikan.

3. SRAM, memori yang digunakan untuk manipulasi data variabel-variabel yang kita gunakan dalam program. Data yang tersimpan pada memori ini akan hilang ketika Arduino direset atau dimatikan.

Kalau boleh diibaratkan, memori flash dan EEPROM mirip seperti hardisk pada komputer, dimana program dan data bisa disimpan di sana. Sedangkan SRAM mirip seperti RAM (DDR, DDR2, dst) sebab data akan hilang apabila komputer dimatikan.

Untuk Arduino Uno, memori flash berkapasitas 32kB, EEPROM 1kB, dan SRAM kapasitasnya 2kB. Apakah cukup? Cukup… tergantung kompleksitas program kita.

cukup? Cukup… tergantung kompleksitas program kita. Gambar 1.4 Informasi penggunaan memory saat program

Gambar 1.4 Informasi penggunaan memory saat program dicompile

Informasi tentang penggunaan memori flash dan SRAM bisa diketahui saat kita compile program. Pada Gambar 1.4, besar program hanya 1892 bytes, sekitar 5% dan total

10

SRAM bisa diketahui saat kita compile program. Pada Gambar 1.4, besar program hanya 1892 bytes, sekitar

kapasitas yang tersedia. Sedangkan data yang diolah selama program running (penggunaan variabel) menghabiskan 208 bytes, sekitar 10% dari kapasitas yang tersedia. Silakan pilih Arduino sesuai kebutuhan ukuran program Anda.

1.5 Saatnya Memilih!

Anda jadi memilih yang mana? Apapun pilihan Anda, silakan gabung di grup facebook MONSTER ARDUINO. Sebagai pengingat, harapan dibuatnya group tersebut adalah untuk belajar lebih dalam tentang materi yang ada di buku ini.

Target kita tidak hanya jadi Master Arduino, tapi, jadilah MONSTER ARDUINO!

Monster yang siap mengubah Indonesia lebih baik dengan adanya teknologi, penggagas ide-ide kreatif yang dimulai dan dirancang dengan Arduino. Orang-orang Indonesia itu kreatif, jika kita arahkan untuk merancang dengan serius, kita bisa mendahului negara-negara maju lainnya. Hehehe… Mimpi bangng…?! IYA!!!

Kalau

kenyataan!

kita

mimpinya

maju lainnya. Hehehe… Mi mpi bangn g… ?! IYA!!! Kalau kenyataan!  kita mimpinya rame-rame, 11

rame-rame,

11

semoga

bisa

jadi

Bagian #02

ARDUINO DAN BOOTLOADER

Untuk Indonesia, jadilah Legenda! (Superman Is Dead)

2.1 Sekilas tentang Bootloader

Beberapa pertanyaan tentang bootloader di bawah ini sering muncul tidak hanya dari programmer pemula seperti penulis, bahkan kadang programmer veteran pun pernah mempertanyakannya. Mungkin dalam pikiran Anda juga pernah tersirat salah satu atau beberapa pertanyaan di bawah ini:

1. Apa sih fungsi bootloader pada arduino?

2. Bisa nggak, misal bikin arduino tanpa bootloader?

3. Kalau nggak pakai bootloader, Arduino tetep bisa jalan nggak?

4. Apa kita bisa bikin bootloader sendiri untuk arduino?

Anda bisa menjawab sendiri pertanyaan di atas setelah memahami cara kerja arduino berdasarkan ilustrasi berikut.

12

Anda bisa menjawab sendiri pertanyaan di atas setelah memahami cara kerja arduino berdasarkan ilustrasi berikut. 12

Jika kita mau memprogram IC mikrokontroller, sebut saja keluarga AT89Sxx, ATMega, atau PIC, maka kita butuh alat tambahan (hardware) yang biasa dikenal dengan istilah programmer atau downloader. Contoh downloader untuk AVR dan PIC seperti gambar di bawah ini.

downloader untuk AVR dan PIC seperti gambar di bawah ini. Gambar 2.1 USBAsp untuk AVR dan

Gambar 2.1 USBAsp untuk AVR dan PIC Programmer

Jika Anda menggunakan Arduino, Anda sudah tidak memerlukan downloader lagi. Anda bisa langsung memasang program pada IC melalui software Arduino IDE di komputer. Fungsi downloader sudah ditangani oleh bootloader dalam IC. Program yang dikirim komputer ke Arduino akan “ditangkap” dan disimpankan oleh bootloader dalam memori program yang masih kosong.

Program mikrokontroller akan disimpan dalam memori flash atau flash memory. Setiap mikrokontroller dijalankan, biasanya alamat program yang pertama dieksekusi adalah alamat 0x0000 di flash memory.

mikrokontroller dijalankan, biasanya alamat program yang pertama dieksekusi adalah alamat 0x0000 di flash memory. 13

13

Program bootloader biasanya dipasang pada alamat memori 0x0000 sehingga program tersebut menjadi program yang pertama kali dieksekusi. Anda bisa memperhatikan perbedaan antara proses memprogram mikrokontroller biasa dengan mikrokontroller yang telah dipasangi bootloader Arduino pada Gambar di bawah ini.

telah dipasangi bootloader Arduino pada Gambar di bawah ini. Gambar 2.2 Perbedaan cara kerja mikrokontroller

Gambar 2.2 Perbedaan cara kerja mikrokontroller konvensional dan cara kerja Arduino

Pada mikrokontroller biasa, yang bertugas menyimpan program adalah programmer yang berupa hardware. Sedangkan pada Arduino, proses penyimpanan program ke memori flash dikerjakan oleh bootloader. Lebih detailnya, bootloader memiliki cara kerja seperti berikut:

1.

dieksekusi saat Arduino

dinyalakan. Oleh sebab itu, proses penyimpanan

program oleh bootloader hanya bisa dilakukan sesaat setelah Arduino direset.

Bootloader

hanya

14

itu, proses penyimpanan program oleh bootloader hanya bisa dilakukan sesaat setelah Arduino direset. Bootloader hanya 14

2. Saat awal start, jika Arduino menerima kiriman

program dari komputer. Maka tugas bootloader adalah menyimpan kiriman program tersebut pada memory flash yang tidak dipakai bootloader, misal alamat memory 0x00AB.

3. Jika tidak ada kiriman program dari komputer, maka eksekusi program akan langsung lompat ke alamat

0x00AB untuk menjalankan program utama.

* * *

Selain berfungsi untuk mengatur program yang akan diinstal dalam IC, bootloader juga berperan sebagai pengatur konfigurasi awal arduino seperti clock yang akan digunakan, mode komunikasi dengan serial komputer, timer, dan konfigurasi lainnya. Meskipun demikian, konfigurasi-konfgurasi tersebut tetap bisa kita ubah melalui program yang kita upload.

Misal kita punya board arduino, tapi IC yang dipasang tidak ada bootloadernya. Kita tidak bisa langsung memprogramnya dengan Arduino IDE, sebab perantara (bootloader) yang bisa menyimpankan program tidak ada.

Kita juga bisa membuat bootloader Arduino versi kita. Sebagai informasi tambahan, bootloader arduino yang terbaru berukuran setengah kB dan dikenal juga dengan istilah optiboot. Anda bisa lihat beberapa versinya di folder

15

terbaru berukuran setengah kB dan dikenal juga dengan istilah optiboot . Anda bisa lihat beberapa versinya

instalasi arduino, yaitu pada /hardware/avr/bootloaders atau bisa cek di https://goo.gl/sjrHYo.

Sebelum Anda lanjut praktek pada bab-bab selanjutnya, Anda boleh simak pesan-pesan ini. Mari belajar dengan lebih serius, sebab negeri kita butuh banyak programmer dan inovator teknologi. Ada banyak pedangan, petani, nelayan, peternak, dan UKM yang butuh sentuhan teknologi agar menghasilkan produk yang lebih berkualitas, lebih cepat, lebih murah, dan lebih banyak, demi kesejahteraan negeri. Semoga pesan ini bisa diterima dan diingat-ingat.

Sekali lagi, kita butuh para Monster untuk menggoyang negeri ini dengan inovasi teknologi.

2.2 Cara Install Bootloader Arduino

Setidaknya ada dua cara untuk menginstall bootloader Arduino, atau istilah lainnya burning bootloader. Yang pertama, kita bisa menggunakan downloader AVR, di buku ini kita akan menggunakan USBAsp. Sedangkan cara yang kedua yaitu menggunakan board Arduino yang sudah ada.

Menggunakan AVR downloader atau Arduino, inti rangkaian keduanya sama, yaitu menggunakan pin SCK, MOSI, MISO, dan RST. Detail rangkaian dapat dilihat pada masing-masing sub pembahasan berikutnya.

16

menggunakan pin SCK, MOSI, MISO, dan RST. Detail rangkaian dapat dilihat pada masing-masing sub pembahasan berikutnya.

2.2.1 Install Bootloader dengan USBAsp

Dalam hal ini, kita menganggap Anda sudah bisa install driver USBAsp. Proses instalasi bootloader akan dilakukan dengan mode grafis menggunakan aplikasi PROGISP dan command line dengan avrdude. Jika Anda belum familiar dengan kedua program tersebut, Anda boleh googling dan mempelajari secukupnya.

2.2.1.1 Rangkaian IC ATMega8 /168/328

Siapkan peralatan dan rangkaian seperti di bawah ini:

1. AVR Programmer x 1

2. IC ATMega8/168/328 x 1

3. Project board x 1

4. XTAL 16MHz x 1

5. Kapasitor 22pf x 2

6. Resistor (ukurannya 220, 330, 1k, 4k7, atau 10k) x 1

7. Kabel jumper secukupnya

Sambungan pin antara Programmer dan ATMega:

AVR Programmer

IC ATMega8/168/328

Pin MOSI

Pin 17 (MOSI)

Pin MISO

Pin 18 (MISO)

Pin SCK/CLOCK

Pin 19 (SCK/CLOCK)

Pin SS / RST

Pin 1 (RST)

VCC

VCC

GND

GND

Pin 18 (MISO) Pin SCK/CLOCK Pin 19 (SCK/CLOCK) Pin SS / RST Pin 1 (RST) VCC

17

Gambar 2.3 Rangkaian untuk install bootloader IC ATMega8/168/328 2.2.1.2 Rangkaian untuk Board Arduino Instalasi

Gambar 2.3 Rangkaian untuk install bootloader IC ATMega8/168/328

2.2.1.2 Rangkaian untuk Board Arduino

Instalasi bootloader Arduino seperti ini biasanya ketika IC rusak, atau program dalam IC mengalami bootloop. Bootloop adalah istilah dimana arduino restart terus- menerus karena kesalahan program, seperti akibat karena kesalahan konfigurasi register. Yang perlu disiapkan adalah:

1. Board Arduino x 1

2. Downloader USBAsp x 1

3. Kabel secukupnya x 1

Sambungan pin antara Programmer dan Arduino:

AVR Programmer

Arduino Uno/Nano

MOSI

Pin 11 (MOSI)

MISO

Pin 12 (MISO)

SCK/CLOCK

Pin 13 (SCK/CLOCK)

SS / RST

Pin RESET (RST)

VCC

VCC

GND

GND

18

MISO Pin 12 (MISO) SCK/CLOCK Pin 13 (SCK/CLOCK) SS / RST Pin RESET (RST) VCC VCC
Gambar 2.4 Rangkaian untuk install bootloader langsung ke board Arduino 2.2.1.3 Install Bootloader dengan Progisp

Gambar 2.4 Rangkaian untuk install bootloader langsung ke board Arduino

2.2.1.3 Install Bootloader dengan Progisp

Yang paling penting saat menginstall dengan Progisp adalah konfigurasi fuse bit. Informasi fuse bit bisa didapatkan dari file boards.txt dalam folder instalasi Arduino IDE, yaitu dalam sub folder /hardware/arduino/avr :

Fuse

Data

Low

0xFF

High

0xDA

Extended

0xFD

yaitu dalam sub folder /hardware/arduino/avr : Fuse Data Low 0xFF High 0xDA Extended 0xFD 19

19

Gambar 2.5 Penyesuaian fuse bit pada Progisp Gambar 2.6 Isi folder /hardware/arduino/avr/bootloder/atmega Setelah

Gambar 2.5 Penyesuaian fuse bit pada Progisp

Gambar 2.5 Penyesuaian fuse bit pada Progisp Gambar 2.6 Isi folder /hardware/arduino/avr/bootloder/atmega Setelah

Gambar 2.6 Isi folder /hardware/arduino/avr/bootloder/atmega

Setelah mengatur fuse bit, klik tombol Load Flash untuk memilih file .hex bootloader di folder program Arduino IDE, pada subfolder /hardware/arduino/avr/bootloder/atmega. Pilih file ATmegaBOOT_168_atmega328.hex. File tersebut adalah bootloader untuk Arduino Uno, Nano, dan Pro Mini yang 16MHz.

20

file ATmegaBOOT_168_atmega328.hex . File tersebut adalah bootloader untuk Arduino Uno, Nano, dan Pro Mini yang 16MHz.
Gambar 2.7 Load file .hex bootloader Gambar 2.8 Proses instalasi bootloader Arduino 21

Gambar 2.7 Load file .hex bootloader

Gambar 2.7 Load file .hex bootloader Gambar 2.8 Proses instalasi bootloader Arduino 21

Gambar 2.8 Proses instalasi bootloader Arduino

Gambar 2.7 Load file .hex bootloader Gambar 2.8 Proses instalasi bootloader Arduino 21

21

Selanjutnya, install bootloader dengan menekan tombol Auto. Tunggu hingga proses instalasi selesai. Untuk mengecek hasil instalasi, silakan lihat sub bab berikutnya.

2.2.1.4 Install Bootloader dengan AVRDUDE

Untuk menginstall dengan avrdude, Anda bisa pakai avrdude yang sudah ada di master Arduino IDE, atau Anda bisa download dari https://goo.gl/Np9MBH. Pastikan Anda download versi yang terbaru. Setelah berhasil download, silakan ekstrak di folder yang mudah dijangkau dengan aplikasi command prompt supaya Anda masuk ke foldernya tidak capek ngetik, hehe.

Setelah diekstrak, copy file bootloader dari folder /hardware/arduino/avr/bootloder/atmega. Untuk Arduino Uno, Nano, Pro Mini 16MHz kita bisa menggunakan file ATmegaBOOT_168_atmega328.hex. Copy file tersebut, kemudian paste di folder hasil ekstrakan dari avrdude tadi.

kemudian paste di folder hasil ekstrakan dari avrdude tadi. Gambar 2.9 Contoh isi folder avdude dan

Gambar 2.9 Contoh isi folder avdude dan bootloader Arduino

Selanjutnya, buka command prompt dan ketik perintah berikut untuk melakukan instalasi bootloader.

22

bootloader Arduino Selanjutnya, buka command prompt dan ketik perintah berikut untuk melakukan instalasi bootloader. 22

avrdude -b19200 -c usbasp -p m328p -v -e -U flash:w:ATmegaBOOT_168_atmega328.hex -U lock:w:0x0F:m

-e -U flash:w:ATmegaBOOT_168_atmega328.hex -U lock:w:0x0F:m Gambar 2.10 Isi folder avrdude dan perintah untuk

Gambar 2.10 Isi folder avrdude dan perintah untuk menginstall bootloader

Isi folder avrdude dan perintah untuk menginstall bootloader Gambar 2.11 Proses instalasi bootloader selesai Setelah

Gambar 2.11 Proses instalasi bootloader selesai

Setelah

proses

instalasi

selesai,

cek

hasil

instalasi

dengan cara yang dijelaskan pada subbab selanjutnya.

selesai Setelah proses instalasi selesai, cek hasil instalasi dengan cara yang dijelaskan pada subbab selanjutnya. 23

23

2.2.2 Arduino Sebagai ISP Programmer

Selain menggunakan hardware programmer seperti USBAsp, kita juga bisa menjadikan Arduino sebagai programmer. Cara yang bisa digunakan untuk mengubah Arduino menjadi programmer adalah dengan menginstall program ArduinoISP.

programmer adalah dengan menginstall program ArduinoISP . Gambar 2.12 File program ArduinoISP Program ArduinoISP

Gambar 2.12 File program ArduinoISP

Program ArduinoISP sudah ada di sampel program dalam aplikasi Arduino IDE. Pilih menu File > Examples > ArduinoISP. Setelah source codenya terbuka, upload dan tunggu hingga selesai. Setelah ArduinoISP berhasil diinstall, Arduino Anda sudah berubah menjadi programmer.

24

upload dan tunggu hingga selesai. Setelah ArduinoISP berhasil diinstall, Arduino Anda sudah berubah menjadi programmer. 24

untuk

menginstall bootloader atau mengupload program ke Arduino lainnya langsung dari aplikasi Arduino IDE.

Selanjutnya,

Arduino

Anda

bisa

digunakan

Arduino IDE. Selanjutnya, Arduino Anda bisa digunakan Gambar 2.13 Upload Sketch dengan Arduino sebagai ISP

Gambar 2.13 Upload Sketch dengan Arduino sebagai ISP Programmer

Penting!!! Jika Anda mengupload Sketch ke IC yang terinstall bootloader dengan “Upload Using Programmer, maka bootloadernya akan ditimpa oleh Sketch tadi!

Jika Anda ingin menupload Sketch dengan arduino sebagai programmer, maka settinglah programmer sebagai Arduino as ISP”, siapkan sketch yang akan diupload, kemudian pilih menu Sketch > Upload using Programmer.

25

“ Arduino as ISP ”, siapkan sketch yang akan diupload, kemudian pilih menu Sketch > Upload

2.2.3 Install Bootloader dengan Arduino

2.2.3.1 Rangkaian untuk IC ATMega8 /168/328

Siapkan part dan peralatan di bawah ini:

1. Arduino Uno / Nano x 1

2. IC ATMega8/168/328 x 1

3. Project board x 1

4. XTAL 16MHz x 1

5. Kapasitor 22pf x 2

6. Resistor x 1 (ukurannya 220, 330, 1k, 4k7, atau 10k)

7. Kabel jumper secukupnya

Sambungan pin antara Arduino dan ATMega :

Arduino Uno/Nano

IC ATMega8/168/328

Pin 11 (MOSI)

Pin 17 (MOSI)

Pin 12 (MISO)

Pin 18 (MISO)

Pin 13 (SCK/CLOCK)

Pin 19 (SCK/CLOCK)

Pin RESET (RST)

Pin 1 (RST)

VCC

VCC

GND

GND

26

18 (MISO) Pin 13 (SCK/CLOCK) Pin 19 (SCK/CLOCK) Pin RESET (RST) Pin 1 (RST) VCC VCC
Gambar 2.14 Rangkaian untuk install bootloader dengan Arduino 2.2.3.2 Rangkaian untuk Board Arduino Ada banyak

Gambar 2.14 Rangkaian untuk install bootloader dengan Arduino

2.2.3.2 Rangkaian untuk Board Arduino

Ada banyak kombinasi yang bisa dilakukan, misalnya ingin menginstall bootloader Arduino Uno dengan Uno, Nano dengan Uno, Uno dengan Nano, Nano dengan Nano, bahkan Mega dengan Nano. Namun inti dari semua rangkaian ini adalah pin CLK/SCK dihubungkan ke CLK/SCK, MOSI ke MOSI, MISO ke MISO, dan pin 10 ke RESET.

Sambungan pin antar Arduino :

Arduino Programmer

Arduino Target

Pin 11 (MOSI)

Pin 11 (MOSI)

Pin 12 (MISO)

Pin 12 (MISO)

Pin 13 (SCK/CLOCK)

Pin 13 (SCK/CLOCK)

Pin 10

Pin RESET (RST)

VCC

VCC

12 (MISO) Pin 12 (MISO) Pin 13 (SCK/CLOCK) Pin 13 (SCK/CLOCK) Pin 10 Pin RESET (RST)

27

GND

GND

GND GND Gambar 2.15 Rangkaian install board arduino dengan arduino lainnya 2.2.3.3 Instalasi Bootloader dengan

Gambar 2.15 Rangkaian install board arduino dengan arduino lainnya

2.2.3.3 Instalasi Bootloader dengan Arduino

Proses instalasi bootloader dengan Arduino dilakukan dengan tahapan berikut melalui menu Tools:

1. Pastikan pilihan jenis board Arduino disesuaikan dengan Arduino Target. Jika targetnya Uno, pilih Uno. Jika Targetnya Nano, pilih Nano.

2. Pilih koneksi Port yang sesuai dengan port Arduino sebagai Programmer. Ingat, port harus disesuaikan dengan Port Arduino sebagai Programmer.

3. Ganti settingan Arduino menjadi “Arduino as ISP”.

4. Pilih “Burn Bootloader”, lalu tunggu hingga proses burning atau instalasi bootloader selesai.

28

as ISP ”. 4. Pilih “ Burn Bootloader ”, lalu tungg u hingga proses burning atau

5.

Jika muncul error, Anda bisa langsung googling atau tanya di grup Facebook MONSTER ARDUINO.

googling atau tanya di grup Facebook MONSTER ARDUINO. Gambar 2.16 Proses konfigurasi dan instalasi bootloader

Gambar 2.16 Proses konfigurasi dan instalasi bootloader

2.2.4 Pengecekan Hasil Instalasi Bootloader

Instalasi berhasil ketika LED di pin 13 Arduino berkedip pelan. Cobalah upload program dari Arduino IDE, jika berhasil, berarti Anda telah sukses menginstall.

Arduino berkedip pelan. Cobalah upload program dari Arduino IDE, jika berhasil, berarti Anda telah sukses menginstall.

29

Bagian #03

HELLO BUZZER

Tanpa cinta, kecerdasan itu berbahaya, dan tanpa kecerdasan, cinta itu berbahaya. (B.J Habibie)

Kalau dalam bahasa pemgoraman, program pertama yang dibuat adalah untuk menampilkan “Hello World!”. Untuk mikrokontroller umumnya adalah lampu flip-flop. Tapi kita bisa memulainya dengan cara yang berbeda, kita pakai Buzzer!

Komponen utama dari program Hello Buzzer adalah Arduino dan buzzer, aktif buzzer. Apakah kita akan membahas teori tentang buzzer dahulu? Tidak, kita praktek dulu. :D

3.1 Project Hello Buzzer

3.1.1 Rangkaian Hello Buzzer

Silakan buat rangkaian seperti berikut. Alat, bahannya dan skemanya sebagai berikut:

30

3.1.1 Rangkaian Hello Buzzer Silakan buat rangkaian seperti berikut. Alat, bahannya dan skemanya sebagai berikut: 30

1.

Arduino Uno x 1

2. Kabel Jumper Male to Female x 2

3. Buzzer Aktif x 1

Sambungan pin antara Arduino dan Buzzer :

Arduino

Buzzer

Pin 2

GND

VCC

VCC

Buzzer : Arduino Buzzer Pin 2 GND VCC VCC Gambar 3.1 Rangkaian Project Hello Buzzer 3.1.2

Gambar 3.1 Rangkaian Project Hello Buzzer

3.1.2 Program Hello Buzzer

Program 3.1 Program Hello Buzzer

1

/*

2

*

MONSTER ARDUINO V2

3

*

Program Hello Buzzer

4

*

5

*/

6

7

// buzzer disetting active low

8

// BUZZER_OFF kebalikan dari BUZZER_ON

9

#define BUZZER_ON LOW

10

#define BUZZER_OFF !BUZZER_ON

8 // BUZZER_OFF kebalikan dari BUZZER_ON 9 # define BUZZER_ON LOW 10 # define BUZZER_OFF !BUZZER_ON

31

11

 

12

// GND buzzer dihubungkan ke pin 2

13

const byte PIN_BUZZER = 2;

14

15

void setup() {

16

17

// pin buzzer sebagai output

18

pinMode(PIN_BUZZER, OUTPUT);

19

20

}

21

22

void loop() {

23

24

// Tit pertama

25

digitalWrite(PIN_BUZZER, BUZZER_ON);

26

delay(200);

27

// mati sebentar

28

digitalWrite(PIN_BUZZER, BUZZER_OFF);

29

delay(100);

30

31

// Tit kedua

32

digitalWrite(PIN_BUZZER, BUZZER_ON);

33

delay(200);

34

// mati agak lama

35

digitalWrite(PIN_BUZZER, BUZZER_OFF);

36

delay(1000);

37

38

}

Berdasarkan rangkaian pada Gambar 3.1, buzzer disetting supaya aktif ketika pin 2 berlogika LOW. Sebab, kaki positif buzzer langsung dihubungkan pada VCC +5v. Rangkaian ini sengaja penulis balik supaya tidak sama dengan referensi pada umumnya. Supaya Anda bingung. =))

Jika Anda tidak bingung, Selamat… berarti pemahaman Anda tentang elektronika sudah baik. Tapi jika Anda merasa bingung, mari dicerna pelan-pelan.

32

berarti pemahaman Anda tentang elektronika sudah baik. Tapi jika Anda merasa bingung, mari dicerna pelan-pelan. 

3.2 Buzzer Aktif dan Buzzer Pasif

Buzzer yang kita gunakan pada adalah buzzer aktif. Apa bedanya dengan buzzer pasif? Buzzer aktif adalah buzzer yang langsung bunyi ketika kita aliri arus listrik. Sedangkan buzzer pasif adalah buzzer yang akan berbunyi ketika kita tentukan frekuensi bunyinya.

Maksudnya begini, jika buzzer pasif hanya dialiri arus listrik atau dihubungkan ke sumber tegangan, ia tidak akan bunyi. Buzzer pasif akan berbunyi ketika kita berikan nada atau frekuensi tertentu. Buzzer pasif sama dengan speaker yang biasanya kita pakai untuk membunyikan musik. Dulu, di Ebook Versi 1 telah kita bahas, yaitu tentang Tone.

di Ebook Versi 1 telah kita bahas, yaitu tentang Tone . Gambar 3.2 Buzzer aktif dan
di Ebook Versi 1 telah kita bahas, yaitu tentang Tone . Gambar 3.2 Buzzer aktif dan

Gambar 3.2 Buzzer aktif dan pasif tampak dari atas (kiri) dan dari bawah (kanan)

Buzzer aktif dan pasif bentuknya agak mirip, tapi kita bisa membedakannya dengan bagian bawahnya. Pada buzzer aktif, bagian biasanya terpasang label putih dan bagian bawahnya tertutup full. Pada buzzer pasif, bagian atasnya biasanya tanpa label, sedangkan bagian bawah

33

putih dan bagian bawahnya tertutup full. Pada buzzer pasif, bagian atasnya biasanya tanpa label, sedangkan bagian

masih ada bagian yang terbuka sehingga papan PCB nya terlihat. Sebenarnya cara membedakan ini bisa saja tidak valid, hanya saja dari semua buzzer yang ada, ciri-cirinya biasanya seperti itu.

3.3 Project Dummy Logger

Kali ini kita akan membuat program yang akan mengirim data setiap 3 detik. Setiap mengirim data, buzzer akan berbunyi tilit. Bisakah Anda pura-pura mendengar dan membayangkannya?

Jika kita perhatikan, program Hello Buzzer dipenuhi dengan fungsi delay(). Padahal, fungsi delay harus kita hindari selagi bisa. Sebab, jika kita terlalu banyak menggunakan delay(), programnya jadi aneh.

Program 3.2 Program Dummy Logger

1

/*

2

*

MONSTER ARDUINO V2

3

*

Program Dummy Logger

4

*

5

*/

6

7

// buzzer disetting active low

8

// BUZZER_OFF kebalikan dari BUZZER_ON

9

#define BUZZER_ON LOW

10

#define BUZZER_OFF !BUZZER_ON

11

12

// GND buzzer dihubungkan ke pin 2

13

const byte PIN_BUZZER = 2;

14

15

// variabel untuk cek waktu kirim

34

buzzer dihubungkan ke pin 2 13 const byte PIN_BUZZER = 2; 14 15 // variabel untuk

16

unsigned long waktu_kirim = 0;

17

18

void setup() {

19

20

// aktifkan komunikasi serial

21

// pada baudrate 19200

22

Serial.begin(19200);

23

24

// tunggu hinga Serial siap digunakan

25

while(!Serial);

26

27

// pin buzzer sebagai output

28

pinMode(PIN_BUZZER, OUTPUT);

29

30

// pastikan buzzer maat saat pertama kali start

31

digitalWrite(PIN_BUZZER, BUZZER_OFF);

32

33

// catat waktu kirim pertama kali

34

waktu_kirim = millis();

35

36

}

37

38

void loop() {

39

40

// kirim data

41

KirimData();

42

43

// bunyi tilit tilit

44

TilitTilit();

45

46

}

47

48

void TilitTilit(){

49

// Tit pertama

50

digitalWrite(PIN_BUZZER, BUZZER_ON);

51

delay(200);

52

// mati sebentar

53

digitalWrite(PIN_BUZZER, BUZZER_OFF);

54

delay(100);

55

56

// Tit kedua

57

digitalWrite(PIN_BUZZER, BUZZER_ON);

58

delay(200);

54 delay (100); 55 56 // Tit kedua 57 digitalWrite (PIN_BUZZER, BUZZER_ON); 58 delay (200); 35

35

59

// mati agak lama

60

digitalWrite(PIN_BUZZER, BUZZER_OFF);

61

delay(1000);

62

63

// tambahan delay supaya pas 3 detik :v

64

delay(1500);

65

}

66

67

// fungsi untuk mengirim data

68

void KirimData(){

69

70

// cetak selisih waktu kirim sebelumnya

71

// dengan pengiriman saat ini

72

Serial.print("Selisih Waktu : ");

73

Serial.println( millis() - waktu_kirim );

74

75

// catat waktu kirim data

76

waktu_kirim = millis();

77

}

kirim data 76 waktu_kirim = millis (); 77 } Gambar 3.3 Hasil eksekusi program kirim data

Gambar 3.3 Hasil eksekusi program kirim data setiap 3 detik

Program Hello Buzzer bisa dimodifikasi seperti program di atas. Supaya bisa genap 3 detik, maka harus ditambah

36

3 detik Program Hello Buzzer bisa dimodifikasi seperti program di atas. Supaya bisa genap 3 detik,

delay sekitar 1.5 detik (lihat baris 64). Namun, tidak sesederhana itu! Program akan bermasalah ketika ada penambahan source code baru.

Program di atas tidaklah relevan, akan sangat bermasalah apabila logika program di atas digunakan untuk data logger. Teknik untuk menyelesaikan project ini kita bahas pada bab selanjutnya, yaitu tentang optimalisasi fungsi delay yang umumnya dikenal dengan istilah non- blocking delay.

bab selanjutnya, yaitu tentang optimalisasi fungsi delay yang umumnya dikenal dengan istilah non- blocking delay .

37

Bagian #04

TIPS MEMILIH TIPE DATA

Anda tidak bisa mengajari sesuatu kepada seseorang; Anda hanya dapat membantu orang itu menemukan sesuatu dalam dirinya. (Galileo Galilei)

Jika Anda hanya ingin membuat program sederhana dan merasa sudah paham cara memilih tipe data yang cocok, Anda boleh lompati bab ini. Pada bab ini, kita akan berbagi pengalaman bagaimana cara menggunakan tipe data dalam memprogram Arduino.

Kenapa memilih tipe data yang cocok menjadi suatu keharusan?

Arduino tidak sama dengan komputer biasa yang memiliki kapasitas memori dan media penyimpanan yang besar. Contoh, pada Arduino Uno, kita hanya diberi ruang memori sebanyak 1kB untuk menyimpan data, 2kB sebagai RAM, 32 kB untuk menyimpan program.

Jika Anda membuat data array dengan tipe data long, maka kapasitas SRAM habis hanya dengan 512 data. Belum

38

program. Jika Anda membuat data array dengan tipe data long, maka kapasitas SRAM habis hanya dengan

lagi jika Anda banyak menggunakan teks atau String. Bagaimana jika Anda butuh ratusan atau ribuan data dummy untuk uji coba? Atau bagaimana jika kita perlu mencetak banyak teks data di serial monitor untuk keperluan debugging?

Hal ini berbeda ketika kita membuat aplikasi web, android, atau aplikasi untuk komputer desktop. Dengan demikian, kita ditantang untuk bijak dalam memilih tipe data.

Mari kita bahas satu-persatu, semoga Anda bisa bersabar mempelajari hal-hal remeh semacam ini. Ya, hal remeh tapi sangat penting untuk pengembangan keilmuan kita, agar tidak membuat program asal jadi. Mari kita bongkar secara blak-blakan apa yang penulis pahami tentang tipe data dan apa saja tips-tipsnya.

4.1 Byte dan Boolean, 1 Byte

Banyak

contoh

di

internet,

termasuk

di

website

arduino.cc yang membuat variabel untuk pin seperti ini:

int LedPin = 2; int SwitchPin = A0;

Penulis kurang setuju dengan penggunaan tipe data seperti itu. Kenapa? Karena mengunakan tipe integer untuk

39

= A0; Penulis kurang setuju dengan penggunaan tipe data seperti itu. Kenapa? Karena mengunakan tipe integer

diisi dengan pin Arduino itu kurang hemat. Jumlah kaki Arduino ada berapa? Tidak lebih dari 200. Sedangkan kapasistas untuk tipe data integer berapa? Kapasitas tipe integer adalah 65535 (jika mengabaikan tanda negatif).

Sebenarnya, jika hanya untuk pin Arduino, penggunaan tipe data byte atau unsigned char sudah cukup. Lebih menghemat memori karena byte kapasitasnya 1 byte. Sedangkan integer adalah 2 byte. Jika kita memprogram Arduino Mega dengan tipe data integer untuk 50 pin, berarti kita menghabis 100 byte hanya untuk nama pinnya saja, dan itu sudah 5% dari total SRAM-nya Uno. Belum variabel yang lain.

Penulis lebih senang menggunakan:

const byte LedPin = 2;

Kenapa pakai const (konstanta) dan byte? Sebab LedPin tidak pernah diubah-ubah dan jumlah pin Arduino PASTI positif. Kita tidak butuh tipe data negatif. Apalagi tipe data byte sudah cukup untuk menampung 256 pin Arduino karena kapasitas untuk data byte adalah 0 255. Tipe data boolean, true, false, high, dan low sama-sama berkapasitas 1 byte. Jadi tidak ada masalah dengan tipe data ini.

40

boolean, true, false, high, dan low sama-sama berkapasitas 1 byte. Jadi tidak ada masalah dengan tipe

4.2

Char atau Unsigned Char, 1 Byte

Jika butuh data negatif tapi dibawah angka ratusan, bisa pakai char. Char adalah tipe data 1 byte yang bisa digunakan untuk mengolah angka dari -128 sampai 127. Selain itu, char juga bisa dipakai untuk sebuah karakter dalam ASCII. Sedangkan unsigned char sama dengan tipe data byte, angka yang bisa dimuat adalah 0 255. Tipe ini tidak terlalu banyak masalah bagi penulis.

4.3 Integer dan Unsigned Integer, 2 Byte

Penulis hanya menggunakan tipe data ini jika angka yang akan diolah > 255 dan < 65535, jika datanya hanya positif. Jika data negatif, maka acuan untuk menggunakan data ini adalah > 127 dan < 32767, begitu juga untuk data negatifnya.

Dulu pernah menemukan contoh program yang menggunakan tipe data int (bukan unsigned int) untuk menampung data millis(). Hasilnya ya tidak sesuai. Sebab, millis() pakai tipe data unsigned long yang kapasitasnya 4 byte yang mampu menampung data hingga 4000-an JUTA angka! Sementara integer maksimal 32 ribuan saja.

kapasitasnya 4 byte yang mampu menampung data hingga 4000-an JUTA angka! Sementara integer maksimal 32 ribuan

41

4.4

Long dan Unsigned Long, 4 Byte

Sejujurnya, penulis lebih sering menggunakan unsigned long daripada long. Sebab, unsigned long sering penulis gunakan untuk menampun informasi waktu, entah itu dari millis() atau micros(). Kapasitas tipe data ini 4 byte. Artinya, jika tidak memperhatikan tanda negatif, jumlah angka yang dapat ditampung dengan tipe data ini adalah 4.294.967.295, empat ribu juta lebih.

4.5 Float atau Double, 4 Byte

Penulis menggunakan tipe data ini hanya untuk data yang berkoma. Lebarnya sama-sama 4 byte. Yang membedakan keduanya adalah kepresisiannya. Ada referensi yang menyebutkan bahwa jika ingin presisi, gunakan double. Tapi sayang, penulis tidak terlalu memperhatikan kedua tipe data ini.

4.6 Volatile & Interrupt

Sudah pernah pakai volatile? Jika belum, kemungkinan besar Anda belum pernah menggunakan interrupt.

Volatile sebenarnya bukan tipe data. Volatile hanyalah kata kunci atau keyword, atau mungkin bisa penulis terjemahkan sebagai perintah pada compiler agar data dari

42

hanyalah kata kunci atau keyword, atau mungkin bisa penulis terjemahkan sebagai perintah pada compiler agar data

variabel yang kita buat tetap disimpan di RAM, bukan di register. Untuk apa?

Interrupt adalah perintah dadakan yang harus segera dikerjakan. Contohnya begini, ketika Anda makan, pasti Anda menyediakan air di dekat Anda. Atau minimal, Anda sudah memastikan bahwa nanti ada air yang bisa diminum. Selama Anda menikmati makan, lalu tiba-tiba keselek! Nah, itu! Itu contoh interrupt! =))

Peristiwa keselek ini adalah peristiwa yang memaksa Anda untuk segera mencari air untuk minum. Apa yang akan terjadi jika di dekat Anda tidak ada air???

Boleh Anda bayangkan dan rasakan… :D

* * *

Berikut penjelasan peristiwa makan, keselek, dan minum yang jika dihubungkan konsep interrupt dan volatile dalam mikrokontroller:

1. Proses makan adalah program utama.

2. Keselek adalah pemicu interrupt (bisa dari external interrupt atau dari timer interrupt).

3. Kondisi harus minum adalah interrupt yang harus dikerjakan.

4. Air adalah data yang harus segera diproses. Jika airnya masih di dalam sumur, bisa-bisa Anda mati

harus dikerjakan. 4. Air adalah data yang harus segera diproses. Jika airnya masih di dalam sumur,

43

sebelum minum. Begitu juga dengan data, jika datanya disimpan di register, terlalu lama untuk memprosesnya, bisa jadi datanya tidak dapat diolah dengan baik.

Maka, data tersebut harus disimpan di RAM. Agar data disimpan di RAM, maka kita harus menandainya dengan keyword volatile. Contoh,

volatile double sensor_data = 0;

Variabel sensor_data bertipe double dengan keyword volatile menyebabkan 4 byte data untuk sensor_data disimpan di RAM, bukan memori register.

Semoga Anda bisa memahami. Bisa Anda perhatikan pada contoh-contoh program selanjutnya, mungkin Anda akan bertemu dengan keyword volatile ini, khususnya yang memabahasa tentang interrupt.

4.7 PROGMEM

Sebelumnya sudah penulis singgung tentang data dummy sensor, yaitu data buatan yang seolah-olah keluaran dari sebuah sensor. Jika kita butuh 1000 data dummy bertipe integer (2kB), maka SRAM Arduino Uno tidaklah

44

keluaran dari sebuah sensor. Jika kita butuh 1000 data dummy bertipe integer (2kB), maka SRAM Arduino

cukup. Solusinya, upgrade Arduino atau gunakan keyword PROGMEM.

Dengan perintah PROGMEM, maka data akan disimpan di memori flash. Sekali lagi, data akan disimpan di memori flash!

Memor flash adalah memori untuk menyimpan program. untuk Arduino Uno, kapasitasnya 32kB. Jika bootloader dan program menghabiskan 10 kB, berarti masih sisah 22 kB lagi yang bisa dipakai.

Contoh program untuk PROGMEM akan dibahas pada buku serial selanjutnya. Pada kesempatan ini, Anda cukup tahu dulu dan bisa googling untuk mencari informasi tentang PROGMEM ini.

4.8 String dengan F( )

Cobalah membuat program yang menampilkan banyak tulisan di serial terminal. Penulis yakin, ketika jumlah huruf dalam satu string lebih dari 2000 huruf, pasti ada warning atau malah error. Kenapa demikian?

Karena kapasitas SRAM hanya 2048 byte.

Untuk mengatasi hal tersebut, Anda bisa menggunakan PROGMEM atau fungsi F(), eh bukan fungsi, tapi makro F().

45

byte. Untuk mengatasi hal tersebut, Anda bisa menggunakan PROGMEM atau fungsi F(), eh bukan fungsi, tapi

Makro F() berguna untuk menyimpan tipe data (contohnya tipe String) ke memori flash. Fungsi makro F() sama dengan PROGMEM. Bedanya, makro F() bisa dipakai layaknya sebuah fungsi, sedangkan PROGMEM hanya untuk inisialisasi. Makro F() bisa dipanggil di bagian mana saja dalam program.

Seperti itulah beberapa hal yang dapat penulis share tentang tipe data. untuk pertanyaan lebih lanjut atau mungkin contoh-contoh juga akan dibahas di grup Facebook MONSTER ARDUINO.

Selanjutnya,

mari

kita

bahas

hal-hal

yang

menarik

lainnya yang mungkin belum Anda ketahui.

46

MONSTER ARDUINO. Selanjutnya, mari kita bahas hal-hal yang menarik lainnya yang mungkin belum Anda ketahui. 

Bagian #05

OPTIMALISASI DELAY

Modal bisa memenjarakan manusia, membuat manusia bekerja tanpa henti dari jam 5 subuh sampai jam 8 malam untuk kekayaan orang lain. (Tan Malaka)

5.1 Seberapa Cepatkah 16MHz itu?

Arduino Uno dengan kecepatan 16MHz mampu mengeksekusi 16.000.000 instruksi dalam 1 detik. Jika Anda menggunakan delay 1 detik dengan perintah delay(1000), berarti dia nganggur dalam 1 detik tersebut.

Sebagai gambaran, perintah digitalWrite(13,HIGH); membutuhkan waktu eksekusi sekitar 5-7 mikrodetik. Jika kita anggap rata-ratanya 6 mikrodetik yang setara dengan 0.000006 detik, maka kita bisa mengeksekusi sekitar 166.666 lebih perintah digitalWrite() dalam 1 detik. Banyak? Iya!

Daripada

Anda

memerintahkan

Arduino untuk

diam

dengan

memberikan

perintah

delay(),

lebih

baik

Anda

Anda memerintahkan Arduino untuk diam dengan memberikan perintah delay() , lebih baik Anda 47

47

alihkan pekerjaan Arduino untuk melakukan hal lain seperti mengecek nilai sensor, ganti tampilan LCD, atau aktivitas lainnya.

* * *

Mungkin Anda ingin bertanya, bagaimana penulis bisa tahu perintah pada kode di atas butuh waktu eksekusi sekitar 6 mikrodetik? Berikut adalah sketch yang penulis buat untuk simulasi.

Program 5.1 Program Waktu Eksekusi DigitalWrite

1

/*

2

*

MONSTER ARDUINO V2

3

*

Program Waktu Eksekusi DigitalWrite

4

*

5

*/

6

7

// pin 13 sebagai output

8

const byte PIN_LED = 13;

9

10

// jumlah sampel data

11

int delay_count = 100;

12

13

// pencatat waktu

14

unsigned long delay_sum = 0;

15

unsigned long delay_first = 0;

16

unsigned long delay_last = 0;

17

18

// logika untuk flip flop

19

boolean flip = true;

20

21

void setup() {

22

 

// buka koneksi serial

23

// lalu jadikan pin_led sebagai output

24

Serial.begin(19200);

25

while(!Serial);

26

pinMode(PIN_LED,OUTPUT);

48

sebagai output 24 Serial.begin (19200); 25 while (! Serial ); 26 pinMode (PIN_LED, OUTPUT ); 48

27

}

28

29

void loop() {

30

31

// ambil 100 sampel data

32

// catat dalam variabel delay_sum

33

delay_sum = 0;

34

for(byte i=0; i<delay_count; i++){

35

// catat awal eksekusi

36

delay_first = micros();

37

// ubah logika pin_led

38

digitalWrite(PIN_LED,flip);

39

// catat akhir eksekusi

40

delay_last = micros();

41

// tambahkan selisihnya pada variabel

42

delay_sum += (delay_last - delay_first);

43

}

44

45

// total selisih dibagi 100 (sampel)

46

// untuk mendapatkan rata-ratanya

47

Serial.print("Delay : ");

48

Serial.print( delay_sum/delay_count );

49

Serial.println(" us");

50

51

// balik logika flip

52

flip = !flip;

53

delay(1000);

54

}

Output program ini dapat dilihat pada Gambar 5.1. Sebagai tambahan informasi, waktu 6 mikrodetik adalah waktu rata-rata total eksekusi program dan waktu untuk load program ke register. Jika program sudah ada dalam register, maka waktu eksekusi akan lebih cepat.

Kesimpulan dari pembahasan tentang fungsi delay() adalah: Untuk mendapatkan sistem yang responsive, hindari

cepat. Kesimpulan dari pembahasan tentang fungsi delay () adalah: Untuk mendapatkan sistem yang responsive, hindari 49

49

penggunaan fungsi delay dalam program, kecuali memang sangat dibutuhkan.

delay dalam program, kecuali memang sangat dibutuhkan.  Gambar 5.1 Hasil eksekusi Program Waktu Eksekusi

Gambar 5.1 Hasil eksekusi Program Waktu Eksekusi DigitalWrite

5.2 Project Perbaikan Dummy Logger

Rangkain untuk program ini masih sama dengan rangkain Project Dummy Logger. Sedangkan untuk program perbaikannya seperti di bawah ini.

Program perbaikannya sama sekali tidak menggunakan delay(). Untuk menentukan timer 3 detik dan timer untuk mengaktifkan buzzer menggunakan permainan waktu.

Misalnya, pada waktu pengiriman data dalam 3 detik. Setiap mengirimkan data, maka waktu pengiriman dicatat

50

waktu. Misalnya, pada waktu pengiriman data dalam 3 detik. Setiap mengirimkan data, maka waktu pengiriman dicatat

dalam kirim data_time_last (lihat baris 109). Selanjutnya, waktu terus dicek apakah sejak pengiriman terakhir tadi sudah lewat 3 detik atau tidak (lihat baris 98). Jika sudah lewat 3 detik, kirim data. Jika belum lewat 3 detik, abaikan.

Program 5.2 Program Perbaikan Dummy Logger

1

/*

2

*

MONSTER ARDUINO V2

3

*

Program Perbaikan Dummy Logger

4

*

5

*/

6

7

// buzzer disetting active low

8

// BUZZER_OFF kebalikan dari BUZZER_ON

9

#define BUZZER_ON LOW

10

#define BUZZER_OFF !BUZZER_ON

11

12

// GND buzzer dihubungkan ke pin 2

13

const byte PIN_BUZZER = 2;

14

15

// variabel untuk cek waktu kirim

16

unsigned long waktu_kirim = 0;

17

18

// logika buzzer

19

const unsigned long buzzer_delay[] = {0,200,100,200};

20

const boolean buzzer_state[] = {BUZZER_ON, BUZZER_OFF, BUZZER_ON, BUZZER_OFF};

21

byte buzzer_state_counter = sizeof(buzzer_state);

22

23

// pencatat waktu timer buzzer

24

unsigned long buzzer_time = 0;

25

unsigned long buzzer_time_last = 0;

26

27

// pencatat waktu timer kirim data

28

unsigned long kirimdata_time = 0;

29

unsigned long kirimdata_time_last = 0;

30

31

// delay kirim data 3 detik

32

const long kirimdata_delay = 3000;

33

= 0; 30 31 // delay kirim data 3 detik 32 const long kirimdata_delay = 3000;

51

34

 

35

void setup() {

36

37

// aktifkan komunikasi serial

38

// pada baudrate 19200

39

Serial.begin(19200);

40

41

// tunggu hinga Serial siap digunakan

42

while(!Serial);

43

44

// pin buzzer sebagai output

45

pinMode(PIN_BUZZER, OUTPUT);

46

digitalWrite(PIN_BUZZER, BUZZER_OFF);

47

48

// catat waktu kirim pertama kali

49

waktu_kirim = millis();

50

51

}

52

53

void loop() {

54

55

// kirim data

56

KirimData();

57

58

// bunyi tilit tilit

59

TilitTilit();

60

61

}

62

63

void TilitTilit(){

64

65

// state ada 4 kondisi : 0 1 2 dan 3

66

// 0 adalah bip pertama 200ms

67

// 1 adalah matinya bip pertama 100ms

68

// 2 adalah bip kedua 200ms

69

// 3 adalah matinya bip kedua

70

// jika buzzer_state_counter >= 4,

71

// maka blok program ini tdk dieksekusi.

72

if( buzzer_state_counter < sizeof(buzzer_state) ){

73

74

// catat waktu saat ini

75

buzzer_time = millis();

76

// cek apakah delay pada index state sudah terpenuhi

77

if(buzzer_time - buzzer_time_last >=

52

(); 76 // cek apakah delay pada index state sudah terpenuhi 77 if (buzzer_time - buzzer_time_last
 

buzzer_delay[buzzer_state_counter]){

78

 

// aktifkan atau matika buzzer sesuai

79

// logika pada index state

80

digitalWrite(PIN_BUZZER, buzzer_state[buzzer_state_counter]);

81

// pindah state berikutnya

82

buzzer_state_counter++;

83

// catat waktu tadi sebagai waktu eksekusi terakhir

84

buzzer_time_last = buzzer_time;

85

}

86

 

87

 

}

88

 

89

}

90

91

// fungsi untuk mengirim data

92

void KirimData(){

93

94

 

// catat waktu sekarang

95

kirimdata_time = millis();

96

// apabila waktu kirim terakhir dan waktu sekarang sudah 3 detik

97

// eksekusi blok program berikut

98

if( kirimdata_time - kirimdata_time_last >= kirimdata_delay ){

99

 

100

 

// cetak selisih waktu kirim sebelumnya

101

// dengan pengiriman saat ini

102

Serial.print("Selisih Waktu : ");

103

Serial.println( millis() - waktu_kirim );

104

 

105

 

// catat waktu kirim data

106

waktu_kirim = millis();

107

 

108

 

// catat waktu kirim data terakhir

109

kirimdata_time_last = kirimdata_time;

110

 

111

 

// setelah ngirim data

112

// reset state buzzer menjadi 0

113

// sehingga blok program pada

114

// baris 72 dieksekusi

115

buzzer_state_counter = 0;

116

 

117

 

}

118

}

114 // baris 72 dieksekusi 115 buzzer_state_counter = 0; 116   117   } 118 }

53

Bunyi buzzer Tilit Tilit juga demikian, pengecekannya berdasarkan waktu eksekusi terakhir. Hanya saja, terdapat 4 kondisi yang membedakan antara ON/OFF buzzer dan delay yang harus ditunggu (lihat baris 19-20).

Jika

fungsi

TilitTilit()

divisualisasikan

dalam

time

diagram, maka bentuknya akan tampak seperti Gambar 5.2.

time diagram, maka bentuknya akan tampak seperti Gambar 5.2. Gambar 5.2 Time diagram untuk kondisi State

Gambar 5.2 Time diagram untuk kondisi State delay

Nilai State dan delay bisa dicocokan dengan inisialisasi program pada baris 19-20. Cara kerjanya adalah sebagai berikut:

1. Saat State direset menjadi 0, yaitu pada baris 115, maka periksa delay yang pada indeks 0 ms.

2. Jika delay pada State 0 habis (0 ms), buzzer masuk ke State 0 = kondisi ON. Sementara waktu tunggu masuk ke State 1, yaitu waktu tunggu 200 ms.

54

habis (0 ms), buzzer masuk ke State 0 = kondisi ON. Sementara waktu tunggu masuk ke

3. Setelah waktu tunggu State 1 habis, maka buzzer menyusul masuk ke State 1, sehingga logika berubah menjadi OFF.

4. Begitu seterusnya hingga masuk ke State 4.

Gambar 5.3 adalah hasil dari program setelah perbaikan. Hasilnya, waktu pengiriman data lebih pas 3 detik. Kelebihannya, program ini hanya sedikit terpengaruh apabila ada penambahan blok program baru. Namun akan terpengaruh apabila ada bagian blok program yang menggunakan delay yang melebihi 3 detik. Lalu bagaimana solusinya?

delay yang melebihi 3 detik. Lalu bagaimana solusinya? Gambar 5.3 Hasil perbaikan program Dummy Logger Salah

Gambar 5.3 Hasil perbaikan program Dummy Logger

Salah satu solusinya adalah menggunakan Timer Interrupt yang akan kita bahas pada bab selanjutnya.

55

Dummy Logger Salah satu solusinya adalah menggunakan Timer Interrupt yang akan kita bahas pada bab selanjutnya.

Namun sebelum kita membahas tentang timer interrupt, penulis akan berbagi tentang salah satu source code yang dapat digunakan sebagai pengganti delay.

Source code tersebut bisa kita sebut delay yang resposive. Kita sebut delay yang responsive sebab delay ini tidak memblok dan menghentikan eksekusi bagian program lainnya sebagaimana fungsi delay().

5.3 Program Simpel Delay yang Responsive

Program 5.3 Program Delay Responsive

1

/*

2

*

MONSTER ARDUINO V2

3

*

Program Delay Responsive

4

*

5

*/

6

7

// buzzer disetting active low

8

// BUZZER_OFF kebalikan dari BUZZER_ON

9

#define BUZZER_ON LOW

10

#define BUZZER_OFF !BUZZER_ON

11

12

// GND buzzer dihubungkan ke pin 2

13

const byte PIN_BUZZER = 2;

14

15

// logika buzzer

16

boolean DATA_BUZZER = BUZZER_OFF;

17

18

void setup() {

19

20

 

// pin buzzer sebagai output

21

pinMode(PIN_BUZZER, OUTPUT);

22

// matikan buzzer

23

digitalWrite(PIN_BUZZER, DATA_BUZZER);

24

 

25

}

56

OUTPUT ); 22 // matikan buzzer 23 digitalWrite (PIN_BUZZER, DATA_BUZZER); 24   25 } 56

26

 

27

void loop() {

28

29

 

// buzzer akan nyala setiap 1 detik

30

if( nonblocking_delay(1000) ){

31

DATA_BUZZER = !DATA_BUZZER;

32

digitalWrite(PIN_BUZZER, DATA_BUZZER);

33

}

34

 

35

 

// program di baris 30-33 memiliki fungsi yg sama

36

// dengan program berikut:

37

 

38

 

// digitalWrite(PIN_BUZZER, BUZZER_ON);

39

// delay(1000);

40

// digitalWrite(PIN_BUZZER, BUZZER_OFF);

41

// delay(1000);

42

 

43

}

44

45

// tambahan untuk membuat delay non blocking

46

unsigned long nonblocking_time = millis();

47

unsigned long nonblocking_last = millis();

48

boolean nonblocking_delay(long milidetik){

49

 

nonblocking_time = millis();

50

if(nonblocking_time - nonblocking_last >= milidetik){

51

nonblocking_last = nonblocking_time;

52

return true;

53

}