Selasa, 16 Mei 2017

[Simulasi Arduino] Membuat Variasi Running Led dengan Interrupt

   Disini saya akan membagi sedikit pengalaman tentang projek dari siswa saya, membuat sebuah Running LED namun bervariasi. Maksudnya bervariasi disini, Running LED bukan hanya hidup mati dari kanan ke kiri, tapi juga dari kiri ke kanan, atau dari tengah ke kanan-kiri, dst. Pertama-pertama siapkan dulu bahan-bahanya.
  1. Arduino UNO R3
  2. LED Strawhat 8 Pcs (Warna Apapun)
  3. Resistor 220 Ohm
  4. Resistor 10k
  5. Push Button
Prinsip kerjanya sederhana, ketika push button ditekan maka variasi Running LED akan berubah yang tadinya dari kanan ke kiri menjadi kiri ke kanan. Disini saya akan membuat 3 variasi, kanan ke kiri, kiri ke kanan dan, tengah ke kanan-kiri.

Lanjut ke pembuatan rangkaian menggunakan software Protheus.
Terdapat 8 LED yang disusun sejajar dengan resistor 220 Ohm pada setiap LEDnya. Resistor ini berfungsi untuk membagi tegangan dari output Arduino sebesar 5V. Sehingga tidak membuat LEDnya rusak. Sedangkan Resistor 10k berfungsi sebagai pull down, sehingga tegangan yang diterima pin 2 benar-benar dalam kondisi 0V ketika push button belum ditekan.

Rangkaian sudah, kini saatnya membuat program. Pada program Running LED bervariasi ini, saya menggunakan fungsi attachInterrupt(), kenapa harus pake interrupt? Sederhana, karena program yang saya buat menggunakan fungsi delay(). Ketika fungsi delay() bekerja, semua sub-program tidak akan yang bekerja sampai fungsi delay() selesai, namun ketika Arduino mendapatkan input interrupt pada salah satu pinnya. Arduino akan langsung memberhentikan fungsi delay()  dan mengeksekusi fungsi interrupt yang telah dibuat. Untuk lebih jelasnya terkait fungsi attachInterrupt(), teman-teman bisa mengunjungi situs iniPenjelasan attachInterrupt()


/* 
 *  Running led menggunakan fungsi interrupt
 */

 int ledPin[]= {3,4,5,6,7,8,9,10};
 int keadaanVariasi = 0;
 int delayLed = 50; //Ubah nilainya jika terlalu kecepetan

 void setup()
 {
  for (int i=0; i<8; i++)
  {
    pinMode(ledPin[i], OUTPUT);
  }
  attachInterrupt(digitalPinToInterrupt(2), variasi, RISING);
 }

 void loop()
 {
  switch(keadaanVariasi)
  {
    case 0:
    kananKiri();
    break;

    
    case 1:
    kiriKanan();
    break;

    
    case 2:
    tengahKananKiri();
    break;

    default:
    break;
  }
 }

 void variasi()
 {
  delay(100); 
  keadaanVariasi++;
  Serial.print("keadaanVariasi=");
  Serial.println(keadaanVariasi);
  if(keadaanVariasi>2) keadaanVariasi =0;
 }

 void kananKiri()
 {
  for (int i=0; i<8; i++)
  {
    digitalWrite(ledPin[i], HIGH);
    delay(delayLed);
    digitalWrite(ledPin[i], LOW);
    delay(delayLed);
    if(keadaanVariasi != 0) break;
  }
 }

 void kiriKanan()
 {
  for (int i=7; i>-1; i--)
  {
    digitalWrite(ledPin[i], HIGH);
    delay(delayLed);
    digitalWrite(ledPin[i], LOW);
    delay(delayLed);
    if(keadaanVariasi != 1) break;
  }
 }

 void tengahKananKiri()
 {
  int angkaGanjil = 1;
  for (int i=3; i>-1; i--)
  {
    digitalWrite(ledPin[i], HIGH);
    digitalWrite(ledPin[i+angkaGanjil],HIGH);
    delay(delayLed);
    digitalWrite(ledPin[i], LOW);
    digitalWrite(ledPin[i+angkaGanjil],LOW);
    delay(delayLed);
    angkaGanjil += 2;
    if(keadaanVariasi != 2) break;
  }
 }


Perhatian, jika delay hidup-mati antara LED terlalu cepat, ubah nilai pada variabel delayLed
Jika teman-teman gak ingin ribet buat rangkaiannya dan copy paste source codenya, download aja.
Download File Protheus
Download File Arduino

Terima kasih, semoga bermanfaat...

4 komentar: