EDUMKII KonamiCodeBuzzer

Use Joystick & Push buttons to enter the 'secret' Konami/Contra Cheat Code.

When correct code is entered:

  • Play Konami/Contra Intro through the buzzer, demonstrating buzzer tune() API and pitch/tone/simple music generation.

  • Blue LED lights up.

Example Video

Hardware Required

  • TI LaunchPad

  • Educational BoosterPack MKII

Schematic

None. This basic example just uses your LaunchPad and BoosterPack only.

Code

/*
 Educational BoosterPack MK II - Konami/Contra Intro
http://boosterpackdepot.info/wiki/index.php?title=Educational_BoosterPack_MK_II


 Use Joystick & Push buttons to enter the 'secret' Konami/Contra Cheat Code
 When correct code is entered:
 - Play Konami/Contra Intro through the buzzer, demonstrating
   buzzer tune() API and pitch/tone/simple music generation
 - Blue LED lights up

 Use Serial Monitor window to debug/follow statemachine

 Feb 2014 - Initial version created for Edu BP MK II


 by Dung Dang

 */

#include "pitches.h"

int buzzerPin = 40;

// notes in the melody:
int melody[] = {
  NOTE_F2, NOTE_C6, NOTE_B5, NOTE_G5, NOTE_A5, NOTE_E1, NOTE_B1, NOTE_E1, NOTE_B1, NOTE_E1, NOTE_B1,


  NOTE_G6, NOTE_F6, NOTE_DS6, NOTE_C6, NOTE_AS5, NOTE_C6, NOTE_AS5, NOTE_GS5, NOTE_G5, NOTE_GS5,
  NOTE_G5, NOTE_F5, NOTE_DS5, NOTE_F5, NOTE_AS4, NOTE_C5, NOTE_DS5, NOTE_F5,

  NOTE_C6, NOTE_NOTONE, NOTE_AS5, NOTE_C6, NOTE_D6, NOTE_DS6, NOTE_F5,
  NOTE_C6, NOTE_NOTONE, NOTE_AS5, NOTE_C6, NOTE_D6, NOTE_GS5, NOTE_F5,

// Repeat once
  NOTE_C6, NOTE_NOTONE, NOTE_AS5, NOTE_C6, NOTE_D6, NOTE_DS6, NOTE_F5,
  NOTE_C6, NOTE_NOTONE, NOTE_AS5, NOTE_C6, NOTE_D6, NOTE_GS5, NOTE_F5,

  NOTE_C6, NOTE_NOTONE, NOTE_C6, NOTE_D6, NOTE_DS6, NOTE_NOTONE, NOTE_DS6, NOTE_NOTONE,
  NOTE_G5, NOTE_AS5, NOTE_C6, NOTE_D6, NOTE_NOTONE, NOTE_D6, NOTE_DS6,

  NOTE_C6, NOTE_NOTONE, NOTE_C6, NOTE_NOTONE, NOTE_DS6, NOTE_F6


};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
2, 2, 2, 2,1, 2, 2, 2, 2, 2, 1,  // 11 start screen  notes



16, 16, 16, 16, 16, 16, 16, 16, 16, 16,  // 20  notes
16, 16, 16, 16, 16, 16, 16, 2,           // for both lines

16, 16, 16, 8, 16, 2, 2,                  // 7
16, 16, 16, 8, 16, 2, 2,                  // 7

// Repeat once
16, 16, 16, 8, 16, 2, 2,                  // 7
16, 16, 16, 8, 16, 2, 2,                  // 7

16, 16, 4, 4, 16, 16, 16, 8,             // 8
16, 16, 16, 16, 16, 4, 4,                  // 7

16, 16, 16, 16, 16, 4                     // 6

};


//Joystick
const int JOY_X = 2;
const int JOY_Y = 26;
const int JOY_SEL = 5; //Substitute for the Start button

//Push Button/Switch
const int BUTTON_A = 33;
const int BUTTON_B = 32;
const int RGB_BLUE_LED = 37;

int statemachine = 0;

int pressedLeft(void);
int pressedRight(void);
int pressedUp(void);
int pressedDown(void);
int pressedA(void);
int pressedB(void);
int pressedStart(void);

void setup()
{
  // put your setup code here, to run once:
  statemachine =0;
  pinMode(BUTTON_B, INPUT);
  pinMode(BUTTON_A, INPUT);
  pinMode(JOY_SEL, INPUT);
  pinMode(buzzerPin,OUTPUT);
  pinMode(RGB_BLUE_LED, OUTPUT);
  digitalWrite(RGB_BLUE_LED, 0);
  Serial.begin(115200);
}


