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

Committer:
jplunkett
Date:
Thu Aug 18 16:47:00 2016 +0000
Revision:
3:96879db74ec8
Parent:
2:8ff96f7acb45
Child:
4:9950f9ec46cf
cleaned up main function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jplunkett 0:67efb4657416 1 #include "mbed.h"
jplunkett 0:67efb4657416 2 #include "LED_Bar.h"
jplunkett 0:67efb4657416 3
jplunkett 1:1aca092ceb7e 4 LED_Bar top(D6, D5);
jplunkett 1:1aca092ceb7e 5 LED_Bar right(D8, D7);
jplunkett 1:1aca092ceb7e 6 LED_Bar left(D4, D3);
jplunkett 1:1aca092ceb7e 7 DigitalIn button_left(A2);
jplunkett 1:1aca092ceb7e 8 DigitalIn button_top(A1);
jplunkett 1:1aca092ceb7e 9 DigitalIn button_right(A0);
jplunkett 3:96879db74ec8 10 DigitalOut buzzer(D2);
jplunkett 3:96879db74ec8 11 Ticker input_timer;
jplunkett 2:8ff96f7acb45 12 int input[50];
jplunkett 1:1aca092ceb7e 13 int sequence[] = {3, 2, 1, 3, 2, 1};
jplunkett 3:96879db74ec8 14 int level_index = 0;
jplunkett 1:1aca092ceb7e 15
jplunkett 3:96879db74ec8 16 void level() {
jplunkett 2:8ff96f7acb45 17 //generate random simon says sequence
jplunkett 2:8ff96f7acb45 18
jplunkett 2:8ff96f7acb45 19 //wait for user input
jplunkett 2:8ff96f7acb45 20 while(!(button_left or button_right or button_top)){
jplunkett 2:8ff96f7acb45 21
jplunkett 2:8ff96f7acb45 22 }
jplunkett 2:8ff96f7acb45 23
jplunkett 2:8ff96f7acb45 24 }
jplunkett 2:8ff96f7acb45 25
jplunkett 2:8ff96f7acb45 26 /* simon says loop: turn on corresponding LED Bars according to the #
jplunkett 2:8ff96f7acb45 27 in the sequence array (1=right, 2=top, 3=left) */
jplunkett 2:8ff96f7acb45 28 void simon_loop() {
jplunkett 1:1aca092ceb7e 29 for(int i = 0; i < (sizeof(sequence)/sizeof(sequence[0])); i++) {
jplunkett 1:1aca092ceb7e 30 if (sequence[i] == 1) {
jplunkett 1:1aca092ceb7e 31 right.setLevel(10);
jplunkett 1:1aca092ceb7e 32 wait(0.4);
jplunkett 1:1aca092ceb7e 33 right.setLevel(0);
jplunkett 1:1aca092ceb7e 34 }
jplunkett 1:1aca092ceb7e 35 else if (sequence[i] == 2) {
jplunkett 1:1aca092ceb7e 36 top.setLevel(10);
jplunkett 1:1aca092ceb7e 37 wait(0.4);
jplunkett 1:1aca092ceb7e 38 top.setLevel(0);
jplunkett 1:1aca092ceb7e 39 }
jplunkett 1:1aca092ceb7e 40 else {
jplunkett 1:1aca092ceb7e 41 left.setLevel(10);
jplunkett 1:1aca092ceb7e 42 wait(0.4);
jplunkett 1:1aca092ceb7e 43 left.setLevel(0);
jplunkett 1:1aca092ceb7e 44 }
jplunkett 1:1aca092ceb7e 45 }
jplunkett 1:1aca092ceb7e 46 }
jplunkett 1:1aca092ceb7e 47
jplunkett 2:8ff96f7acb45 48 /* gather user input based on buttons pressed, then store button # into
jplunkett 2:8ff96f7acb45 49 the input array (1=button_right, 2=button_top, 3=button_left) */
jplunkett 1:1aca092ceb7e 50 void input_loop() {
jplunkett 1:1aca092ceb7e 51 for(int j = 0; j < (sizeof(sequence)/sizeof(sequence[0])); j++) {
jplunkett 1:1aca092ceb7e 52 wait(0.4);
jplunkett 1:1aca092ceb7e 53 if (button_top) {
jplunkett 1:1aca092ceb7e 54 input[j] = 2;
jplunkett 1:1aca092ceb7e 55 while(button_top){
jplunkett 1:1aca092ceb7e 56 top.setLevel(10);
jplunkett 1:1aca092ceb7e 57 };
jplunkett 1:1aca092ceb7e 58 top.setLevel(0);
jplunkett 1:1aca092ceb7e 59 }
jplunkett 1:1aca092ceb7e 60 if (button_right) {
jplunkett 1:1aca092ceb7e 61 input[j] = 1;
jplunkett 1:1aca092ceb7e 62 while(button_right){
jplunkett 1:1aca092ceb7e 63 right.setLevel(10);
jplunkett 1:1aca092ceb7e 64 };
jplunkett 1:1aca092ceb7e 65 right.setLevel(0);
jplunkett 1:1aca092ceb7e 66 }
jplunkett 1:1aca092ceb7e 67 if (button_left) {
jplunkett 1:1aca092ceb7e 68 input[j] = 3;
jplunkett 1:1aca092ceb7e 69 while(button_left){
jplunkett 1:1aca092ceb7e 70 left.setLevel(10);
jplunkett 1:1aca092ceb7e 71 };
jplunkett 1:1aca092ceb7e 72 left.setLevel(0);
jplunkett 1:1aca092ceb7e 73 }
jplunkett 1:1aca092ceb7e 74 }
jplunkett 1:1aca092ceb7e 75 return;
jplunkett 1:1aca092ceb7e 76 }
jplunkett 1:1aca092ceb7e 77
jplunkett 2:8ff96f7acb45 78 /* compare input array to simon says sequence array, if they are a match
jplunkett 2:8ff96f7acb45 79 return true, if they are not a match return false */
jplunkett 1:1aca092ceb7e 80 bool win_or_lose() {
jplunkett 1:1aca092ceb7e 81 for(int k = 0; k < (sizeof(sequence)/sizeof(sequence[0])); k++) {
jplunkett 1:1aca092ceb7e 82 if (input[k] == sequence[k]) { continue; }
jplunkett 1:1aca092ceb7e 83 else { return false; }
jplunkett 1:1aca092ceb7e 84 }
jplunkett 1:1aca092ceb7e 85 return true;
jplunkett 1:1aca092ceb7e 86 }
jplunkett 1:1aca092ceb7e 87
jplunkett 3:96879db74ec8 88 /* display a happy LED animation for winning (LED levels 0 to 10 fast) */
jplunkett 1:1aca092ceb7e 89 void success() {
jplunkett 1:1aca092ceb7e 90 for(int h = 0; h <=10; h++){
jplunkett 1:1aca092ceb7e 91 top.setLevel(h);
jplunkett 1:1aca092ceb7e 92 right.setLevel(h);
jplunkett 1:1aca092ceb7e 93 left.setLevel(h);
jplunkett 2:8ff96f7acb45 94 wait(0.05);
jplunkett 1:1aca092ceb7e 95 }
jplunkett 1:1aca092ceb7e 96 for(int h = 0; h <=10; h++){
jplunkett 1:1aca092ceb7e 97 top.setLevel(h);
jplunkett 1:1aca092ceb7e 98 right.setLevel(h);
jplunkett 1:1aca092ceb7e 99 left.setLevel(h);
jplunkett 2:8ff96f7acb45 100 wait(0.05);
jplunkett 1:1aca092ceb7e 101 }
jplunkett 1:1aca092ceb7e 102 top.setLevel(0);
jplunkett 1:1aca092ceb7e 103 right.setLevel(0);
jplunkett 1:1aca092ceb7e 104 left.setLevel(0);
jplunkett 1:1aca092ceb7e 105 }
jplunkett 1:1aca092ceb7e 106
jplunkett 2:8ff96f7acb45 107 /* display a sad LED animation for losing (LED levels 10 to 0 slow) */
jplunkett 1:1aca092ceb7e 108 void failure() {
jplunkett 1:1aca092ceb7e 109 for(int g = 0; g <= 10; g++){
jplunkett 1:1aca092ceb7e 110 top.setLevel(10-g);
jplunkett 1:1aca092ceb7e 111 right.setLevel(10-g);
jplunkett 1:1aca092ceb7e 112 left.setLevel(10-g);
jplunkett 1:1aca092ceb7e 113 wait(0.1);
jplunkett 1:1aca092ceb7e 114 }
jplunkett 1:1aca092ceb7e 115 }
jplunkett 0:67efb4657416 116
jplunkett 3:96879db74ec8 117 void start_game() {
jplunkett 1:1aca092ceb7e 118 top.setLevel(0);
jplunkett 1:1aca092ceb7e 119 right.setLevel(0);
jplunkett 1:1aca092ceb7e 120 left.setLevel(0);
jplunkett 3:96879db74ec8 121 //next_level:
jplunkett 3:96879db74ec8 122 //level();
jplunkett 1:1aca092ceb7e 123 wait(0.3);
jplunkett 1:1aca092ceb7e 124 simon_loop();
jplunkett 1:1aca092ceb7e 125 input_loop();
jplunkett 1:1aca092ceb7e 126 wait(0.2);
jplunkett 1:1aca092ceb7e 127 bool winner = win_or_lose();
jplunkett 1:1aca092ceb7e 128 if (winner == true) { success(); }
jplunkett 2:8ff96f7acb45 129 else { failure(); }
jplunkett 3:96879db74ec8 130 //if (level < 10) then { GoTo next_level; }
jplunkett 1:1aca092ceb7e 131 }
jplunkett 3:96879db74ec8 132
jplunkett 3:96879db74ec8 133 int main() {
jplunkett 3:96879db74ec8 134 start_game();
jplunkett 3:96879db74ec8 135 }
jplunkett 3:96879db74ec8 136
jplunkett 3:96879db74ec8 137 //buzzer_timer.attach(&timer_handler, 0.5)