A simple Simon Says game using a Grove Base Shield, 3 Grove LED Bars, 1 Grove Buzzer, and 3 Grove Buttons.

Dependencies:   LED_Bar mbed

Components Used

Platform: ST-Nucleo-F401RE

Components / Grove Shield V2
As an expansion board, Base Shield v2 has many Grove connectors, making it convenient for you to use Grove products together
Digital on / off buzzer
Seeed Grove Button module with digital interface
The Grove LED Bar is comprised of a 10 segment LED gauge bar and an MY9221 LED controlling chip.

Component Configuration

LED_Bar mid(D6, D5);    //D5
LED_Bar right(D8, D7);  //D7
LED_Bar left(D4, D3);   //D3
InterruptIn button_left(A2);
InterruptIn button_mid(A1);
InterruptIn button_right(A0);
DigitalOut buzzer(D2);

Gallery

Revision:
6:1c87edbbafe0
Parent:
5:b6f37ce2a9a3
Child:
7:b2576b2b916e
--- a/main.cpp	Thu Aug 18 21:34:55 2016 +0000
+++ b/main.cpp	Fri Aug 19 14:23:57 2016 +0000
@@ -1,57 +1,51 @@
 #include "mbed.h"
 #include "LED_Bar.h"
-#include "main.h"
 
+LED_Bar mid(D6, D5);
+LED_Bar right(D8, D7);
+LED_Bar left(D4, D3);
+InterruptIn button_left(A2);
+InterruptIn button_mid(A1);
+InterruptIn button_right(A0);
+DigitalOut buzzer(D2);
+int input_index;
+int input[100];
 int sequence_size;
 int sequence[100];
-int level_index = 1;
-int level_array;
-int win_count = 0;
-int lose_count = 0;
 bool start_flag = false;
 