void loop()
{
  // put your main code here, to run repeatedly:
  Serial.print("State Machine = ");
  Serial.println(statemachine);
  switch (statemachine)
  {

    //---UP---
    case 0:
      if (pressedUp())       //JoyStick Up
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;

    //---UP---
    case 1:
      if (pressedUp())       //JoyStick Up
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;

    //---DOWN---
    case 2:
      if (pressedDown())       //JoyStick Down
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;
    //---DOWN---
    case 3:
      if (pressedDown())       //JoyStick Down
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;

    //---LEFT---
    case 4:
      if (pressedLeft())       //JoyStick left
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;
    //---RIGHT---
    case 5: // Waiting for Right
      if (pressedRight())       //JoyStick right
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;
    //---LEFT---
    case 6:
      if (pressedLeft())       //JoyStick left
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;
    //---RIGHT---
    case 7: // Waiting for Right
      if (pressedRight())       //JoyStick right
        if (backToCenter())    // Then back to center
          statemachine++;
        else
          statemachine = 0;
      else
        statemachine = 0;
      break;

    //---BUTTON_B---
    case 8: // Waiting for Right
      delay(300);
      if (pressedB())       //Button B
          statemachine++;
      else
          statemachine = 0;
      break;

    //---BUTTON_A---
    case 9: // Waiting for Right
      if (pressedA())       //Button A
          statemachine++;
      else
          statemachine = 0;
      break;

    //---START---

    case 10: // Waiting for Start
      if (pressedStart())       //JoyStick Start
          statemachine++;
      else
          statemachine = 0;
      break;
    case 11:
      digitalWrite(RGB_BLUE_LED, 1);
	  for (int thisNote = 0; thisNote < 80; thisNote++)
	  {

		// to calculate the note duration, take one second
		// divided by the note type.
		//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
		// Had to down tempo to 100/150
		int noteDuration = 1500/noteDurations[thisNote];
		tone(buzzerPin, melody[thisNote],noteDuration);

		int pauseBetweenNotes = noteDuration + 50;      //delay between pulse
		delay(pauseBetweenNotes);
		noTone(buzzerPin);                // stop the tone playing
	  }
	  digitalWrite(RGB_BLUE_LED, 0);
	  statemachine = 0;				      // Reset statemachine
      break;
  }

}


int pressedLeft(void)
{
  uint8_t pass  = 1;
  while ( (analogRead(JOY_X)>0) && (pass==1) )
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;

    if ( (analogRead(JOY_Y)<10) || (analogRead(JOY_Y) >  4050) )
      pass = 0;

  }
  return pass;
}
int pressedRight(void)
{
  uint8_t pass  = 1;
  while ( (analogRead(JOY_X)<4094) && (pass==1))
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;

    if ( (analogRead(JOY_Y)<10) || (analogRead(JOY_Y) >  4050) )
      pass = 0;

  }
  return pass;
}


int pressedDown(void)
{
  uint8_t pass  = 1;
  while ( (analogRead(JOY_Y)>0) && (pass==1))
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;

    if ( (analogRead(JOY_X)<10) || (analogRead(JOY_X) >  4050) )
      pass = 0;

  }
  return pass;
}
int pressedUp(void)
{
  uint8_t pass  = 1;
  while ( (analogRead(JOY_Y)<4094) && (pass==1))
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;

    if ( (analogRead(JOY_X)<10) || (analogRead(JOY_X) >  4050) )
      pass = 0;

  }
  return pass;
}

int backToCenter(void)
{
  uint8_t pass  = 1;
  while ( ( (analogRead(JOY_X)>2200) ||
            (analogRead(JOY_X)<1800) ||
            (analogRead(JOY_Y)>2200) ||
            (analogRead(JOY_Y)<1800)    )
          && (pass==1) )
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;
  }
  return pass;
}

int pressedA(void)
{
  uint8_t pass  = 1;
  while (  (digitalRead(BUTTON_A)==1) &&
           (pass==1) )
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;
    if ( (analogRead(JOY_X)>4050) ||
            (analogRead(JOY_X)<10) ||
            (analogRead(JOY_Y)>4050) ||
            (analogRead(JOY_Y)<10)    )
      pass = 0;
  }
  if (pass)
    while (digitalRead(BUTTON_A)==0); //Wait until button is released

  return pass;
}

int pressedB(void)
{
  uint8_t pass  = 1;
  while (  (digitalRead(BUTTON_B)==1) &&
           (pass==1) )
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_A) == 0) ||
         (digitalRead(JOY_SEL) == 0) )
      pass = 0;
    if ( (analogRead(JOY_X)>4050) ||
            (analogRead(JOY_X)<10) ||
            (analogRead(JOY_Y)>4050) ||
            (analogRead(JOY_Y)<10)    )
      pass = 0;
  }
  if (pass)
    while (digitalRead(BUTTON_B)==0); //Wait until button is released

  return pass;
}

int pressedStart(void)
{
  uint8_t pass  = 1;
  while (  (digitalRead(JOY_SEL)==1) &&
           (pass==1) )
  {
    // Ensure no other buttons/joystick directions are pressed
    if ( (digitalRead(BUTTON_B) == 0) ||
         (digitalRead(BUTTON_A) == 0) )
      pass = 0;
    if ( (analogRead(JOY_X)>4050) ||
            (analogRead(JOY_X)<10) ||
            (analogRead(JOY_Y)>4050) ||
            (analogRead(JOY_Y)<10)    )
      pass = 0;
  }
  if (pass)
    while (digitalRead(JOY_SEL)==0); //Wait until button is released

  return pass;
}
Guide Home