Mengenal Fungsi pada Arduino (Function)

Mengenal Fungsi pada Arduino (Function)

Apa itu Fungsi pada Arduino?

Fungsi adalah kumpulan baris-baris program untuk mengerjakan tugas tertentu. Fungsi digunakan untuk mengurangi penulisan kode program yang berulang.

Arduino menggunakan bahasa C, sehingga struktur penulisan fungsi berpedoman pada bahasa C.

Seharusnya kita tidak asing lagi dengan fungsi, karena pada pemrograman Arduino sendiri memiliki 2 buah fungsi wajib, yaitu fungsi setup() dan fungsi loop().

Kita biasanya menuliskan kode program utama kita pada fungsi loop(), padahal sebenarnya kita bisa membagi beberapa kode program ke dalam beberapa fungsi sesuai dengan tugas dari kode program tersebut.

Contoh Kasus

Bayangkan kita sedang membuat sebuah proyek untuk mengontrol 5 buah relay. Kita harus membuat relay beroperasi sesuai dengan ketentuan berikut.

  1. Relay ON selama 2 detik.
  2. Relay OFF selama 2 detik.
  3. Relay ON selama 1 detik.
  4. Relay OFF selama 1 detik.

Jika tanpa fungsi, kode program kita tentu akan terlihat seperti ini.

const int relay1 = 2;
const int relay2 = 3;
const int relay3 = 4;
const int relay4 = 5;
const int relay5 = 6;

void setup(){
 pinMode(relay1, OUTPUT);
 pinMode(relay2, OUTPUT);
 pinMode(relay3, OUTPUT);
 pinMode(relay4, OUTPUT);
 pinMode(relay5, OUTPUT);
}
void loop(){
 digitalWrite(relay1, HIGH); // Relay ON
 digitalWrite(relay2, HIGH); // Relay ON
 digitalWrite(relay3, HIGH); // Relay ON
 digitalWrite(relay4, HIGH); // Relay ON
 digitalWrite(relay5, HIGH); // Relay ON
 delay(2000); // ON 2 detik
 
 digitalWrite(relay1, LOW); // Relay OFF
 digitalWrite(relay2, LOW); // Relay OFF
 digitalWrite(relay3, LOW); // Relay OFF
 digitalWrite(relay4, LOW); // Relay OFF
 digitalWrite(relay5, LOW); // Relay OFF
 delay(2000); // OFF 2 detik
 
 digitalWrite(relay1, HIGH); // Relay ON
 digitalWrite(relay2, HIGH); // Relay ON
 digitalWrite(relay3, HIGH); // Relay ON
 digitalWrite(relay4, HIGH); // Relay ON
 digitalWrite(relay5, HIGH); // Relay ON
 delay(1000); // ON 1 detik
 
 digitalWrite(relay1, LOW); // Relay OFF
 digitalWrite(relay2, LOW); // Relay OFF
 digitalWrite(relay3, LOW); // Relay OFF
 digitalWrite(relay4, LOW); // Relay OFF
 digitalWrite(relay5, LOW); // Relay OFF
 delay(1000); // OFF 1 detik
}

Bisa kita lihat di atas bahwa terjadi penulisan kode program yang berulang, walaupun kode program berjalan dengan semestinya namun kode di atas kurang optimal.

Jika menggunakan fungsi, kita dapat menyederhanakan kode program di atas menjadi seperti ini.

const int relay1 = 2;
const int relay2 = 3;
const int relay3 = 4;
const int relay4 = 5;
const int relay5 = 6;

void setup(){
 pinMode(relay1, OUTPUT);
 pinMode(relay2, OUTPUT);
 pinMode(relay3, OUTPUT);
 pinMode(relay4, OUTPUT);
 pinMode(relay5, OUTPUT);
}

void relayHidup(){
 digitalWrite(relay1, HIGH); // Relay ON
 digitalWrite(relay2, HIGH); // Relay ON
 digitalWrite(relay3, HIGH); // Relay ON
 digitalWrite(relay4, HIGH); // Relay ON
 digitalWrite(relay5, HIGH); // Relay ON
}

void relayMati(){
 digitalWrite(relay1, LOW); // Relay OFF
 digitalWrite(relay2, LOW); // Relay OFF
 digitalWrite(relay3, LOW); // Relay OFF
 digitalWrite(relay4, LOW); // Relay OFF
 digitalWrite(relay5, LOW); // Relay OFF
}

void loop(){
 relayHidup(); // Memanggil Fungsi
 delay(2000);  // ON 2 detik
 relayMati();  // Memanggil Fungsi
 delay(2000);  // OFF 2 detik
 relayHidup(); // Memanggil Fungsi
 delay(1000);  // ON 1 detik
 relayMati();  // Memanggil Fungsi
 delay(1000);  // OFF 1 detik
}

