Sabtu, 25 September 2021

Logika Nyeleneh untuk Multitasking di Arduino

Pada dasarnya lebih mudah menggunakan fungsi delay, untuk jeda waktu di arduino, tapi ada kekurangan tidak bisa mengerjakan secara bersamaan, hanya bergantian satu demi satu (tidak bisa bercabang). Disini saya akan menjelaskan jeda waktu diarduino dengan millis, dengan logika yang agak nyleneh, tapi tidak asal-asalan yah. Logika nyenehc digunakan karena mungkin banyak orang yang bingung mengunakan fungsi millis menggunakan logika biasa. Logika ini juga saya sering gunakan supaya pembuatan sketsa kompleks menjadi lebih mudah. Jika logika saya membuat anda tambah bingung jangan gunakan logika ini.


Gambar no. 1

Oke saya berikan contoh sketsa sangat sederhana. Salin dan upload sketsanya, lalu lihat kedipan lampu yang ada di papan Arduino anda yang berlabel L (seperti gambar diatas), jadi tidak usah pasang rangkaian elektronik tambahan.

Contoh sketsa satu

SKETSA

//lampu sudah terpasang di arduino
int pinLed=13;

boolean nyala=true;
int jeda=500;
unsigned long penyesuaian=0;

 void setup(){
pinMode (pinLed,OUTPUT);
digitalWrite(pinLed,LOW);
}//Akhir void setup()

void loop(){
  if ((millis()- penyesuaian)>=jeda){//tanggul
	penyesuaian=millis();//menaikkan tanggul
	if(nyala==true){
		digitalWrite(pinLed,HIGH);
		nyala=!nyala;}
	else{//jika nyala tidak sama dengan true
		digitalWrite(pinLed,LOW);
		nyala=!nyala;}
  }//Akhir if((millis()...
}//Akhir void loop()


tulis seketsa diatas diruang lingkup void loop supaya berkali-kali diperiksaatau dieksekusi, pemeriksaan atau eksekusi sketsa biasanya dari atas kebawah, dan bisa bercabang (multitasking), walaupun sebenarnya dikerjakan satu per satu secara bergantian.

Dari contoh sketsa diatas dapat suatu logika

1.Air banjir

Fungsi millis itu nilainya naik terus saat arduino dinyalakan, dari 0 dan terus naik dalam mili detik, diibaratkan air banjir yang naik terus level ketinggiannya, memang sketsa diatas tidak ada yang sketsa millis itu naik terus, bisa dibilang otomatis ada dengan sendirinya, walaupun tidak ditulis

2.Menaikkan tanggul

penyesuaian=millis();

Itu diibaratkan perintah meninggikan tanggul, sehingga ada jeda. Karena nilai pernyesuaian sama nilainya dengan ketinggian air banjir(millis()) pada saat perintah itu di kerjakan. Nilai millis saat perintah itu dikerjakan bisa variatif nilainya bisa 2000,3000,4500,dst

3. Tanggul

if ((millis()-penyesuaian)>=jeda))

