Exercise 35 - Simon says

1.      INTRODUCTION

The Electronic Game “Simons says” have its origins in the same name traditional game. The original model has four lights of different colour (green, red, yellow and blue) and different sound for each one.


At the start of the game, someone turn on one light and then you have to press the corresponding button if you hit the correct button Simon returns colour combination that is increasing one by one its length of colour combination successively until you fail.

On this exercise, we are going to replicate this system with Arduino.

 

2.      HOW TO CONNECT?

Materials:

·         Arduino UNO board

·         Protoboard

·         Some wire Jumpers

·         4x Buttons

·         4x Different colour LEDs

·         4x 220ohms resistor

·         4x 10K resistor

To connect buttons and LEDs follow the next table:

 

1

2

3

4

Buttons

Pin2

Pin3

Pin4

Pin5

LEDs

Pin8

Pin9

Pin10

Pin11

Furthermore, you must to connect a speaker or buzzer to pin12. You should try to use the same colour wire on the Button-LED groups.



 

EXERCISE_A


 

3.      PROGRAMMING

For this exercise, you have to include Tone.h library.

EXERCISE_A

/*

Originally made by Robert Spann

Code trimmed and sound effects added by digimike

*/

 

First, declare variables and vectors. Vectors are useful in this exercise. Thanks to them,  you can save write lines.

 

#include <Tone.h>

Tone speakerpin;

int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};

int duration2[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};

int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};

int duration[] = {100, 100, 100, 300, 100, 300};

int button[] = {2, 3, 4, 5}; //The four button input pins

int ledpin[] = {8, 9, 10, 11};  // LED pins

int turn = 0;  // turn counter

int buttonstate = 0;  // button state checker

int randomArray[100]; //Intentionally long to store up to 100 inputs //(doubtful anyone will get this far)

int inputArray[100];  

 

On setup() serial communication is started and start melody and LED illumination is configure.

 

void setup()

{

  Serial.begin(9600);

  speakerpin.begin(12); // speaker is on pin 12

 

  for(int x=0; x<4; x++)  // LED pins are outputs

  {

    pinMode(ledpin[x], OUTPUT);

  }

  

  for(int x=0; x<4; x++)

  {

    pinMode(button[x], INPUT);  // button pins are inputs

    digitalWrite(button[x], HIGH);  // enable internal pullup; buttons //start in high position; logic reversed

  }

 

  randomSeed(analogRead(0)); //Added to generate "more randomness" with //the randomArray for the output function

  for (int thisNote = 0; thisNote < 13; thisNote ++) {

     // play the next note:

     speakerpin.play(starttune[thisNote]);

     // hold the note:

     if (thisNote==0 || thisNote==2 || thisNote==4 || thisNote== 6)

     {

       digitalWrite(ledpin[0], HIGH);

     }

     if (thisNote==1 || thisNote==3 || thisNote==5 || thisNote== 7 || thisNote==9 || thisNote==11)

     {

       digitalWrite(ledpin[1], HIGH);

     }

     if (thisNote==8 || thisNote==12)

     {

       digitalWrite(ledpin[2], HIGH);

     }  

     if (thisNote==10)

     {   

       digitalWrite(ledpin[3], HIGH);

     }

     delay(duration2[thisNote]);

     // stop for the next note:

     speakerpin.stop();

     digitalWrite(ledpin[0], LOW);

     digitalWrite(ledpin[1], LOW);

     digitalWrite(ledpin[2], LOW);

     digitalWrite(ledpin[3], LOW);

     delay(25);

    }

  delay(1000);

}

 

On loop, random function is executed one time per iteration. The random value generated is added to a random array.

 

void loop()

