Simon

Dependencies:   mbed

Committer:
JuanClerici
Date:
Mon Jun 17 04:52:45 2019 +0000
Revision:
3:1610e2f8803b
Parent:
2:f45bd4655817
Child:
4:ddba0fd2caa4
Simon con biblioteca anti rebote

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JuanClerici 0:a49a5f50d6bc 1 #include "mbed.h"
JuanClerici 0:a49a5f50d6bc 2 #include "tsi_sensor.h"
JuanClerici 0:a49a5f50d6bc 3 #include "DebouncedIn.h"
JuanClerici 0:a49a5f50d6bc 4 /* This defines will be replaced by PinNames soon */
JuanClerici 0:a49a5f50d6bc 5 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
JuanClerici 0:a49a5f50d6bc 6 #define ELEC0 9
JuanClerici 0:a49a5f50d6bc 7 #define ELEC1 10
JuanClerici 0:a49a5f50d6bc 8 #elif defined (TARGET_KL05Z)
JuanClerici 0:a49a5f50d6bc 9 #define ELEC0 9
JuanClerici 0:a49a5f50d6bc 10 #define ELEC1 8
JuanClerici 0:a49a5f50d6bc 11 #else
JuanClerici 0:a49a5f50d6bc 12 #error TARGET NOT DEFINED
JuanClerici 0:a49a5f50d6bc 13 #endif
JuanClerici 0:a49a5f50d6bc 14
JuanClerici 1:78297550b459 15 #define ESTADO_COMENZAR 0
JuanClerici 1:78297550b459 16 #define ESTADO_REINICIO 1
JuanClerici 1:78297550b459 17 #define ESTADO_MUESTREO 2
JuanClerici 1:78297550b459 18 #define ESTADO_JUEGO 3
JuanClerici 1:78297550b459 19 #define ESTADO_PERDER 4
JuanClerici 1:78297550b459 20 #define ESTADO_GANAR 5
JuanClerici 0:a49a5f50d6bc 21
JuanClerici 0:a49a5f50d6bc 22 #define NIVELES 25
JuanClerici 0:a49a5f50d6bc 23
JuanClerici 0:a49a5f50d6bc 24
JuanClerici 0:a49a5f50d6bc 25 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
JuanClerici 0:a49a5f50d6bc 26 //Definimos que el puerto serie se llama pc
JuanClerici 0:a49a5f50d6bc 27 Serial pc(USBTX, USBRX);
JuanClerici 0:a49a5f50d6bc 28 //Variable donde se guarda lo leido
JuanClerici 0:a49a5f50d6bc 29 char c = '\0';
JuanClerici 0:a49a5f50d6bc 30 unsigned int semilla = 0;
JuanClerici 0:a49a5f50d6bc 31 //bit usado como flag para procesar datos
JuanClerici 0:a49a5f50d6bc 32 bool newdata = false; //Se pone en true cuando hay nuevos datos
JuanClerici 0:a49a5f50d6bc 33 //Creamos los tres leds pra usar
JuanClerici 0:a49a5f50d6bc 34 DigitalOut Rojo(LED1);
JuanClerici 0:a49a5f50d6bc 35 DigitalOut Verde(LED2);
JuanClerici 0:a49a5f50d6bc 36 DigitalOut Azul(LED3);
JuanClerici 0:a49a5f50d6bc 37
JuanClerici 3:1610e2f8803b 38 void invierte();
JuanClerici 0:a49a5f50d6bc 39 void simon();
JuanClerici 0:a49a5f50d6bc 40 char Pulsador ();
JuanClerici 0:a49a5f50d6bc 41 void leds(int num); // led(0b000) = apagados, led(0b100) = rojo, led(0b010) = Verde, led(0b001) = Azul, led(0b111) = Blanco,
JuanClerici 2:f45bd4655817 42
JuanClerici 0:a49a5f50d6bc 43 char sec[50] = {0};
JuanClerici 2:f45bd4655817 44 char nivelSec = 1;
JuanClerici 2:f45bd4655817 45 char posSec = 0;
JuanClerici 2:f45bd4655817 46 char posJuego = 0;
JuanClerici 2:f45bd4655817 47 int times = 0, espera = 0;;
JuanClerici 0:a49a5f50d6bc 48 bool flagPulsador = 0;
JuanClerici 0:a49a5f50d6bc 49 char pulsador = 0;
JuanClerici 1:78297550b459 50 char estado = ESTADO_COMENZAR;
JuanClerici 0:a49a5f50d6bc 51
JuanClerici 0:a49a5f50d6bc 52 bool pulsador1 = 1, pulsador2 = 1, pulsador3 = 1;
JuanClerici 2:f45bd4655817 53 bool st1= 0, st2 = 0, st3 = 0, loop = 1, apagado = 0;
JuanClerici 0:a49a5f50d6bc 54
JuanClerici 0:a49a5f50d6bc 55
JuanClerici 0:a49a5f50d6bc 56 DebouncedIn PV(PTB1);
JuanClerici 0:a49a5f50d6bc 57 DebouncedIn PA(PTB0);
JuanClerici 0:a49a5f50d6bc 58 DebouncedIn PR(PTB2);
JuanClerici 0:a49a5f50d6bc 59 Ticker ti;
JuanClerici 0:a49a5f50d6bc 60
JuanClerici 0:a49a5f50d6bc 61 //Callback cuando se detecta una entrada
JuanClerici 0:a49a5f50d6bc 62 void onCharReceived()
JuanClerici 0:a49a5f50d6bc 63 {
JuanClerici 0:a49a5f50d6bc 64 //Copiamos lo leido en c
JuanClerici 0:a49a5f50d6bc 65 c = pc.getc();
JuanClerici 0:a49a5f50d6bc 66 newdata = true;
JuanClerici 0:a49a5f50d6bc 67 }
JuanClerici 0:a49a5f50d6bc 68
JuanClerici 0:a49a5f50d6bc 69 int main()
JuanClerici 0:a49a5f50d6bc 70 {
JuanClerici 0:a49a5f50d6bc 71 ti.attach(&invierte, 0.1);
JuanClerici 0:a49a5f50d6bc 72
JuanClerici 0:a49a5f50d6bc 73 //Prendemos los LEDS
JuanClerici 0:a49a5f50d6bc 74 leds(0b111);
JuanClerici 0:a49a5f50d6bc 75 printf("Toque cualquier pulsador para comenzar: \r\n");
JuanClerici 0:a49a5f50d6bc 76
JuanClerici 0:a49a5f50d6bc 77 while(true) {
JuanClerici 2:f45bd4655817 78 //Cambio el estado de los pulsadores
JuanClerici 0:a49a5f50d6bc 79 Pulsador();
JuanClerici 2:f45bd4655817 80 //Ejecuto la funcion principal
JuanClerici 0:a49a5f50d6bc 81 simon();
JuanClerici 2:f45bd4655817 82 //Aseguro el reset de la habilitacion del pulsador
JuanClerici 0:a49a5f50d6bc 83 flagPulsador = 0;
JuanClerici 0:a49a5f50d6bc 84 }
JuanClerici 0:a49a5f50d6bc 85 }
JuanClerici 0:a49a5f50d6bc 86 void simon()
JuanClerici 0:a49a5f50d6bc 87 {
JuanClerici 0:a49a5f50d6bc 88 static int i;
JuanClerici 0:a49a5f50d6bc 89 switch(estado) {
JuanClerici 1:78297550b459 90 case ESTADO_COMENZAR:
JuanClerici 3:1610e2f8803b 91 //Espero que pulsen un pulsador para empezar
JuanClerici 0:a49a5f50d6bc 92 times = 0;
JuanClerici 0:a49a5f50d6bc 93 if(pulsador != 0 && flagPulsador == 1) {
JuanClerici 0:a49a5f50d6bc 94 leds(0b000);
JuanClerici 0:a49a5f50d6bc 95 printf("Comencemos: \r\n\n");
JuanClerici 1:78297550b459 96 estado = ESTADO_REINICIO;
JuanClerici 0:a49a5f50d6bc 97 flagPulsador = 0;
JuanClerici 0:a49a5f50d6bc 98 }
JuanClerici 0:a49a5f50d6bc 99 break;
JuanClerici 0:a49a5f50d6bc 100
JuanClerici 1:78297550b459 101 case ESTADO_REINICIO:
JuanClerici 2:f45bd4655817 102 //Seteo la semilla
JuanClerici 0:a49a5f50d6bc 103 srand (semilla*4920*1912);
JuanClerici 2:f45bd4655817 104 //Genero la secuencia
JuanClerici 0:a49a5f50d6bc 105 for(i = 0; i <= NIVELES ; i ++) {
JuanClerici 0:a49a5f50d6bc 106 sec[i] = rand() % 3 + 1;
JuanClerici 0:a49a5f50d6bc 107 }
JuanClerici 2:f45bd4655817 108 nivelSec = 1;
JuanClerici 3:1610e2f8803b 109 posSec = 0;
JuanClerici 2:f45bd4655817 110 posJuego = 0;
JuanClerici 1:78297550b459 111 estado = ESTADO_MUESTREO;
JuanClerici 0:a49a5f50d6bc 112 times = 0;
JuanClerici 2:f45bd4655817 113 loop = 0;
JuanClerici 0:a49a5f50d6bc 114 break;
JuanClerici 0:a49a5f50d6bc 115
JuanClerici 1:78297550b459 116 case ESTADO_MUESTREO:
JuanClerici 2:f45bd4655817 117 //Muestro la secuencia generada
JuanClerici 2:f45bd4655817 118 if(loop) {
JuanClerici 2:f45bd4655817 119 //Cada vez que termino de mostrar un LED
JuanClerici 0:a49a5f50d6bc 120 if (apagado == 0) {
JuanClerici 2:f45bd4655817 121 //Evaluo si mostre la cantidad de LEDs segun el nivel
JuanClerici 2:f45bd4655817 122 if(posSec >= nivelSec) {
JuanClerici 1:78297550b459 123 estado = ESTADO_JUEGO;
JuanClerici 0:a49a5f50d6bc 124 printf("\nA jugar Bro :) \r");
JuanClerici 0:a49a5f50d6bc 125 printf("\r\n\n");
JuanClerici 0:a49a5f50d6bc 126 espera = 0;
JuanClerici 0:a49a5f50d6bc 127 break;
JuanClerici 0:a49a5f50d6bc 128 }
JuanClerici 2:f45bd4655817 129 switch(sec[posSec]) {
JuanClerici 0:a49a5f50d6bc 130 case 1:
JuanClerici 3:1610e2f8803b 131 //Muestro LED rojo
JuanClerici 0:a49a5f50d6bc 132 leds(0b100);
JuanClerici 0:a49a5f50d6bc 133 if(times > 5) {
JuanClerici 0:a49a5f50d6bc 134 times = 0;
JuanClerici 0:a49a5f50d6bc 135 printf("ROJO\r\n");
JuanClerici 0:a49a5f50d6bc 136 apagado = 1;
JuanClerici 2:f45bd4655817 137 posSec++;
JuanClerici 0:a49a5f50d6bc 138 }
JuanClerici 0:a49a5f50d6bc 139 break;
JuanClerici 0:a49a5f50d6bc 140 case 2:
JuanClerici 3:1610e2f8803b 141 //Muestro LED verde
JuanClerici 0:a49a5f50d6bc 142 leds(0b010);
JuanClerici 0:a49a5f50d6bc 143 if(times > 5) {
JuanClerici 0:a49a5f50d6bc 144 apagado = 1;
JuanClerici 0:a49a5f50d6bc 145 times = 0;
JuanClerici 0:a49a5f50d6bc 146 printf("VERDE\r\n");
JuanClerici 2:f45bd4655817 147 posSec++;
JuanClerici 0:a49a5f50d6bc 148 }
JuanClerici 0:a49a5f50d6bc 149 break;
JuanClerici 0:a49a5f50d6bc 150 case 3:
JuanClerici 3:1610e2f8803b 151 //Muestro LED azul
JuanClerici 0:a49a5f50d6bc 152 leds(0b001);
JuanClerici 0:a49a5f50d6bc 153 if(times > 5) {
JuanClerici 0:a49a5f50d6bc 154 apagado = 1;
JuanClerici 0:a49a5f50d6bc 155 times = 0;
JuanClerici 0:a49a5f50d6bc 156 printf("AZUL\r\n");
JuanClerici 2:f45bd4655817 157 posSec++;
JuanClerici 0:a49a5f50d6bc 158 }
JuanClerici 0:a49a5f50d6bc 159 break;
JuanClerici 0:a49a5f50d6bc 160 }
JuanClerici 0:a49a5f50d6bc 161 } else {
JuanClerici 2:f45bd4655817 162 //Dejo un espacio apagado entre los colores de las secuencias
JuanClerici 0:a49a5f50d6bc 163 leds(0b000);
JuanClerici 0:a49a5f50d6bc 164 if (times > 5) {
JuanClerici 0:a49a5f50d6bc 165 times = 0;
JuanClerici 0:a49a5f50d6bc 166 apagado = 0;
JuanClerici 0:a49a5f50d6bc 167 }
JuanClerici 0:a49a5f50d6bc 168 }
JuanClerici 0:a49a5f50d6bc 169 } else {
JuanClerici 2:f45bd4655817 170 //Espero 5 times el ultimo LED encendido y lo apago
JuanClerici 0:a49a5f50d6bc 171 if (times > 5)
JuanClerici 0:a49a5f50d6bc 172 leds(0b000);
JuanClerici 2:f45bd4655817 173 //Espero 5 times mas para separar el final de muestreo con el inicio del Juego
JuanClerici 0:a49a5f50d6bc 174 if (times > 10) {
JuanClerici 2:f45bd4655817 175 loop = 1;
JuanClerici 0:a49a5f50d6bc 176 times = 0;
JuanClerici 0:a49a5f50d6bc 177 }
JuanClerici 0:a49a5f50d6bc 178 }
JuanClerici 0:a49a5f50d6bc 179 break;
JuanClerici 1:78297550b459 180 case ESTADO_JUEGO:
JuanClerici 3:1610e2f8803b 181 //Detecto si el jugador tarda mucho tiempo en apretar un boton
JuanClerici 0:a49a5f50d6bc 182 if (espera > 50) {
JuanClerici 0:a49a5f50d6bc 183 printf("Tardaste demaciado tiempo en elegir\r\n");
JuanClerici 1:78297550b459 184 estado = ESTADO_PERDER;
JuanClerici 0:a49a5f50d6bc 185 break;
JuanClerici 0:a49a5f50d6bc 186 }
JuanClerici 2:f45bd4655817 187 //Detecto un cambio en los pulsadores
JuanClerici 0:a49a5f50d6bc 188 if(flagPulsador) {
JuanClerici 0:a49a5f50d6bc 189 espera = 0;
JuanClerici 0:a49a5f50d6bc 190 flagPulsador = 0;
JuanClerici 0:a49a5f50d6bc 191 times = 0;
JuanClerici 2:f45bd4655817 192 //Detecto que pulsador precionaron y enciendo el LED
JuanClerici 0:a49a5f50d6bc 193 switch(pulsador) {
JuanClerici 0:a49a5f50d6bc 194 case 1:
JuanClerici 0:a49a5f50d6bc 195 printf("ROJO \r\n");
JuanClerici 0:a49a5f50d6bc 196 leds(0b100);
JuanClerici 0:a49a5f50d6bc 197 break;
JuanClerici 0:a49a5f50d6bc 198 case 2:
JuanClerici 0:a49a5f50d6bc 199 printf("VERDE \r\n");
JuanClerici 0:a49a5f50d6bc 200 leds(0b010);
JuanClerici 0:a49a5f50d6bc 201 break;
JuanClerici 0:a49a5f50d6bc 202 case 3:
JuanClerici 0:a49a5f50d6bc 203 printf("AZUL \r\n");
JuanClerici 0:a49a5f50d6bc 204 leds(0b001);
JuanClerici 0:a49a5f50d6bc 205 break;
JuanClerici 0:a49a5f50d6bc 206 }
JuanClerici 2:f45bd4655817 207 //Comparo si el pulsador apretado es el correcto segun la secuencia
JuanClerici 2:f45bd4655817 208 if(pulsador == sec[posJuego]) {
JuanClerici 2:f45bd4655817 209 posJuego++;
JuanClerici 2:f45bd4655817 210 //Si alcancé el nivel en el que estoy paso de nivel
JuanClerici 2:f45bd4655817 211 if(posJuego == nivelSec) {
JuanClerici 2:f45bd4655817 212 nivelSec++;
JuanClerici 0:a49a5f50d6bc 213 printf("\n\t--------------------------------\r");
JuanClerici 2:f45bd4655817 214 //Si alcancé el máximo nivel paso al estado GANAR
JuanClerici 2:f45bd4655817 215 if (nivelSec == NIVELES + 1) {
JuanClerici 1:78297550b459 216 estado = ESTADO_GANAR;
JuanClerici 0:a49a5f50d6bc 217 } else {
JuanClerici 2:f45bd4655817 218 //Si no llegué al máximo nivel paso de nivel
JuanClerici 3:1610e2f8803b 219 printf("\nPasaste al nivel %d!\r\n\n", nivelSec);
JuanClerici 2:f45bd4655817 220 posSec = 0;
JuanClerici 2:f45bd4655817 221 posJuego = 0;
JuanClerici 1:78297550b459 222 estado = ESTADO_MUESTREO;
JuanClerici 2:f45bd4655817 223 loop = 0;
JuanClerici 0:a49a5f50d6bc 224 times = 0;
JuanClerici 0:a49a5f50d6bc 225 }
JuanClerici 0:a49a5f50d6bc 226 }
JuanClerici 0:a49a5f50d6bc 227 } else {
JuanClerici 2:f45bd4655817 228 //Si el pulsador no corresponde con la secuencia paso al estado PERDER
JuanClerici 1:78297550b459 229 estado = ESTADO_PERDER;
JuanClerici 0:a49a5f50d6bc 230 }
JuanClerici 0:a49a5f50d6bc 231 }
JuanClerici 2:f45bd4655817 232 //Espero 5 times el LED encendido
JuanClerici 0:a49a5f50d6bc 233 if (times > 5) {
JuanClerici 0:a49a5f50d6bc 234 leds(0b000);
JuanClerici 0:a49a5f50d6bc 235
JuanClerici 0:a49a5f50d6bc 236 }
JuanClerici 0:a49a5f50d6bc 237 break;
JuanClerici 1:78297550b459 238 case ESTADO_PERDER:
JuanClerici 3:1610e2f8803b 239 //Prendo el LED blanco para mostrar que termino el juego y vuelvo al estado COMENZAR
JuanClerici 0:a49a5f50d6bc 240 printf("\nPerdiste Bro :(\r\n");
JuanClerici 0:a49a5f50d6bc 241 printf("Apreta cualquier boton para reiniciar!\r\n\n");
JuanClerici 0:a49a5f50d6bc 242 leds(0b111);
JuanClerici 1:78297550b459 243 estado = ESTADO_COMENZAR;
JuanClerici 1:78297550b459 244 break;
JuanClerici 1:78297550b459 245
JuanClerici 1:78297550b459 246 case ESTADO_GANAR:
JuanClerici 3:1610e2f8803b 247 //Mustro el LED blanco para mostrar que termino el juego y aviso que completo la secuencia
JuanClerici 1:78297550b459 248 printf("\nGANASTE!!! :)\r\n\n");
JuanClerici 1:78297550b459 249 printf("Apreta cualquier boton para reiniciar!\r\n\n");
JuanClerici 1:78297550b459 250 leds(0b111);
JuanClerici 1:78297550b459 251 estado = ESTADO_COMENZAR;
JuanClerici 0:a49a5f50d6bc 252 break;
JuanClerici 0:a49a5f50d6bc 253 }
JuanClerici 0:a49a5f50d6bc 254 }
JuanClerici 0:a49a5f50d6bc 255 void leds(int num)
JuanClerici 0:a49a5f50d6bc 256 {
JuanClerici 2:f45bd4655817 257 //Funcion que codifica el encendido y apagado de los LEDs
JuanClerici 0:a49a5f50d6bc 258 switch(num) {
JuanClerici 0:a49a5f50d6bc 259 case 0:
JuanClerici 0:a49a5f50d6bc 260 Rojo = 1;
JuanClerici 0:a49a5f50d6bc 261 Verde = 1;
JuanClerici 0:a49a5f50d6bc 262 Azul = 1;
JuanClerici 0:a49a5f50d6bc 263 break;
JuanClerici 0:a49a5f50d6bc 264 case 4:
JuanClerici 0:a49a5f50d6bc 265 Rojo = 0;
JuanClerici 0:a49a5f50d6bc 266 Verde = 1;
JuanClerici 0:a49a5f50d6bc 267 Azul = 1;
JuanClerici 0:a49a5f50d6bc 268 break;
JuanClerici 0:a49a5f50d6bc 269 case 2:
JuanClerici 0:a49a5f50d6bc 270 Rojo = 1;
JuanClerici 0:a49a5f50d6bc 271 Verde = 0;
JuanClerici 0:a49a5f50d6bc 272 Azul = 1;
JuanClerici 0:a49a5f50d6bc 273 break;
JuanClerici 0:a49a5f50d6bc 274 case 1:
JuanClerici 0:a49a5f50d6bc 275 Rojo = 1;
JuanClerici 0:a49a5f50d6bc 276 Verde = 1;
JuanClerici 0:a49a5f50d6bc 277 Azul = 0;
JuanClerici 0:a49a5f50d6bc 278 break;
JuanClerici 0:a49a5f50d6bc 279 case 7:
JuanClerici 0:a49a5f50d6bc 280 Rojo = 0;
JuanClerici 0:a49a5f50d6bc 281 Verde = 0;
JuanClerici 0:a49a5f50d6bc 282 Azul = 0;
JuanClerici 0:a49a5f50d6bc 283 break;
JuanClerici 0:a49a5f50d6bc 284 }
JuanClerici 0:a49a5f50d6bc 285 }
JuanClerici 0:a49a5f50d6bc 286
JuanClerici 0:a49a5f50d6bc 287 char Pulsador()
JuanClerici 0:a49a5f50d6bc 288 {
JuanClerici 2:f45bd4655817 289 //Funcion que aciva un flag con el cambio del pulsador y guarda el pulsado en una variable
JuanClerici 0:a49a5f50d6bc 290 pulsador = 0;
JuanClerici 1:78297550b459 291
JuanClerici 3:1610e2f8803b 292 if (PR.rising()) {
JuanClerici 3:1610e2f8803b 293 flagPulsador = 1;
JuanClerici 3:1610e2f8803b 294 pulsador = 1;
JuanClerici 3:1610e2f8803b 295 return 0;
JuanClerici 3:1610e2f8803b 296 }
JuanClerici 0:a49a5f50d6bc 297 if (PV.rising()) {
JuanClerici 0:a49a5f50d6bc 298 flagPulsador = 1;
JuanClerici 0:a49a5f50d6bc 299 pulsador = 2;
JuanClerici 0:a49a5f50d6bc 300 return 0;
JuanClerici 0:a49a5f50d6bc 301 }
JuanClerici 0:a49a5f50d6bc 302 if (PA.rising()) {
JuanClerici 0:a49a5f50d6bc 303 flagPulsador = 1;
JuanClerici 0:a49a5f50d6bc 304 pulsador = 3;
JuanClerici 0:a49a5f50d6bc 305 return 0;
JuanClerici 0:a49a5f50d6bc 306 }
JuanClerici 1:78297550b459 307
JuanClerici 0:a49a5f50d6bc 308 pulsador = 0;
JuanClerici 0:a49a5f50d6bc 309 flagPulsador = 0;
JuanClerici 0:a49a5f50d6bc 310 return 0;
JuanClerici 0:a49a5f50d6bc 311 }
JuanClerici 0:a49a5f50d6bc 312
JuanClerici 0:a49a5f50d6bc 313 void invierte()
JuanClerici 0:a49a5f50d6bc 314 {
JuanClerici 2:f45bd4655817 315 //Funcion que detecta las interrupciones del timer
JuanClerici 0:a49a5f50d6bc 316 times++;
JuanClerici 0:a49a5f50d6bc 317 semilla ++;
JuanClerici 0:a49a5f50d6bc 318 espera++;
JuanClerici 0:a49a5f50d6bc 319 }