Pemrograman Arduino
Struktur program Arduino adalah dasar yang harus di pegang kuat sebelum membuat project Arduino dengan tingkat yang jauh lebih kompleks. Mahir strukur dasar ini akan membuat kita semakin mudah bagaimana cara memprogram yang baik. Karena tingkat lanjut dari program dasar Arduino adalah OOP ( object-oriented Programming),Sebuah program yang akan tersusun Rapi dan lebih ringkas,yah saya masih belajar ini, insyallah akan di jadikan jadi bahan tutorial lanjutan di sini.
Pahami lah coding arduino tiap baris nya, bukan hanya copy paste dan edit
Struktur dasar program Arduino setidak nya terdiri dari 3 Bagian, ini sudah di bahas juga secara singkat di link belajar arduino ini, tiga bagian ini adalah sebagai berikut,
- Global Variable
- Setup
- Loop
Bahagian ini akan kita bahas satu satu di sini, yuk kita lihat dan langsung di praktikan dengan modul belajar arduino nya yah? biar gak bosen dan selaras dengan apa yang kita maksud kan.
Global Variable
Global Variable ini berlaku juda di program jenis lain ya, sebuah variable ( akan kita bahas di sub tema variable program arduino di artikel selanjut nya )yang akan di kenal di semua fungsi fungsi nanti nya. Struktur dasar sebagai berikut, yuk kita lihat
//global variable di sini const byte led = 13; void setup() { //inisialisasi program, hanya di akses sekali pinMode(led, OUTPUT); } void loop() { // akan di akses terus menerus digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
Program di bawah adalah sebuah deklarasi global, yang mana di semua fungsi akan di kenali.
const byte led = 13;
Untuk membuktikan nya, kita coba buat program seperti di bawah ini,
//global variable di sini const byte led = 13; void setup() { //inisialisasi program, hanya di akses sekali pinMode(led, OUTPUT); } void loop() { // akan di akses terus menerus led_nyala(); } void led_nyala(){ digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
Sekarang coba ketikan program di atas, kemudian compile, pasti tidak error ( seharus nya ). Pada program di atas ada sebuah fungsi, namanya adalah
void led_nyala()
Sebuah fungsi dengan nama void led_nyala(), yang kemudian berisi program di bawah ini
void led_nyala(){ digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
Nah, program di atas tidak akan error di program karena variable led pada fungsi void led_nyala(); sudah di declarasi,
sekarang coba hapus program di bawah ini, di program utama
const byte led = 13;
kemudian compile, lihat error nya.
nah led pada fungsi led_menyala tidak akan di kenali, karena dia belum di deklarasi, tapi yuk coba kita buat program berikut, agar lebih jelas lagi tentang struktur dasar program ini
Local Variable
Lokal Variable pada program C/C++. Perbedaan dasar dari global variable adalah, lokal variable ini hanya di kenal pada fungsi nya saja, tapi pada fungsi lain tidak di kenal. Coba kita buat program seperti di bawah ini.
//global variable di sini const byte led = 13; void setup() { //inisialisasi program, hanya di akses sekali pinMode(led, OUTPUT); } void loop() { // akan di akses terus menerus led_nyala(); } void led_nyala(){ int waktu = 1000; digitalWrite(led, HIGH); delay(waktu); digitalWrite(led, LOW); delay(waktu); }
coba perhatikan program di atas, ada sebuah variable lokal dengan nama waktu dengan tipe data integer ( tipe data akan kita bahas di artikel lanjutan). Waktu ini hanya akan di kenal di fungsi void led_nyala() saja. Coba kompile kemudian check, seharus nya tidak error.
Ada satu hal yang unik di Global variable dan Lokal Variable ini, mungkin master master bisa tahu, Tipe data waktu bisa saja kita letakan di Global variable, tapi mungkin ada perbedaan esekusi waktu mau pun jumlah memory.
Jadi fungsi dari global variable adalah sebuah variable yang akan kita akses berulang ulang di semua fungsi yang akan kita buat. sementara lokal variable adalah yang sangat jarang di akses, bahkan dia mungkin adalah varible pembantu pada fungsi itu.
Coba buat program berikut, dan akan error jika di compile
//global variable di sini const byte led = 13; void setup() { //inisialisasi program, hanya di akses sekali pinMode(led, OUTPUT); } void loop() { // akan di akses terus menerus led_nyala(); } void led_nyala(){ int waktu = 1000; digitalWrite(led, HIGH); delay(waktu); digitalWrite(led, LOW); delay(waktu); } void led_nyala2(){ digitalWrite(led, HIGH); delay(waktu); digitalWrite(led, LOW); delay(waktu); }
Ketika di compile maka akan ada error pada fungsi led_nyala2(); hal ini terjadi karena variable waktu tidak di kenal, variable waktu hanya di kenal pada fungsi led_nyala.
Rubah Ke Global Variable
Nah sampai saat ini harus nya teman-teman sudah paham. Yuk kita coba rubah waktu menjadi global variable. Program nya ada di bawah ini
//global variable di sini const byte led = 13; const int waktu = 1000; // ini globla variable void setup() { //inisialisasi program, hanya di akses sekali pinMode(led, OUTPUT); } void loop() { // akan di akses terus menerus led_nyala(); led_nyala2(); } void led_nyala(){ digitalWrite(led, HIGH); delay(waktu); digitalWrite(led, LOW); delay(waktu); } void led_nyala2(){ digitalWrite(led, HIGH); delay(waktu); digitalWrite(led, LOW); delay(waktu); }
nah variable waktu telah kita angkat ke posisi global variable, ketika di compile maka tidak akan error lagi, walaupun waktu tidak kita deklarasi pada fungsi led_nyala() dan led_nyala2().
Semoga sudah paham yah, heheh, setup
Void Setup()
Init Register
Void setup pada program Arduino adalah sebuah tempat atau fungsi untuk men deklarasi fungsi fungsi mikrokontroller pada Arduino. Chip mikrokontroller nya memiliki register yang mem fungsikan apakah PIN di gunakan sebagai input, atau sebagai output, apakah di gunakan komunikasi Serial, dan lain lain.
Jika teman-teman pernah menggunakan software pemrogram mikrokontroller seperti Atmel Studio, Codevision AVR, Bascom, maka teman-teman akan lihat jelas bagaimana cara deklarasi fungsi register setiap fungsi dari fitur yang di bawa setiap jenis mikrokontroller sendiri.
Saya yakin teman-teman mikro yang langsung terjun ke dunia Arduino tanpa mendahului belajar dengan menggunakan program seperti di atas, maka hal ini akan menjadi tabu. Seperti anak anak jaman Sekarang yang bingung apa itu permain engklek, patok lele, main karet dan lain lain. hahah betul lho
Sebagai Contoh, jika di Arduino kita cukup menggunakan perintah di bawah ini untuk setting pin apakah sebagain input atau output
void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(2, OUTPUT); pinMode(3, INPUT); Serial.begin(9600); }
Nah, di atas pin 2 akan di gunakan sebagai sebagaioutput,kemudian pin 3 akan di gunakan sebagaiinput. Berbeda jika menggunakan codevision AVR ( kebetulan penulis latar belakang nya Codevision AVR ). Maka program nya akan seperti berikut,
#include <mega328p.h> void main(void) { DDRD.2 = 1; // SET OUPUT PORTD.2 = 0; // SET O DDRD.3 = 0; // SET INPUT PORTD.3 = 1; // SET PULLUP // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART0 Mode: Asynchronous // USART Baud Rate: 9600 UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0); UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80); UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0); UBRR0H=0x00; UBRR0L=0x67; while (1) { // Place your code here } }
Tampak aneh kan? nah Jadi di Arduino, kita tidak lagi di pusingkan dengan register-register mikrokontroller yang perlu di inisialisasi, karena fungsi init nya sudah di buat dalam sebuah library.
Master Mikrokontroller angkatan Lama sangat familiar dengan register-register mikrokontroller, migrasi ke Arduino akan memudah kan dia untuk coding Arduino, karena di Arduino juga bisa di init atau di olah register-register ini.
Yah begitu lah. but I am not master, lazy to check register in datasheet, LOL, heheh
Hanya di Akses Sekali
Void setup ini sifat nya hanya di akses sekali saja. Dia tidak akan di akses ber ulang ulang. Jika power on, maka dia di akses. Karena sifat nya yang di akses sekali saja, maka bisa kita gunakan untuk keperluan tertentu. Sebagai Contoh, saya gunakan dia sebagai pemanggil eeprom external. Jadi begitu on, akan load EEPROM external, kemudian nilai-nilai nya kita simpan ke variable dalam Arduino.
Penggunaan setup ini layak nya booting bios awal sebuah sistem operasi, di sana semua fungsi awal akan di akses di sini. Tergantung dari kreativitas programmer nya menggunakan fungsi setup ini.
void Loop()
Sesuai dengan namanya, Loop, berputar tanpa henti. looping forever, sebuah program akan di akses terus menerus, sebuah siklus tanpa akhir. Nah ini penting, karena memang nanti nya kita ingin system ini berjalan tiada henti, hari, minggu, bulan, bahkan puluhan tahun bekerja tanpa henti.
Untuk itu ada fungsi loop. Semua program yang akan di olah bekerja secara terus menerus akan di olah di fungsi loop. Program akan di jalankan dari atas sampai ke bawah, kemudian kembali lagi ke atas. hal ini terjadi dalam Kondisi normal. Kecuali jika kita gunakan fungsi interupsi pada Arduino. Interupsi ini akan di tunda untuk di proses dan program mendadak menjalan kan program pada fungsi interrupt. Interrupt ini akan kita bahas di kesempatan mendatang.
Untuk lebih jelas nya, yuk kita lihat coding di bawah ini, pastikan coding ini di ketik, bukan copy paste kemudian buka serial monitor Arduino teman-teman nanti nya.
void setup() { Serial.begin(9600); } void loop() { Serial.println("baris satu"); delay(1000); Serial.println("baris dua"); delay(1000); Serial.println("baris tiga"); delay(1000); Serial.println("baris empat"); delay(1000); Serial.println("baris lima"); delay(1000); Serial.println("baris enam"); delay(1000); Serial.println("baris tujuh"); delay(1000); Serial.println("baris delapan"); delay(1000); Serial.println("baris sembilan"); delay(1000); Serial.println("baris sepuluh"); delay(1000); }
Coba upload program program di atas ke Arduino, dan buka serial monitor, pastikan baut rate di serial monitor sesuai dengan nilai di bawah ini,
Serial.begin(9600);
Nilai baudrate yang berbeda antara program dengan di serial monitor akan menyebabkan pembacaan error pada serial monitor, pastikan sama
Nah Sekarang buka serial monitor nya, check apakah yang terjadi? Maka akan tampil karakter di serial monitor dengan karakter,
baris satu, kemudian tunda 1000ms, kemudian baris dua, kemudian tunda 1000ms, kemudian Seterus nya sampai muncul tulisan baris sepuluh. Setelah baris sepuluh muncul maka akan kembali berulang, serial monitor akan menampilkan baris satu, kemudian tunda 1000ms dan seturus nya. Kejadian ini akan berulang terus menerus sampai selama nya, sampaipower supply dari Arduino off.
Selesai sudah pelajaran Struktur program Arduino kita bahas. Semoga bermanfaat,
Saran saya adalah coba ketik berulang-ulang dengan penuh kesabaran program di atas. maka coding demi coding akan lengkep di memory kita. Semakin di ulang akan semkain di ingat. Jangan terbaru- buru ingin membuat sesuatu yang besar, tapi mulai lah dari yang kecil.
Untuk kembali ke daftar tutorial belajar arduino, cukup klik tombol di bawah ini, untuk pelajaran selanjut nya
Semoga bermanfaat
#LearningAndSharing
#mikroavr