Preprosessor Pada Pemrograman Arduino

Pernah ga punya pertanyaan “setelah klik compile di Arduino IDE, apa sih proses yang terjadi dibelakang layar ?”. Nah, saat kita klik Compile, Arduino IDE akan pelakukan proses Preprocessing dimana file dengan ekstensi .ino dikonversi menjadi Bahasa C++ dan menambahkan header #include <Arduino.h>. setelah preprocessing lanjut ke proses compiling, yaitu mengubah High Level Code (C++) menjadi Low Level Code (kode biner), sebuah Bahasa yang dipahami oleh mikrokontroller. Pada artikel ini saya ingin membahas mengenai proses preprocessing, kita juga bisa melakukan pengaturan pada preprocessing untuk membuat kode menjadi efisien.

Preprocessing

Sudah dijelaskan sebelumnya bahwa preprocessing akan mengubah Bahasa arduino (.ino) menjadi Bahasa C++, namun yang sebenarnya dilakukan preprocessing adalah :

1.Membaca dan mengganti makro

Makro adalah sebaris kode atau nilai yang diberi nama, Kita bisa membuat makro dan mendefinisikan nilainya dengan menggunakan #define. Ketika kita mendefinisikan sebuah makro, ketika proses compile, setiap pembacaan nama yang sama dengan makro akan secara otomatis digantikan oleh nilai yang didefinisikan pada makro. Contoh :

				
					#define LED_PIN 13

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

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

				
			

Pada program diatas, karena saya mendefinisikan makro dengan nama LED_PIN dan diisi nilai 13. Maka ketika proses compile setiap baris yang ada nama LED_PIN akan diganti menjadi 13. Lalu apa bedanya dengan mendeklarasikan variabel ?, perbedaan nya, Makro hanya mengganti teks pada program dengan nilai makro sedangkan deklarasi variabel akan melakukan write pada memori dan akan mengakses memori setiap variabel dibaca, intinya makro tidak memakai memori.

2. Menambahkan header #include <Arduino.h>

Proses selanjutnya adalah menambahkan header #include <Arduino.h> secara otomatis pada program. Pertanyaannya, kenapa arduino IDE menambahkan header itu di programnya ?. karena bahasa pemrogramnnya akan diubah menjadi C++, maka library Arduino.h harus ditambahkan kedalam program agar program tersebut memiliki akses ke class dan object pada Bahasa pemrograman arduino, tanpa library itu kita tidak akan bisa menggunakan fungsi-fungsi seperti pinMode(), digitalWrite(), delay(), dan ketika di compile akan muncul error seperti :

				
					“pinMode' was not declared in this scope”
				
			

Itu artinya sebuah object yang bernama pinMode berada dalam library Arduino.h. ada 2 cara untuk menambahkan library:

				
					#include <Wire.h>
#include "myCustomLibrary.h"

				
			

Perbedaan antara < > dan ” “:

< >: Untuk mencari file library di folder C:\Program Files (x86)\Arduino\libraries

” “: Untuk mencari file library di folder project.

3. Seleksi kompilasi 

Proses terakhir adalah menentukan baris program mana saja yang ingin dikompilasi berdasarkan suatu kondisi. Kita bisa mengatur arduino IDE agar hanya mengkompilasi program yang kita inginkan, untuk mengatur kompilasi bisa menggunakan #ifdef, #ifndef, #else, #elif, #endif, #undef.

  • #ifdef – Jika Simbol Telah Didefinisikan

Dengan menggunakan #ifdef, kita bisa mengkompilasi baris kode yang sebelumnya sudah di definisikan.

				
					#define DEBUG_MODE

void loop() {
#ifdef DEBUG_MODE
  Serial.println("Debug Mode Aktif");
#endif
}

				
			

Dibaca : Jika DEBUG_MODE didefinisikan, maka baris Serial.println(..) akan dikompilasi.

  • #ifndef – Jika Simbol Tidak Didefinisikan

Dengan menggunakan #ifndef, kita bisa mengkompilasi baris kode yang makronya belum di definisikan, digunakan untuk memastikan makro hanya di proses sekali dan mencegah makro didefinisikan berkali-kali.

				
					#ifndef LED_PIN
  #define LED_PIN 13
#endif

				
			

Dibaca : Jika LED_PIN tidak didefinisikan, maka definisikan LED_PIN dengan nilai 13.                                       

  • #else dan #elif

Fungsinya sama dengan conditional statement If dan Else, ini bisa memilih mana yang akan dikompilasi sesuai dengan makro yang didefinisikan. Contoh

				
					#define DEVICE_TYPE 2

void setup() {
#if DEVICE_TYPE == 1
  Serial.println("Menggunakan Sensor Jenis A");
#elif DEVICE_TYPE == 2
  Serial.println("Menggunakan Sensor Jenis B");
#else
  Serial.println("Sensor Tidak Diketahui");
#endif
}

				
			

Dibaca :
Karena yang didefinisikan adalah DEVICE_TYPE 2, maka yang di kompilasi adalah baris program

				
					  Serial.println("Menggunakan Sensor Jenis B");
				
			
  • #undef – Membatalkan Definisi Simbol
				
					#define TEMP_SENSOR 1

#undef TEMP_SENSOR

#ifdef TEMP_SENSOR == 1
  //Program pembacaan sensor temperatur
#endif

				
			

Dibaca : karena TEMP_SENSOR 1 pendefinisiannya dibatalkan, maka baris program pembacaan sensor temperature tidak akan dikompilasi.

Pengaturan pada preprocessing bisa membantu mengoptimasi program yang kita buat, tidak harus mengkompilasi semua baris program, seleksi program mana saja yang kita butuhkan. 

Satu pemikiran pada “Preprosessor Pada Pemrograman Arduino”

Tinggalkan komentar