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 19:43:09 2016 +0000
Revision:
4:9950f9ec46cf
Parent:
3:96879db74ec8
Child:
5:b6f37ce2a9a3
added button interrupts

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