Game Simon Says
Game "Simon Says" adalah sebuah permainan menggunakan empat buah LED yang akan nyala berkedip bergantian membentuk pola tertentu, dimana pemain harus mengingat pola nyala LED tersebut dan mengulanginya dengan menekan push button mengikuti pola nyala LED. Ini merupakan game elektronik klasik sejak akhir tahun 1970an, dan sekarang kamu bisa membuatnya sendiri.
Kebutuhan Komponen:
— 1 x Arduino UNO
— 1 x Breadboard
— 4 x LED
— 4 x Push Button
— 1 x Buzzer
— 1 x Resistor 330Ω
— 15 x Kabel Jumper
Perakitan:
Rangkaian:
Upload Sketch:
Untuk mengisikan program ke board Arduino melalui PC/Laptop dapat menggunakan software Arduino IDE.
Apabila kamu tidak mau menggunakan PC/Laptop untuk mengupload sketch/program ke board Arduino, kamu masih bisa menggunakan handphone Android untuk mengisikan program ke Arduino menggunakan aplikasi
Bluino Loader, cara uploadnya pun bisa dua cara melalui USB dengan menggunakan adapter OTG atau melalui
Bluetooth.
Cara lain dapat juga upload sketch langsung melalui aplikasi ini ke Arduino melalui USB OTG atau Bluetooth dengan cara menekan ikon upload (tanda panah ke kanan) di bawah.
/*
18 - Game Simon Says
LED akan berkedip dengan dengan pola dan urutan tertentu, kemudian kita menekan push button
dengan cara mengikuti pola dan urutan led tersebut.
*/
//set pin yang digunakan untuk menghubungkan dengan push button, LED dan buzzer
int button[] = {2,4,6,8}; //push button merah adalah button[0], hijau adalah button[1], biru adalah button[2], kuning adalah button[3]
int led[] = {3,5,7,9}; //LED merah adalah led[0], hijau adalah led[1], biru adalah led[2], kuning adalah led[3]
int tones[] = {262, 330, 392, 494}; //nada-nada yang digunakan untuk tiap push button (c, e, g, b)
int roundsToWin = 10; //jumlah ronde yang harus dimainkan sebelum memenangkan permainan
int buttonSequence[16]; //membuat array yang akan menjadi urutan yang perlu diingat oleh pemain
int buzzerPin = 10; //pin yang terhubung dengan buzzer
int pressedButton = 4; //variabel untuk mengingat push button mana yang ditekan. 4 adalah nilai jika tidak ada push button yang ditekan.
int roundCounter = 1; //melacak apa yang sedang dimainkan pemain
long startTime = 0; //variabel pengatur waktu untuk batas waktu saat push button ditekan
long timeLimit = 2000; //batas waktu untuk menekan push button
boolean gameStarted = false; //variabel untuk memberitahu game apakah memainkan atau tidak
void setup(){
//mengatur semua pin untuk push button sehingga input_pullup (digunakan sehingga tidak perlu memakai eksternal resistor)
pinMode(button[0], INPUT_PULLUP);
pinMode(button[1], INPUT_PULLUP);
pinMode(button[2], INPUT_PULLUP);
pinMode(button[3], INPUT_PULLUP);
//mengatur semua pin LED sebagai output
pinMode(led[0], OUTPUT);
pinMode(led[1], OUTPUT);
pinMode(led[2], OUTPUT);
pinMode(led[3], OUTPUT);
pinMode(buzzerPin, OUTPUT); //mengatur pin buzzer sebagai output
}
void loop(){
if (gameStarted == false){ //jika game belum dimulai
startSequence(); //jalankan SQUENCE AWAL
roundCounter = 0; //reset penghitung ronde
delay(1500); //jeda 1,5 detik
gameStarted = true; //atur gameStarted ke kondisi true sehingga urutan ini tidak dimuat kembali
}
//setiap ronde, akan dimualai dengan start kedipan urutan LED dan diulang
for(int i=0; i <= roundCounter; i++){ //go through the array up to the current round number
flashLED(buttonSequence[i]); //nyalakan LED untuk posisi array yang sesuai dan mainkan lagu
delay(200); //tunggu
allLEDoff(); //matikan semua LED
delay(200);
}
//kemudian mulai dengan urutan satu persatu dan memeriksa jika pemain menekan push button yang benar
for(int i=0; i <= roundCounter; i++){ //untuk setiap push button yang akan ditekan dalam sequence
startTime = millis(); //catat waktu awal mulai
while(true){ //terus jalankan loop sampai pemain menekan push button atau batas waktu habis (batas waktu bisa cek didalam statement if)
pressedButton = buttonCheck(); //setiap loop memeriksa push button mana yang ditekan
if (pressedButton < 4){ //jika sebuah push button ditekan... (angka 4 maksudnya adalah tidak ada push button yang ditekan)
flashLED(pressedButton); //kedip/flash LED untuk push button yang sudah ditekan
if(pressedButton == buttonSequence[i]){ //if the button matches the button in the sequence
delay(250); //biarkan LED menyalauntuk sesaat
allLEDoff(); //kemudian matikan semua LED dan
break; //akhiri loop while (ini akan membuat melanjutkan ke nomor selanjutnya didalam loop for)
} else{ //jika push button yang ditekan tidak sama dengan dengan urutan nyala LED
loseSequence(); //jalankan SEQUENCE KALAH
break; //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali
}
} else { //jika tidak ada push button yang ditekan
allLEDoff(); //tmatikan semua LED
}
//memeriksa apakah waktu sudah habis
if(millis() - startTime > timeLimit){ //jika batas waktu habis
loseSequence(); //jalankan SEQUENCE KALAH
break; //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali
}
}
}
roundCounter = roundCounter + 1; //tambahkan jumlah ronde dengan 1
if (roundCounter >= roundsToWin){ //jika pemain menyelesaikan ke 16 ronde
winSequence(); //mainkan lagu kemenangan
}
delay(500); //tunggu 0.5 detik antara setiap ronde
}
//----------FUNCTIONS------------
//KEDIPKAN LED DAN BUNYIKAN BUZZER
void flashLED (int ledNumber){
digitalWrite(led[ledNumber], HIGH);
tone(buzzerPin, tones[ledNumber]);
}
//MATIKAN SEMUA LED
void allLEDoff (){
//matikan semua LED
digitalWrite(led[0],LOW);
digitalWrite(led[1],LOW);
digitalWrite(led[2],LOW);
digitalWrite(led[3],LOW);
//matikan suara buzzer
noTone(buzzerPin);
}
//PERIKSA push button YANG DITEKAN
int buttonCheck(){
//periksa jika ada push button yang ditekan
if(digitalRead(button[0]) == LOW){
return 0;
}else if(digitalRead(button[1]) == LOW){
return 1;
}else if(digitalRead(button[2]) == LOW){
return 2;
}else if(digitalRead(button[3]) == LOW){
return 3;
}else{
return 4; //ini akan menjadi nilai untuk tidak ada push button yang ditekan
}
}
//SEQUENCE AWAL
void startSequence(){
randomSeed(analogRead(A0)); //membuat nomor acak benar-benar acak
//mengisi array buttonSequence dengan angka acak dari 0 hingga 3
for (int i=0;i<=roundsToWin;i++){
buttonSequence[i] = round(random(0,4));
}
//kedip/flash semua LED ketika game dimulai
for(int i=0; i<=3; i++){
tone(buzzerPin, tones[i], 200); //memainkan salah satu dari 4 nada
//turn all of the leds on
digitalWrite(led[0],HIGH);
digitalWrite(led[1],HIGH);
digitalWrite(led[2],HIGH);
digitalWrite(led[3],HIGH);
delay(100); //tunggu sesaat
//turn all of the leds off
digitalWrite(led[0],LOW);
digitalWrite(led[1],LOW);
digitalWrite(led[2],LOW);
digitalWrite(led[3],LOW);
delay(100); //tunggu sesaat
} //ini akan diulang sebanyak 4 kali
}
//SEQUENCE MENANG
void winSequence(){
//nyalakan semua LED
for(int j=0; j<=3; j++){
digitalWrite(led[j], HIGH);
}
//mainkan lagu 1Up
tone(buzzerPin, 1318, 150); //E6
delay(175);
tone(buzzerPin, 1567, 150); //G6
delay(175);
tone(buzzerPin, 2637, 150); //E7
delay(175);
tone(buzzerPin, 2093, 150); //C7
delay(175);
tone(buzzerPin, 2349, 150); //D7
delay(175);
tone(buzzerPin, 3135, 500); //G7
delay(500);
//tunggu sampai sebuah push button ditekan
do {
pressedButton = buttonCheck();
} while(pressedButton > 3);
delay(100);
gameStarted = false; //reset game sehingga sequence awal dimainkan kembali.
}
//SEQUENCE KALAH
void loseSequence(){
//turn all the LEDs on
for(int j=0; j<=3; j++){
digitalWrite(led[j], HIGH);
}
//play the 1Up noise
tone(buzzerPin, 130, 250); //E6
delay(275);
tone(buzzerPin, 73, 250); //G6
delay(275);
tone(buzzerPin, 65, 150); //E7
delay(175);
tone(buzzerPin, 98, 500); //C7
delay(500);
//tunggu sampai sebuah push button ditekan
do {
pressedButton = buttonCheck();
} while(pressedButton > 3);
delay(200);
gameStarted = false; //reset game sehingga sequence awal dimainkan kembali.
}
Cara menggunakan:
Sebagai pembukaan ketika Arduino dinyalakan ke empat LED menyala berkedip kemudian memainkan melodi pendek menandakan game akan dimulai. Kemudian setelah beberapa detik LED pertama akan berkedip dan kamu harus mengikutinya dengan menekan push button posisi yang sama, setelah itu LED kesatu dan kedua akan berkedip berurutan dan kamu harus mengikutinya dengan menekan push button posisi yang sama, dan seterusnya begitu akan bertambah nyala LED yang berkedip dengan pola urutan yang berbeda-beda dan kamu harus mengikutinya dengan menekan push button yang sama pula sampai babak berikutnya. Jika kamu membuat kesalahan maka melodi kekalahan akan dimainkan oleh buzzer. Jika kamu dapat menyelesaikan hingga ronde 10, kamu memenangkan permainan dan melodi kemenangan akan dimainkan oleh buzzer. Setelah itu tekan push button sembarang untuk megulang permainan baru.