ButtonHero


ButtonHero 

by Brendan Ferracciolo and Daniel Mayers

Brief Description

ButtonHero is a game similar to guitar hero. To play you must hit the button the corresponds to the LED that lights up. The game is fully enclosed within a box made from a 3-D printer.

Detailed Description

ButtonHero is composed of four LEDs, four buttons, a screen, an Arduino Duemilanove, many resistors, wires, a 3-D printed box, and a prototyping shield. The program takes advantage of many If statements. All of the components are attached to the prototyping board which is connected to the Arduino. 8 digital pins are used from the Arduino along with the ground and +5 volt pins. The loop uses digitalRead() to look and see if a button has been pressed and stores this in a variable. This then checks to see if the correct button was pressed in which the code either contiunes the loop, adds a point,  or detours to loseHealth() where one point is subtracted from the health and retrieves a new random seed for random(). With every 5-10 correct hits the timeout delay is shortened to make it harder and harder as the game progresses. The video below only shows the beginning due to an attempt at keeping the video fairly short, so it only demonstrates the easy beginning of the game..


Media

YouTube Video




Code

int ledDelay; // LED timeout
int score; // points you get
byte currentLed; // the one that is lit up right now

boolean started; // Are you playing the game?
boolean needNewLed = true; // we need a new LED
byte health = 6; // health remaining
boolean updateScreen=true; // do we need to update the screen?
boolean lostHealth=false; // do we need to subtract one from the health?

int val2,val3,val4,val5;                        // variable for reading the pin status
int buttonState2,buttonState3,buttonState4,buttonState5;                // variable to hold the last button state
boolean pressed;

int screen = 0;

void setup() { 
  // mode the pins
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  // for showing the score
  Serial.begin(9600);
  Serial.print("?G216?c0?S0");
  Serial.print("?D7000A1F1F1F0E0400");

  //Serial.print("?fCreated by?m?kBrendan & Daniel");
  Serial.print("?f   Created by?m?k Doug & Doug2.0");
  delay(1750);

  Serial.print("?f");
  //type("Welcome to?m?kButtonHero!",25);
}