Itu diibaratkan sebuah tanggul penahan banjir yang bisa di tinggikan atau dimanipulasi, jika tinggi air banjir (millis()) melebihi tanggul, tanggul akan meluap, atau dalam pengertian pemrogram sesungguhnya itu berarti bernilai benar, lalu mengeksekusi perintah bawahnya. Eksekusi program sampai ruang lingkup if (millis ini berakhir. Nanti balik lagi dari awal diperiksa meluap atau tidak tanggul ini, jika tidak ada kenaikan tanggul (penyesuaian=millis()) maka akan perintah dibawah dieksekusi terus, seperti tidak ada jeda (tanggul meluap terus).

Penjelasannya logikanya

if ( (millis() - penyesuaian) >=jeda)

(if)jika ketinggian air banjir (millis()) dikurangi penyesuaian hasilnya lebih dkecil sama dengan tambahan ketinggian tanggul (jeda), maka jika benar, eksekusi atau periksa perintah dibawahnya, jika tidak benar cuma periksa lagi saja.

Sketsa (nyala=!nyala;) fungsinya untuk membalikakn isi variabel nyala, jika variabel nyala pada saat itu true, maka isinya menjadi false, jika variabel nyala pada saat itu false, maka isinya menjadi true, ya mirip fungsinya seperti saklar on/off. Sketsa diatas contoh hanya satu cabang menggunakan fungsi millis, belum bisa dikatakan multi tasking, bila ingin menambahkan tugas multitasking lihat contoh dibawah ini, ada dua cabang dan dua tanggul.

Contoh sketsa 2

SKETSA

// pin untuk lampu LED
int pinLed1=2;
int pinLed2=3;

boolean nyala1=true;
boolean nyala2=true;

int jeda1=500;
int jeda2=1200;

unsigned long penyesuaian1=0;
unsigned long penyesuaian2=0;

 void setup(){
pinMode (pinLed1,OUTPUT);
pinMode (pinLed2,OUTPUT);
digitalWrite(pinLed1,LOW);
digitalWrite(pinLed2,LOW);
}//Akhir void setup()

void loop(){
//cabang satu==============================
 if ((millis()- penyesuaian1)>=jeda1){//tanggul 1
	penyesuaian1=millis();//menaikkan tanggul 1
	if(nyala1==true){
		digitalWrite(pinLed1,HIGH);
		nyala1=!nyala1;}
	else{//jikia nyala tidak sama dengan true
		digitalWrite(pinLed1,LOW);
		nyala1=!nyala1;}
 }//Akhir if((millis()...
//cabang dua==========================
 if ((millis()- penyesuaian2)>=jeda2){//tanggul 2
	penyesuaian2=millis();//menaikkan tanggul 2
	if(nyala2==true){
		digitalWrite(pinLed2,HIGH);
		nyala2=!nyala2;}
	else{//jikia nyala tidak sama dengan true
		digitalWrite(pinLed2,LOW);
		nyala2=!nyala2;}
 }//Akhir if((millis()...
}//Akhir void loop()

Bahan rangkaian yang dibuat

  • Arduino uno atau Arduino Nano 1 buah
  • Resistor 1k ohm 2 buah
  • Lampu LED 2 buah
  • Breadboard 1 buah
  • Kabel jumper atau kabel yang kaku secukupnya

Gambar no. 2

Multi tasking pun kadang tidak membutuhkan jeda pada setiap cabang, jadi bisa di campur antara perintah yang ada jeda dengan yang tidak ada jeda. Tidak ada jeda bisa berarti dilaksanakan terus menerus atau periksa dulu jika benar eksekusi, dibawah ini contoh dari pengembangan sketsa diatas, rangkaian tetap sama seperti gambar nomor 1, pastikan komputer tetap terhubung di Arduino saat selesai upload, supaya komputer bisa kirim data.

Contoh sketsa 3

SKETSA

// pin untuk lampu LED
int pinLed1=2;
int pinLed2=3;

boolean nyala1=true;
boolean nyala2=true;

int data=0;

int jeda1=500;
int jeda2=1200;

unsigned long penyesuaian1=0;
unsigned long penyesuaian2=0;

 void setup(){
Serial.begin(9600);//baudrate
pinMode (pinLed1,OUTPUT);
pinMode (pinLed2,OUTPUT);
digitalWrite(pinLed1,LOW);
digitalWrite(pinLed2,LOW);
}//Akhir void setup()

void loop(){
//cabang satu tanpa jeda=============
 if(Serial.available()>=0){
  data=Serial.read();
  switch(data){
    case '1':
	jeda1=100;
	break;
    case '2':
	jeda1=700;
	break;
    case '3':
	jeda2=2000;
	break;
    case '4':
	jeda2=1200;
	break;
    default:
	break;
  }
}
//cabang dua==============================
 if ((millis()- penyesuaian1)>=jeda1){//tanggul 1
	penyesuaian1=millis();//menaikkan tanggul 1
	if(nyala1==true){
		digitalWrite(pinLed1,HIGH);
		nyala1=!nyala1;}
	else{//jikia nyala tidak sama dengan true
		digitalWrite(pinLed1,LOW);
		nyala1=!nyala1;}
 }//Akhir if((millis()...

//cabang tiga==========================
 if ((millis()- penyesuaian2)>=jeda2){//tanggul 2
	penyesuaian2=millis();//menaikkan tanggul 2
	if(nyala2==true){
		digitalWrite(pinLed2,HIGH);
		nyala2=!nyala2;}
	else{//jikia nyala tidak sama dengan true
		digitalWrite(pinLed2,LOW);
		nyala2=!nyala2;}
 }//Akhir if((millis()...
}//Akhir void loop()


coba kirim melalui serial monitor Arduino angka 1 angka2, angka 3 atau angka 4, itu akan mempengaruhi jeda kedua lampu LED. Jika tidak respon Arduinonya pastikan baud rate serial monitornya 9600. 


Gambar no. 3

Silakan kembangkan lagi, umpamanya cabang kedua itu untuk menggerakkan motor servo, motor stepper, mengirim keterangan di lcd 16x2, dan seterusnya.

Okey jika penjelasan saya membinggungkan tidak usah dipakai, pakai penjelasan yang umum saja, karena dalam memahami bahasa pemrograman di butuhkan pikiran yang tenang dan ceria, supaya mudah paham. Sekian dari saya bila ada salah bisa dikoreksi di kolom komentar.