Membagi Byte Array Pada Arduino

uqifumi.wordpress.com

Pada kebutuhan tertentu, hal ini mungkin sangat penting. Yakni bagaimana cara membagi data yang tersimpan pada sebuah array. Maksud dari membagi ini bukan membagi secara operasi matematika, melainkan memisahkan beberapa elemen array yang satu dengan yang lain.

Misal contoh kita memiliki array {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}. Kemudian karena alasan atau keperluan khusus, kita perlu untuk memisahkan array tersebut menjadi {1, 2, 3, 4, 5} dan {6, 7, 8, 9, 0}. Atau dengan kata lain kita ingin membelah sebuah array menjadi dua bagian atau lebih.

Caranya sangat mudah. Kalian tinggal buat program seperti di bawah ini, di Arduino IDE kalian:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
uint8_t arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
uint8_t arr1[5]; // sebagai penampung 5 elemen array pertama
uint8_t arr2[5]; // sebagai penampung 5 elemen array terakhir
uint8_t k1 = 0;
uint8_t k2 = 0;
int i = 0;

void setup() {
  Serial.begin(57600);
  for(int i = 0; i < 10; i++) {
    if(i < 5) {
      arr1[k1++] = arr[i];
    }
    else {
      arr2[k2++] = arr[i];
    }
  }
  Serial.print(arr1);
}

void loop() {
  
}

Penjelasan

Secara garis besar cara kerja dari program di atas adalah dengan memasukkan beberapa elemen atau isi array kedalam variabel array pertama, dan sisanya dimasukkan ke dalam array kedua.

Detilnya, baris pertama adalah array yang ingin kita pisah/bagi/pecah/split/apapun sesuaikan dengan bahasa kalian. Kemudian di baris kedua dan ketiga berurutan adalah array baru untuk menampung beberapa elemen array dari baris pertama yang kita pisah. Jumlah elemen tergantung angka yang kita tulis di dalam tanda kurung siku di atas. 

Baris keempat, kelima, dan keenam sebagai variabel bernilai 0 yang nantinya digunakan sebagai nomor urut perulangan/looping pada baris di bawahnya.

1
2
3
4
5
6
uint8_t arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
uint8_t arr1[5]; // sebagai penampung 5 elemen array pertama
uint8_t arr2[5]; // sebagai penampung 5 elemen array terakhir
uint8_t k1 = 0;
uint8_t k2 = 0;
int i = 0;

Dimulai dari baris ke 10, maksudnya adalah jika i = 0, dan jika i kurang dari 10, yang mana angka 10 disitu disesuaikan dengan panjang array yang kita punya, maka jalankan perintah/baris program selanjutnya.

1
for(int i = 0; i < 10; i++) {

Baris ke-11, jika variabel i di atas masih berangka 0, atau disini masih kurang dari 5, maka jalankan baris program di bawah yaitu baris ke-12. Dimana, baris ke-12 adalah memasukkan nilai/elemen arr[0] kedalam arr1[0]. Darimana bisa disebut arr1[0]? Sesuai variabel yang sudah dideklarasikan nilainya  di awal bahwa nilai k adalah 0. Dan arr[0] sesuai dengan deklarasi pada fungsi for di awal bahwa i adalah 0. Singkatnya kita mengisi elemen array arr1[] index ke-0 dengan nilai dari arr[] index ke-0 juga. Perulangan terus berlanjut hingga fungsi if memenuhi kriteria, yaitu i = 4.

1
2
3
if(i < 5) {
   arr1[k1++] = arr[i];
}

Jika fungsi if sudah memenuhi kriteria alias variabel i = 4, maka perulangan dari fungsi for selanjutnya ditangani oleh fungsi else pada baris ke-14, dan tugas dilaksanakan baris ke-15. Yakni dimana i = 5. Cara kerjanya tetap sama. Yaitu index ke-0 pada array arr2[] akan diisikan oleh elemen array arr[] dari index ke-5. Dan terus berlanjut hingga perulangan di fungsi for habis, atau i = 9.

1
2
3
else {
   arr2[k2++] = arr[i];
}

Hasil

Perhatikan pada baris ke-18, kita bisa tampilkan isi arr1[] melaui serial monitor Arduino. Jika kita ingin menampilkan isi array kedua atau arr2[], kita tinggal ganti saja variabel array yang tertulis di program dengan mengetikkan arr2[]. Maka serial monitor akan menampilkan isi daripada arr2[] tersebut.

Permasalahan

1. Mengapa i hanya sampai 9? Atau pada fungsi if, variabel i hanya sampai 4? Itu karena kita tidak menuliskannya seperti i <= 5 atau i <= 10, yang artinya i kurang dari atau sama dengan 5, demikian juga selanjutnya i kurang dari atau sama dengan 10. Jika di program kita tulis demikian, maka akan terjadi overlap. Karena index array bukan dihitung dari 1, melainkan dari 0 (simak gambar paling atas).

Artinya array yang kita buat di awal yaitu {1, 2, 3, 4, 5, 6, 7, 8, 9, 0} dihitung dengan index 0 hingga 9.

2. Bisakah kita memindahkan seluruh kode program dari baris ke-10 hingga baris ke-18 ke dalam fungsi void loop() di bawah? Jawabannya bisa. Namun perlu diingat, ada beberapa tipe board Arduino yang tidak mengizinkan cara tersebut. Kita ambil contoh ESP32, jika kita hanya memindahkan baris tersebut ke dalam fungsi void loop(), maka ESP32 akan terjadi bootloop.


Lalu bagaimana cara mengatasinya? Kita pindahkan juga kode program dari bari ke-2 sampai baris ke-6 ke dalam fungsi void loop(). Maka masalah bootloop di ESP32 teratasi.

Selesai artikel hari ini, jika ada pertanyaan, kritik, atau saran, tulis di kolom komentar di bawah yaa.

Posting Komentar

0 Komentar