void loop() {
  if (started==false){
    if (health == 0){ 
      val2 = digitalRead(2);      // read input value and store it in val
      val3 = digitalRead(3);      // read input value and store it in val
      val4 = digitalRead(4);      // read input value and store it in val
      val5 = digitalRead(5);      // read input value and store it in val
      if (val2 != buttonState2 && val2 == HIGH || val3 != buttonState3 && val3 == HIGH || val4 != buttonState4 && val4 == HIGH || val5 != buttonState5 && val5 == HIGH) {          // the button state has changed!
        pressed=true;
        started=true;
        health = 6;
        score = 0;
        ledDelay = 0;
        currentLed = 0;
        needNewLed = true;
        updateScreen = true;
        lostHealth = false;
        randomSeed(int(millis));
      }

      buttonState2 = val2;                 // save the new state in our variable
      buttonState3 = val3;                 // save the new state in our variable
      buttonState4 = val4;                 // save the new state in our variable
      buttonState5 = val5;                 // save the new state in our variable
      delay(1);
    }
    else{ 
      Serial.print("?f");

      if(screen==0){
        Serial.print("Welcome to?m?kButtonHero!    v");
        screen++;
      }
      else if(screen==1){
        Serial.print("Welcome to?m?kButtonHero!");
        screen=0;
      }
      else if(screen==2){
        Serial.print("If a LED lights?m?kup, press the  v");
        screen=3;
      }
      else if(screen==3){
        Serial.print("If a LED lights?m?kup, press the");
        screen=2;
      }
      else if(screen==4){
        Serial.print("corrisponding?m?kbutton.        v");
        screen=5;
      }
      else if(screen==5){
        Serial.print("corrisponding?m?kbutton.");
        screen=4;
      }
      else if(screen==6){
       
        Serial.print("You lose lives?m?kby being too   v");
        screen=7;
      }
      else if(screen==7){
        Serial.print("You lose lives?m?kby being too");
        screen=6;
      }
      else if(screen==8){
        Serial.print("slow or pressingthe wrong      v");
        screen=9;
      }
      else if(screen==9){
        Serial.print("slow or pressingthe wrong");
        screen=8;
      }
      else if(screen==10){
        Serial.print("button.?m?k               v");
        screen=11;
      }
      else if(screen==11){
        Serial.print("button.");
        screen=10;
      }
      else if(screen==12){
        Serial.print("Press any buttonto start...");
      }

      for (int i=0; i < 750; i++){
        val2 = digitalRead(2);      // read input value and store it in val
        val3 = digitalRead(3);      // read input value and store it in val
        val4 = digitalRead(4);      // read input value and store it in val
        val5 = digitalRead(5);      // read input value and store it in val
        if (val2 != buttonState2 && val2 == HIGH || val3 != buttonState3 && val3 == HIGH || val4 != buttonState4 && val4 == HIGH || val5 != buttonState5 && val5 == HIGH) {          // the button state has changed!
          if (pressed==false){
            pressed=true;
            if(screen==12){
              screen=13;
              started=true;
              randomSeed(int(millis));
            }
            else if(screen==10||screen==11){
              screen=12;
              Serial.print("?f");
              //type("Press any buttonto start...",27);
            }
            else if(screen==8||screen==9){
              screen=10;
              Serial.print("?f");
              //type("button.",7);
            }
            else if(screen==6||screen==7){
              screen=8;
              Serial.print("?f");
              //type("slow or pressingthe wrong",25);
            }
            else if(screen==4||screen==5){
              screen=6;
              Serial.print("?f");
              //type("You lose lives?m?kby being too",30);
            }
            else if(screen==2||screen==3){
              screen=4;
              Serial.print("?f");
              //type("corrisponding?m?kbutton.",24);
            }
            else if(screen==0||screen==1){
              screen=2;
              Serial.print("?f");
              //type("If a LED lights?m?kup, press the",32);
            }
          }
          //break;
        }
        else{
          pressed=false;
        }

        buttonState2 = val2;                 // save the new state in our variable
        buttonState3 = val3;                 // save the new state in our variable
        buttonState4 = val4;                 // save the new state in our variable
        buttonState5 = val5;                 // save the new state in our variable
        delay(1);
      }
    }
  }
  else if (started==true){
    if (needNewLed ==true){ //we need another LED
      digitalWrite(currentLed, LOW); // turn off the old one
      byte randomLed = random(9,13); // pick a random LED
      while(currentLed == randomLed){ //make sure it's not the same as the last one
        randomLed = random(9,13);
      }
      currentLed = randomLed;
      digitalWrite(currentLed, HIGH); //light up the new LED
      delay(100); //wait a little bit
      needNewLed = false;
    }

    val2 = digitalRead(2);      // read input value and store it in val
    val3 = digitalRead(3);      // read input value and store it in val
    val4 = digitalRead(4);      // read input value and store it in val
    val5 = digitalRead(5);      // read input value and store it in val

    if (val2 != buttonState2 && val2 == HIGH || val3 != buttonState3 && val3 == HIGH || val4 != buttonState4 && val4 == HIGH || val5 != buttonState5 && val5 == HIGH) {          // the button state has changed!
      if (currentLed == 9 && digitalRead(5) == HIGH){ // did they hit the right button?
        score++;
        needNewLed = true;
        ledDelay = 0;
        updateScreen=true;
      }
      else if (currentLed == 10 && digitalRead(4) == HIGH){ // did they hit the right button?
        score++;
        needNewLed = true;
        ledDelay = 0;
        updateScreen=true;
      }
      else if (currentLed == 11 && digitalRead(3) == HIGH){ // did they hit the right button?
        score++;
        needNewLed = true;
        ledDelay = 0;
        updateScreen=true;
      }
      else if (currentLed == 12 && digitalRead(2) == HIGH){ // did they hit the right button?
        score++;
        needNewLed = true;
        ledDelay = 0;
        updateScreen=true;
      }
      else if (digitalRead(2)==HIGH || digitalRead(3)==HIGH || digitalRead(4)==HIGH || digitalRead(5)==HIGH) { // did they hit the wrong button?
        loseHealth();
        lostHealth=true;
      }
    }
    else { // they didnt press anything
      ledDelay++;
      delay(1);
    }

    buttonState2 = val2;                 // save the new state in our variable
    buttonState3 = val3;                 // save the new state in our variable
    buttonState4 = val4;                 // save the new state in our variable
    buttonState5 = val5;                 // save the new state in our variable

    // did the LED reach the timeout threshold?
    if (score <= 10){
      if(ledDelay == 1000){
        loseHealth();
        lostHealth=true;
      }
    }
    else if (score <= 15){
      if(ledDelay == 800){
        loseHealth();
        lostHealth=true;
      }
    }
    else if (score <= 20){
      if(ledDelay == 600){
        loseHealth();
        lostHealth=true;
      }
    }
    else if (score <= 25){
      if(ledDelay == 500){
        loseHealth();
        lostHealth=true;
      }
    }
    else if (score <= 30){
      if(ledDelay == 400){
        loseHealth();
        lostHealth=true;
      }
    }
    else if (score > 30){
      if(ledDelay == (420-score)){
        loseHealth();
        lostHealth=true;
      }
    }

    // update the display
    if(updateScreen==true){
      Serial.print("?fScore: ");
      Serial.print(score);

      if(health==6){
        health=5;
      }

      if (health==5){
        Serial.print("?m?kLives: ?7 ?7 ?7 ?7 ?7");
      }
      else if(health==4){
        Serial.print("?m?kLives: ?7 ?7 ?7 ?7");
      }
      else if(health==3){
        Serial.print("?m?kLives: ?7 ?7 ?7");
      }
      else if(health==2){
        Serial.print("?m?kLives: ?7 ?7");
      }
      else if(health==1){
        Serial.print("?m?kLives: ?7");
      }
      else if(health<=0){
        Serial.print("?m?k    YOU LOSE");
      }
      updateScreen=false;
    }
  }
  lostHealth=false;
}

