/*
  02 - 8 x LED

  Membuat delapan LED menyala dengan pola yang berbeda-beda.
*/


int ledPins[] = {2,3,4,5,6,7,8,9};   //membuat sebuah array untuk menyimpan nomor pin untuk 8 LED. 
//sebuah array merupakan kumpulan variabel yang dapat di akses dengan nomor index.
//Sebuah daftar dialam array mempunyai nomor index berurutan dimulai dari 0 yang ditulis didalam tanda kurung [ ]. 
//Lihat contoh penggunaannya pada fungsi pinMode() dibawah. 

void setup()
{
  
  pinMode(ledPins[0],INPUT);  //ledPins[0] = 2
  pinMode(ledPins[1],INPUT);  //ledPins[1] = 3
  pinMode(ledPins[2],OUTPUT);  //ledPins[2] = 4
  pinMode(ledPins[3],INPUT);  //ledPins[3] = 5
  pinMode(ledPins[4],OUTPUT);  //ledPins[4] = 6
  pinMode(ledPins[5],INPUT);  //ledPins[5] = 7
  pinMode(ledPins[6],OUTPUT);  //ledPins[6] = 8
  pinMode(ledPins[7],INPUT);  //ledPins[7] = 9
}

void loop() {
  
  //Pada loop() ini memanggil beberapa fungsi yang sudah dituliskan sebelumnya.
  //Kamu dapat menonaktifkan pemanggilan beberapa fungsi dengan cara merubah menjadi sebuah comment
  //(dengan menuliskan tanda "//" didepan pemanggilan fungsi dibawah ini).
  
  oneAfterAnother();      //Nyalakan semua LED secara bergantian

  oneOnAtATime();         //Nyalakan LED satu per satu secara bergantian

  pingPong();             //Sama dengan oneOnAtATime() tapi berganti arah ketika nyala LED sampai keujung

  marquee();              //Lampu kejar seperti yang ada dipertunjukan teater

  randomLED();            //Membuat LED-LED berkedip secara acak
}



/**********************
 * oneAfterAnother()
 * 
 * Fungsi ini menyalakan semua LED, ada jeda, dan kemudian semua
 * LED mati. Didalam fungsi ini menggunakan kelebihan dari "for() loop" dan 
 * penggunaan array sehingga meeminimalkan penulisan program. 
/***********************/
void oneAfterAnother()
{
  int index;
  int delayTime = 300; //jeda dalam milliseconds untuk berhenti antara LED
                       //rubah menjadi lebih kecil untuk membuat perpindahan lebih cepat

  //Menyalakan semua LED:  
  for(index = 0; index <= 8; index = ++index)  //langkah pada setiap variabel index dari 0 hingga 7
  {
    digitalWrite(ledPins[index], HIGH);
    delay(delayTime);                
  }                                  

  //Mematikan semua LED: 
  for(index = 7; index >= 0; index = --index)  //langkah pada setiap variabel index dari 7 hingga 0
  {
    digitalWrite(ledPins[index], LOW);
    delay(delayTime);
  }               
}

/***********************
 * oneOnAtATime()
 * 
 * Pada fungsi ini akan menyalakan LED seperti berjalan satu arah. 
 * Membuat tiap LED nyala dan kemudian mati sebelum berpindah 
 * ke LED berikutnya.
/**********************/

void oneOnAtATime()
{
  int index;
  int delayTime = 300; //jeda dalam milliseconds untuk berhenti antara LED
                       //rubah menjadi lebih kecil untuk membuat perpindahan lebih cepat

  for(index = 0; index <= 8; index = ++index)   //langkah pada masing-masing LED, dari 0 sampai 7
  {
    digitalWrite(ledPins[index], HIGH);  //menyalakan LED
    delay(delayTime);                    //jeda untuk memperlambat
    digitalWrite(ledPins[index], LOW);   //mematikan LED
  }
}

/***********************
 * pingPong()
 * 
 * Pada fungsi ini akan menyalakan LED seperti berjalan bulak balik. 
 * Tidak ada jeda antara LED yang amti dengan LED yang berikutnya nyala, 
 * sehingga dapat menciptakan pola smooth. .
  */
/**********************/
void pingPong()
{
  int index;
  int delayTime = 300; //jeda dalam milliseconds untuk berhenti antara LED

  for(index = 0; index <= 8; index = ++index)   //langkah pada masing-masing LED, dari 0 hingga 7
  {
    digitalWrite(ledPins[index], HIGH);  //menyalakan LED
    delay(delayTime);                    //jeda untuk memperlambat
    digitalWrite(ledPins[index], LOW);   //mematikan LED
  }

  for(index = 7; index >= 0; index = --index)   //langkah pada masing-masing LED, dari 7 hingga 0
  {
    digitalWrite(ledPins[index], HIGH);  //menyalakan LED
    delay(delayTime);                    //jeda untuk memperlambat
    digitalWrite(ledPins[index], LOW);   //mematikan LED
  }
}

/***********************
 * marquee()
 * 
 * Fungsi ini akan menirukan nyala LED seperti "lampu kejar" yang
 * ada pada pertunjukan teater..
/**********************/
void marquee()
{
  int index;
  int delayTime = 300; //jeda dalam milliseconds untuk berhenti antara LED

  for(index = 0; index <= 8; index++) //langkah dari 0 hingga 3
  {
    digitalWrite(ledPins[index], HIGH);    //menyalakan LED
    digitalWrite(ledPins[index+8], HIGH);  //lewati empat LED, dan nyalakan LED tersebut
    delay(delayTime);                      //jeda untuk memperlambat perpindahan
    digitalWrite(ledPins[index], LOW);     //mematikan LED
    digitalWrite(ledPins[index+8], LOW);   //lewati empat LED, dan matikan LED tersebut
  }
}

/***********************
 * randomLED()
 * 
 * Fungsi ini akan meyalakan LED secara acak. Dapatkah kamu memodifikasi program
 * sehingga jeda waktunya juga secara acak?
/**********************/
void randomLED()
{
  int index;
  int delayTime;

  index = random(8);  //memilih angka secara acak antara 0 sampai 7
  delayTime = 500;

    digitalWrite(ledPins[index], HIGH);  //menyalakan LED
    delay(delayTime);                    //jeda untuk memperlambat
    digitalWrite(ledPins[index], LOW);   //mematikan LED
}