{   

  for (int y=0; y<=99; y++)

  {

    //function for generating the array to be matched by the player

    digitalWrite(ledpin[0], HIGH);

    digitalWrite(ledpin[1], HIGH);

    digitalWrite(ledpin[2], HIGH);

    digitalWrite(ledpin[3], HIGH);

  

    for (int thisNote = 0; thisNote < 6; thisNote ++) {

     // play the next note:

     speakerpin.play(note[thisNote]);

     // hold the note:

     delay(duration[thisNote]);

     // stop for the next note:

     speakerpin.stop();

     delay(25);

    }

    

    digitalWrite(ledpin[0], LOW);

    digitalWrite(ledpin[1], LOW);

    digitalWrite(ledpin[2], LOW);

    digitalWrite(ledpin[3], LOW);

    delay(1000);

  

    for (int y=turn; y <= turn; y++)

    { //Limited by the turn variable

      Serial.println(""); //Some serial output to follow along

      Serial.print("Turn: ");

      Serial.print(y);

      Serial.println("");

      randomArray[y] = random(1, 5); //Assigning a random number (1-4) to //the randomArray[y], y being the turn count

      for (int x=0; x <= turn; x++)

      {

        Serial.print(randomArray[x]);

      

        for(int y=0; y<4; y++)

        {

      

          if (randomArray[x] == 1 && ledpin[y] == 8)

          {  //if statements to display the stored values in the array

            digitalWrite(ledpin[y], HIGH);

            speakerpin.play(NOTE_G3, 100);

            delay(400);

            digitalWrite(ledpin[y], LOW);

            delay(100);

          }

 

          if (randomArray[x] == 2 && ledpin[y] == 9)

          {

            digitalWrite(ledpin[y], HIGH);

            speakerpin.play(NOTE_A3, 100);

            delay(400);

            digitalWrite(ledpin[y], LOW);

            delay(100);

          }

  

          if (randomArray[x] == 3 && ledpin[y] == 10)

          {

            digitalWrite(ledpin[y], HIGH);

            speakerpin.play(NOTE_B3, 100);

            delay(400);

            digitalWrite(ledpin[y], LOW);

            delay(100);

          }

 

          if (randomArray[x] == 4 && ledpin[y] == 11)

          {

            digitalWrite(ledpin[y], HIGH);

            speakerpin.play(NOTE_C4, 100);

            delay(400);

            digitalWrite(ledpin[y], LOW);

            delay(100);

          }

        }

      }

    }

    input();

  }

}

 

 Input() generate the array introduced by the player and compare it with the actual random array. Whether the comparison is equal LEDs and speaker reproduce victory sequence. On the other hand if the array introduced by the player has any difference with the random array the code flows to fail() function.

 

void input() { //Function for allowing user input and checking input //against the generated array

 

  for (int x=0; x <= turn;)

  { //Statement controlled by turn count

 

    for(int y=0; y<4; y++)

    {

      

      buttonstate = digitalRead(button[y]);

    

      if (buttonstate == LOW && button[y] == 2)

      { //Checking for button push

        digitalWrite(ledpin[0], HIGH);

        speakerpin.play(NOTE_G3, 100);

        delay(200);

        digitalWrite(ledpin[0], LOW);

        inputArray[x] = 1;

        delay(250);

        Serial.print(" ");

        Serial.print(1);

        if (inputArray[x] != randomArray[x]) { //Checks value input by //user and checks it against

          fail();                              //the value in the same //spot on the generated array

        }                                      //The fail function is //called if it does not match

        x++;

      }

       if (buttonstate == LOW && button[y] == 3)

      {

        digitalWrite(ledpin[1], HIGH);

        speakerpin.play(NOTE_A3, 100);

        delay(200);

        digitalWrite(ledpin[1], LOW);

        inputArray[x] = 2;

        delay(250);

        Serial.print(" ");

        Serial.print(2);

        if (inputArray[x] != randomArray[x]) {

          fail();

        }

        x++;

      }

 

      if (buttonstate == LOW && button[y] == 4)

      {

        digitalWrite(ledpin[2], HIGH);

        speakerpin.play(NOTE_B3, 100);

        delay(200);

        digitalWrite(ledpin[2], LOW);

        inputArray[x] = 3;

        delay(250);

        Serial.print(" ");

        Serial.print(3);

        if (inputArray[x] != randomArray[x]) {

          fail();

        }

        x++;

      }

 

      if (buttonstate == LOW && button[y] == 5)

      {

        digitalWrite(ledpin[3], HIGH);

        speakerpin.play(NOTE_C4, 100);

        delay(200);

        digitalWrite(ledpin[3], LOW);

        inputArray[x] = 4;

        delay(250);

        Serial.print(" ");

        Serial.print(4);

        if (inputArray[x] != randomArray[x])

        {

          fail();

        }

        x++;

      }

    }

  }

  delay(500);

  turn++; //Increments the turn count, also the last action before //starting the output function over again

}

 

Fail() function reproduce LEDs and Sound sequence when the user fail the array introduced. The game start another time.

 

void fail() { //Function used if the player fails to match the sequence

 

  for (int y=0; y<=2; y++)

  { //Flashes lights for failure

    

    digitalWrite(ledpin[0], HIGH);

    digitalWrite(ledpin[1], HIGH);

    digitalWrite(ledpin[2], HIGH);

    digitalWrite(ledpin[3], HIGH);

    speakerpin.play(NOTE_G3, 300);

    delay(200);

    digitalWrite(ledpin[0], LOW);

    digitalWrite(ledpin[1], LOW);

    digitalWrite(ledpin[2], LOW);

    digitalWrite(ledpin[3], LOW);

    speakerpin.play(NOTE_C3, 300);

    delay(200);

  }

  delay(500);

  turn = -1; //Resets turn value so the game starts over without need for //a reset button

}


Última modificación: Tuesday, 21 de January de 2020, 10:42