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:
2:8ff96f7acb45
Parent:
1:1aca092ceb7e
Child:
3:96879db74ec8
--- a/main.cpp	Wed Aug 17 15:22:18 2016 +0000
+++ b/main.cpp	Wed Aug 17 15:45:49 2016 +0000
@@ -7,10 +7,22 @@
 DigitalIn button_left(A2);
 DigitalIn button_top(A1);
 DigitalIn button_right(A0);
-int input[10];
+int input[50];
 int sequence[] = {3, 2, 1, 3, 2, 1};
 
-void simon_loop() {
+void start_up() {
+    //generate random simon says sequence
+    
+    //wait for user input
+    while(!(button_left or button_right or button_top)){
+        
+    }
+    
+}
+
+/*  simon says loop: turn on corresponding LED Bars according to the # 
+    in the sequence array (1=right, 2=top, 3=left) */
+void simon_loop() { 
     for(int i = 0; i < (sizeof(sequence)/sizeof(sequence[0])); i++) {  
         if (sequence[i] == 1) {
             right.setLevel(10);
@@ -30,7 +42,10 @@
     }
 }
 
+/*  gather user input based on buttons pressed, then store button # into
+    the input array (1=button_right, 2=button_top, 3=button_left) */
 void input_loop() {
+
     for(int j = 0; j < (sizeof(sequence)/sizeof(sequence[0])); j++) { 
         wait(0.4);
         if (button_top) {
@@ -58,6 +73,8 @@
     return;
 }
 
+/*  compare input array to simon says sequence array, if they are a match
+    return true, if they are not a match return false */
 bool win_or_lose() {
     for(int k = 0; k < (sizeof(sequence)/sizeof(sequence[0])); k++) { 
         if (input[k] == sequence[k]) { continue; }
@@ -66,24 +83,26 @@
     return true;
 }
 
+/*  display a happy LED animation for winning (LED levels 0 to 10 fast, twice) */
 void success() {
     for(int h = 0; h <=10; h++){
         top.setLevel(h);
         right.setLevel(h);
         left.setLevel(h);
-        wait(0.1);
+        wait(0.05);
     } 
     for(int h = 0; h <=10; h++){
         top.setLevel(h);
         right.setLevel(h);
         left.setLevel(h);
-        wait(0.1);
+        wait(0.05);
     }  
     top.setLevel(0);
     right.setLevel(0);
     left.setLevel(0); 
 }
 
+/*  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);
@@ -97,12 +116,12 @@
     top.setLevel(0);
     right.setLevel(0);
     left.setLevel(0);
-    // wait for user to start simon says
+    start_up();
     wait(0.3);
     simon_loop();
     input_loop();
     wait(0.2);
     bool winner = win_or_lose();
     if (winner == true) { success(); } 
-    else { failure; }
+    else { failure(); }
 }