Selasa, 01 Maret 2016

[Belajar Arduino] Multitasking di Arduino dengan menggunakan fungsi millis()

    
Pernahkah kalian berpikir, mengapa komputer dapat melakukan pekerjaan dalam waktu yang sama. Contohnya, ketika kalian membuka M*icrosoft Word untuk mengetik suatu berkas, kalian juga dapat memutar lagu, dan itu semua dilakukan pada waktu yang sama.
    Padahal, seharusnya komputer bekerja secara sistematis dan runtut, artinya jika suatu proses belum tereksekusi maka proses selanjutnya tidak dapat tereksekusi. Ayo, diinget lagi pelajaran algoritma dan pemrogramannya.
    Sebenarnya, multitasking bukan berarti komputer mengeksekusi beberapa proses pada waktu yang bersamaan akan  tetapi mengeksekusinya dengan periode yang super singkat, mikro sekon sampai dengan milli sekon. Wow, great! Gue kasih contoh ya, semisal ada dua program yang dijalankan bersamaan, hmmm.... semisal Winamp untuk memutar lagu sama Mozilla firefox untuk internetan. Saat ini komputer sedang multitasking, nah, sebenarnya komputer mengeksekusi proses yang ada di winamp dan proses yang ada di mozilla secara bergantian. Dan itu semua di-JADWALKAN, maksudnya pas di 1 millisekon proses yang ada di mozilla dieksekusi, kemudian pas di 2 millisekon proses winamp baru dieksekusi, dan begitu seterusnya. Nah, karena otak manusia gak mampu berpikir cepat, makanya kita berpikir bahwa seolah-olah dua program tersebut bekerja bersamaan. Bayangkan satu milli sekon, itu sama dengan 1/1000 sekon.

Nah, pada topik kali ini kita akan belajar untuk membuat Arduino layaknya sebuah komputer yang akan bekerja secara multitasking. Program yang gue buat adalah running led, jika sebelumnya gue udah buat program running LED pada Membuat running LED menggunakan Arduino [Simulation & Syntax] menggunakan delay. Sekarang gue kembangin lagi menjadi tanpa delay! dan gue gunain millis, lho kenapa pake millis, emang kenapa dengan delay?
Okay, jadi gini. Delay itu adalah sebuah sub-routine yang tugasnya membuat sibuk prosesor dalam jangka waktu yang telah ditentukan, jadi ketika lu pake fungsi delay(2000) arduino akan sibuk selama dua detik. Ketika hal ini terjadi, arduino gak bisa ngapa-ngapain, seperti menerima input, mengolah angka, dsb. Sub-routine yang lain gak bakal jalan, ketika delay berlangsung.

Kalau lu udah lihat rangkaian running LED yang udah gue buat, disitu terlihat lima LED yang berjejer dengan dua push button yang digunakan untuk mengatur putaran LED. Kalo semisal, gue pake fungsi delay(), ketika gue pencet push button dan si delay() sedang beraksi, arduino gak bakal ngerespon  apapun. Jadinya, gue harus pencet terus sampe tiba saatnya fungsi delay() tersebut berakhir.

Oleh karenanya gue harus pake fungsi millis(), sehingga arduino dapat membuat LED terus  berjalan (running) dan dapat menerima input dari push button, tanpa harus  mencet berkali-kali.


/* Program Running LED
Percobaan 3 Mikrokontroler
*/
                                        // Pengaturan output menggunakan Array
int ledpins[]={2,3,4,5,6};  // Port Output yang digunakan hanya lima dari port 2 ke 5
int i=0;
int val=0;                          // Variabel untuk menyimpan data
int state=0;
int val1=0;
//int val2=0;
int state1=0;
int old_val=0;
int old_val1=0;
int old_val2=0;
unsigned long waktusekarang=0;
unsigned long waktuatur=0;
int ledstate=LOW;
int tunda=10;
void setup()
{                                       // inisialisasi output
  for(int i=0; i<5; i++)        // jika i kurang dari lima maka nilai i ditambah 1
  pinMode(ledpins[i], OUTPUT);
  pinMode(9, INPUT);            // Tombol Kiri ke kanan
  pinMode(8, INPUT);
  pinMode(10,INPUT);            // Tombol Kanan ke kiri
  Serial.begin(9600);
}

void loop()
{
  val=digitalRead(9);      // Membaca tombol dan memasukkannya ke variabel agar interloc
  val1=digitalRead(10);
  val2=digitalRead(8);
 
  if((val==HIGH) &amp;&amp; (old_val==LOW)){      // Jika tombol kiri ke kanan ditekan maka
    waktusekarang=millis();
    state1=0;
    state=1-state;
      // state akan bernilai satu, dan jika state bernilai satu dan tombol ditekan maka state bernilai 0
  delay(10);                              // delay digunakan untuk mencegah bouncing
  }
  old_val=val;                            // old val digunakan untuk mencegah bouncing juga
 
  if((val1==HIGH) &amp;&amp; (old_val1==LOW)){
    waktusekarang=millis();
    state=0;
    state1=1-state1;
  delay(10);
  }
  old_val1=val1;

if((val2==HIGH)&amp;&amp; (old_val2==LOW))
  {waktuatur=millis();
  delay(5);
  }
old_val2=val2;
if ((val2==HIGH)&amp;&amp;(old_val2==HIGH)){
 
if ((val2==HIGH)&amp;&amp;(millis()-waktuatur)&gt;20)
{tunda++;
delayMicroseconds (100);
if (tunda&gt;500){
  tunda=50;
}
}
Serial.println(tunda);
}


if (state==1)
  //(digitalRead(9)==HIGH)
{
 digitalWrite(ledpins[i], HIGH);
 //Serial.println(state);
if ((state==1)&amp;&amp; (millis()-waktusekarang)&gt;=tunda){
  waktusekarang=millis();
  //Serial.println(waktusekarang);
  digitalWrite(ledpins[i],LOW);
  i++;
  while (i==5){i=0;}
  }
}

else if (state1==1){
  //(digitalRead(9)==HIGH)

 digitalWrite(ledpins[i], HIGH);
 //Serial.println(state1);
if ((state1==1)&amp;&amp; (millis()-waktusekarang)&gt;=tunda){
  waktusekarang=millis();
  //Serial.println(waktusekarang);
  digitalWrite(ledpins[i],LOW);
  while(i==0){i=5;}
  i--;
  }
}

 else
{digitalWrite(ledpins[i], LOW);}
}

3 komentar:

  1. Malam kak, infonya sangat bagus namun saya masih sangat bingung dengan cara kerja (teori) milis tersebut. Saya masih belum nangkep, mungkin kakaknya bisa lebih merinci soal qlur kerja dari fungsi milis tersebut baik dari sisi manipulasi clock nya maupun hasil eksekusi sebelum dan sesudah program. Trims.

    BalasHapus
  2. Untuk menaikkan kecepatan delay running ledd

    BalasHapus