// subtract one health
void loseHealth(){
  if(lostHealth==false){
    randomSeed(int(millis));
    health--;
    updateScreen=true;
    needNewLed=true;
    ledDelay = 0;
    if(health <= 0){ // did they lose the game?
      started=false;
     
      Serial.print("?fScore: ");
      Serial.print(score);
      Serial.print("?m?k    YOU LOSE");
     
      // blink 3 times
      digitalWrite(9,HIGH);
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,HIGH);
      delay(200);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
      delay(200);
      digitalWrite(9,HIGH);
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,HIGH);
      delay(200);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
      delay(200);
      digitalWrite(9,HIGH);
      digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
      digitalWrite(12,HIGH);
      delay(200);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
      digitalWrite(12,LOW);
    }
  }
}



/*
void type(char message[],byte length){
  for(int i; i<length; i++){
    Serial.print(message[i]);
    for (int a; a < 100; a++){
      val2 = digitalRead(2);      // read input value and store it in val
      val3 = digitalRead(3);      // read input value and store it in val
      val4 = digitalRead(4);      // read input value and store it in val
      val5 = digitalRead(5);      // read input value and store it in val

      if (val2 != buttonState2 && val2 == HIGH || val3 != buttonState3 && val3 == HIGH || val4 != buttonState4 && val4 == HIGH || val5 != buttonState5 && val5 == HIGH) {          // the button state has changed!
        if (pressed==false){
          pressed=true;
          if(screen==12){
            started=true;
            screen=13;
          }
          else if(screen==10||screen==11){
            screen=12;
          }
          else if(screen==8||screen==9){
            screen=10;
          }
          else if(screen==6||screen==7){
            screen=8;
          }
          else if(screen==4||screen==5){
            screen=6;
          }
          else if(screen==2||screen==3){
            screen=4;
          }
          else if(screen==0||screen==1){
            screen=2;
          }
          break;
        }
      }
      else{
        pressed=false;
      }

      buttonState2 = val2;                 // save the new state in our variable
      buttonState3 = val3;                 // save the new state in our variable
      buttonState4 = val4;                 // save the new state in our variable
      buttonState5 = val5;                 // save the new state in our variable
      delay(1);
    }
  }
}

*/


Other

Some problems that we encountered were whenever the far right button was pressed the circuit shorted, this was fixed by removing a small piece of solder that was bridging across two pins. Also the hole for the screen was slightly too small and had to be enlarged with sand paper.

With more money we would have like to make the box a different color and slightly larger. Additionally, re-printing the back would have been useful if we had enough time as it did not fit correctly and had to be glued on instead of snapping in.

Circuit Diagram


Comments