-void start_level() {    
-    right.setLevel(10);
-    top.setLevel(10);
-    left.setLevel(10);
-    wait(0.2);
-    right.setLevel(0);
-    top.setLevel(0);
-    left.setLevel(0);
-    wait(0.2);
-    right.setLevel(10);
-    top.setLevel(10);
-    left.setLevel(10);
-    wait(0.2);
-    right.setLevel(0);
-    top.setLevel(0);
-    left.setLevel(0);
+void start_level() {  
+    for(int i = 0; i < 2; i++) {
+        right.setLevel(10);
+        mid.setLevel(10);
+        left.setLevel(10);
+        wait(0.2);
+        right.setLevel(0);
+        mid.setLevel(0);
+        left.setLevel(0);
+        wait(0.2);
+    }   
     start_flag = true;
-    return;
 }
 
-void level() {
-    /*  generate random simon says sequence:
-        level 1 will have a 3 LED blink combination, with each subsequent level
-        having 1 more LED blink, so level 2 has a 4 blink combination, etc. */
-    for (int i = 0; i < level_array; i++) {
-        sequence[i] = rand() % 3 + 1;   // choose a random number b/w 1 to 3
+/*  generate random simon says sequence:
+    level 1 will have a 3 LED blink combination, with each subsequent level
+    having 1 more LED blink, so level 2 has a 4 blink combination, etc. */
+int level(int level_index, int sequence_size) {
+    for(int i = 0; i < sequence_size; i++) {
+        sequence[i] = rand() % 3 + 1;
     }
-    
-    level_index++;
-    
-    /*  button interrupts when user wants to begin the game/level */
     button_right.rise(&start_level);
-    button_top.rise(&start_level);
+    button_mid.rise(&start_level);
     button_left.rise(&start_level);
     while(!start_flag) {
-        wait(0.2); // waiting for user to begin game LED animation
-        // perfect time to play waiting buzzer music
+        wait(0.2);
     }
+    return level_index++;
 }
 
 /*  simon says loop: turn on corresponding LED Bars according to the # 
-    in the sequence array (1=right, 2=top, 3=left) */
+    in the sequence array (1=right, 2=mid, 3=left) */
 void simon_loop() { 
     for(int i = 0; i < sequence_size; i++) {  
         if (sequence[i] == 1) {
@@ -60,9 +54,9 @@
             right.setLevel(0);
             wait(0.4);
         } else if (sequence[i] == 2) {
-            top.setLevel(10);
+            mid.setLevel(10);
             wait(0.4);
-            top.setLevel(0);
+            mid.setLevel(0);
             wait(0.4);
         } else {
             left.setLevel(10);
@@ -80,17 +74,15 @@
         right.setLevel(10);
     }
     right.setLevel(0);
-    return;
 }
 
-void top_input() {
+void mid_input() {
     input[input_index] = 2;
     input_index++;
-    while(button_top) {
-        top.setLevel(10);
+    while(button_mid) {
+        mid.setLevel(10);
     }
-    top.setLevel(0);
-    return;
+    mid.setLevel(0);
 }
 
 void left_input() {
@@ -100,14 +92,13 @@
         left.setLevel(10);
     }
     left.setLevel(0);
-    return;
 }
 
-/*  gather user input based on buttons pressed, then store button # into
-    the input array (1=button_right, 2=button_top, 3=button_left) */
+/*  gather user input based on buttons pressed, then store button index into
+    the input array (1=button_right, 2=button_mid, 3=button_left) */
 void input_loop() {
-    button_right.rise(&right_input); //interrupt when right button is pressed
-    button_top.rise(&top_input);
+    button_right.rise(&right_input);
+    button_mid.rise(&mid_input);
     button_left.rise(&left_input);
     while(input_index < sequence_size) {
         wait(0.2);
@@ -127,56 +118,54 @@
 
 /*  display a happy LED animation for winning (LED levels 0 to 10 fast) */
 void success() {
-    for(int h = 0; h <=10; h++){
-        top.setLevel(h);
-        right.setLevel(h);
-        left.setLevel(h);
-        wait(0.05);
-    } 
-    for(int h = 0; h <=10; h++){
-        top.setLevel(h);
-        right.setLevel(h);
-        left.setLevel(h);
-        wait(0.05);
-    }  
+    for(int i = 0; i < 2; i ++){
+        for(int h = 0; h <=10; h++){
+            mid.setLevel(h);
+            right.setLevel(h);
+            left.setLevel(h);
+            wait(0.05);
+        } 
+    }
 }
 
 /*  display a sad LED animation for losing (LED levels 10 to 0 slow) */
 void failure() {
     for(int g = 0; g <= 10; g++){
-        top.setLevel(10-g);
+        mid.setLevel(10-g);
         right.setLevel(10-g);
         left.setLevel(10-g);
         wait(0.1);
     }
 }
 
-void start_game() {
-    input_index = 0;
-    top.setLevel(0);
-    right.setLevel(0);
-    left.setLevel(0);
-    level_array = ((level_index - 1) + 3);
-    sequence_size = level_array;
-    level();
-    wait(0.3);
-    simon_loop();
-    wait(0.3);
-    input_loop();
-    wait(0.3);
-    bool winner = win_or_lose();
-    if (winner == true) { win_count++; success(); } 
-    else { lose_count++; failure(); }
-    if (lose_count > 0) { 
-        start_flag = false;
-        wait(1); // add in end game buzzer music
-        win_count = 0;
-        lose_count = 0;
-        level_index = 1;
-        start_game();
-    } else { start_game(); }
-}
-
 int main() {
-    start_game();
+    int win_count = 0;
+    int lose_count = 0;
+    int level_index = 1;
+    while(1) {
+        input_index = 0;
+        mid.setLevel(0);
+        right.setLevel(0);
+        left.setLevel(0);
+        sequence_size = ((level_index - 1) + 3);
+        level_index = level(level_index, sequence_size);
+        simon_loop();
+        input_loop();
+        wait(0.3);
+        bool winner = win_or_lose();
+        if (winner == true) { 
+            win_count++; 
+            success(); 
+        } else { 
+            lose_count++; 
+            failure(); 
+        }
+        if (lose_count > 0) { 
+            start_flag = false;
+            wait(1);
+            win_count = 0;
+            lose_count = 0;
+            level_index = 1;;
+        }
+    }
 }
\ No newline at end of file