Kita bisa melihat bahwa kode program yang menggunakan fungsi memiliki jumlah baris program yang lebih sedikit jika dibandingkan kode program sebelumnya. 

Fungsi loop() terlihat lebih rapi dan ringkas. Untuk menghidupkan dan mematikan relay juga lebih mudah, yaitu hanya menuliskan 1 baris program saja.

Fungsi juga berpengaruh terhadap penggunaan memori flash pada mikrokontroler. Pada program di atas, jika tanpa fungsi, memori flash yang digunakan adalah 1152 Bytes, sedangkan yang menggunakan fungsi adalah 1086 Bytes. 

Mari kita membahas lebih dalam tentang fungsi, mulai dari strukturnya.

Struktur Fungsi

Fungsi memiliki beberapa bagian, berikut ini adalah struktur dari sebuah fungsi pada Arduino (bahasa C).

return_type function_name (parameter) {
body of the function
}

Berikut adalah penjelasan dari masing-masing bagian dari fungsi.

  • Return Type - Return type adalah tipe data kembalian (int, float, dan lainnya). Fungsi bisa mengembalikan sebuah nilai saat dipanggil. Namun fungsi juga bisa tidak mengembalikan nilai apa pun (seperti pada contoh kasus), sehingga Return Type ditulis void.
  • Function Name - Ini adalah nama dari sebuah fungsi. Nama fungsi bersifat unik (tidak boleh sama).
  • Parameter - Kita dapat memberikan sebuah nilai pada fungsi menggunakan parameter, dimana nilai tersebut akan digunakan dan diolah oleh fungsi yang kita panggil. Namun fungsi juga bisa tanpa parameter (seperti contoh kasus). Contoh penggunaan parameter seperti Serial.print("Hello World");, kata Hello World disebut sebagai parameter.
  • Function Body - Ini adalah tubuh dari fungsi. Ini adalah tempat kita menulis baris-baris perintah yang kita gunakan.

Itu dia struktur dari fungsi yang harus kita mengerti, selanjutnya kita akan melihat contoh dari sebuah fungsi sederhana.

Contoh Fungsi

Di bawah ini adalah contoh dari sebuah fungsi untuk menjumlahkan 2 buah nilai. Fungsi menerima 2 buah nilai berupa num1 dan num2 melalui parameter. Hasil dari penjumlahan akan dikembalikan.

int jumlahkan (int num1, int num2) {
 int hasil = num1 + num2;
 return hasil;
}
Pemanggilan fungsi:
jumlahkan (100, 100);

Mendeklarasikan Fungsi

Dilansir melalui tutorialspoint.com, pendeklarasian berfungsi untuk memberitahu compiler tentang nama dari fungsi dan bagaimana cara memanggil fungsi. Function Body dari fungsi tersebut bisa didefinisikan secara terpisah dan bisa juga tidak (seperti contoh kasus di atas).

Deklarasi fungsi memiliki struktur sebagai berikut.

return_type function_name (parameter list);

Contoh pendefinisian fungsi jumlahkan() di atas adalah seperti berikut ini.

int jumlahkan (int num1, int num2);

Namun sebenarnya, saat kita mendefinisikan sebuah fungsi, nama dari parameter tidak begitu penting sehingga penulisan seperti di bawah ini juga berlaku.

int jumlahkan (int, int);

Mendefinisikan fungsi dibutuhkan jika sebuah fungsi pada satu file dipanggil di dalam file lain.

Memanggil Fungsi

Agar baris-baris program di dalam fungsi bisa berjalan, fungsi perlu dipanggil. 

Untuk memanggil fungsi, kita hanya perlu menuliskan nama fungsi beserta parameter yang dibutuhkan. Berikut adalah contoh dari pemanggilan fungsi.

function_name (parameter);

Berikut adalah bentuk pemanggilan fungsi jumlahkan();.

jumlahkan (num1, num2);

Berikut adalah contoh penggunaan fungsi jumlahkan() pada Arduino.

int jumlahkan (int, int); // Mendifinisikan Fungsi

void setup() {
 Serial.begin(9600); // Memulai Komunikasi Serial
 delay(1000);
 Serial.println("Contoh Penggunaan Fungsi");
 Serial.println(jumlahkan (10, 10)); // Pemanggilan Fungsi (10 + 10)
 Serial.println(jumlahkan (20, 10)); // Pemanggilan Fungsi (20 + 20)
 Serial.println(jumlahkan (30, 30)); // Pemanggilan Fungsi (30 + 30)
 Serial.println(jumlahkan (40, 40)); // Pemanggilan Fungsi (40 + 40)
}

void loop() {
 
}

// Mendifinisikan Tubuh Fungsi //
int jumlahkan (int num1, int num2) {
 int hasil = num1 + num2; // Deklarasi Variabel Hasil
 return hasil; // Perintah untuk Return Nilai Hasil
}