EJERCICIO SIMON: Axel Oropeza Matias Rodriguez

Dependencies:   mbed tsi_sensor

Committer:
matirodriguez
Date:
Sat Jun 08 15:22:16 2019 +0000
Revision:
2:90667b428ce6
Parent:
1:f6ea213ed382
Ejercicio "SIMON" terminado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
matirodriguez 0:fd466ee999a6 1 #include "mbed.h"
matirodriguez 0:fd466ee999a6 2 #include "tsi_sensor.h"
matirodriguez 0:fd466ee999a6 3
matirodriguez 0:fd466ee999a6 4 #define ELEC0 9
matirodriguez 0:fd466ee999a6 5 #define ELEC1 10
matirodriguez 0:fd466ee999a6 6
matirodriguez 0:fd466ee999a6 7 /* Defino esas palabras que luego usaré para
matirodriguez 0:fd466ee999a6 8 lo que se pulsa en el TSI como numeros usando la funcion
matirodriguez 0:fd466ee999a6 9 "enum{}"
matirodriguez 0:fd466ee999a6 10 */
matirodriguez 0:fd466ee999a6 11 enum {NADA,
matirodriguez 0:fd466ee999a6 12 ROJO,
matirodriguez 0:fd466ee999a6 13 VERDE,
matirodriguez 0:fd466ee999a6 14 AZUL
matirodriguez 0:fd466ee999a6 15 };
matirodriguez 0:fd466ee999a6 16 /* Defino los nombres de los estados como
matirodriguez 0:fd466ee999a6 17 numeros enteros con la funcion "enum{}"
matirodriguez 0:fd466ee999a6 18 */
matirodriguez 0:fd466ee999a6 19
matirodriguez 1:f6ea213ed382 20 //Maquina "MAQ_SECUENCIA()"
matirodriguez 0:fd466ee999a6 21 enum {ESPERO_USUARIO,
matirodriguez 0:fd466ee999a6 22 MUESTRO_SECUENCIA,
matirodriguez 0:fd466ee999a6 23 COMPARO_SECUENCIA
matirodriguez 0:fd466ee999a6 24 };
matirodriguez 2:90667b428ce6 25
matirodriguez 1:f6ea213ed382 26 //Maquina "MAQ_MUESTREO()"
matirodriguez 0:fd466ee999a6 27 enum {ESPERO_HAB,
matirodriguez 0:fd466ee999a6 28 MUESTRO,
matirodriguez 0:fd466ee999a6 29 APAGO
matirodriguez 0:fd466ee999a6 30 };
matirodriguez 2:90667b428ce6 31
matirodriguez 1:f6ea213ed382 32 //Maquina "MAQ_COMPARO()"
matirodriguez 0:fd466ee999a6 33 enum {ESPERAR_HAB,
matirodriguez 0:fd466ee999a6 34 ESPERAR_USUARIO,
matirodriguez 0:fd466ee999a6 35 COMPARO
matirodriguez 0:fd466ee999a6 36 };
matirodriguez 2:90667b428ce6 37
matirodriguez 0:fd466ee999a6 38 #define ERROR 15
matirodriguez 0:fd466ee999a6 39 #define CORRECTO 24
matirodriguez 0:fd466ee999a6 40
matirodriguez 0:fd466ee999a6 41 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
matirodriguez 0:fd466ee999a6 42
matirodriguez 0:fd466ee999a6 43 // Prototipos de funciones de maquinas de estados
matirodriguez 0:fd466ee999a6 44 void MAQ_SECUENCIA();
matirodriguez 0:fd466ee999a6 45 void MAQ_MUESTREO();
matirodriguez 0:fd466ee999a6 46 void MAQ_COMPARO();
matirodriguez 0:fd466ee999a6 47
matirodriguez 0:fd466ee999a6 48 void MAQ_lecturaTSI();
matirodriguez 0:fd466ee999a6 49
matirodriguez 0:fd466ee999a6 50 void LEER_TSI(); //Prototipo funcion de lectura del TSI
matirodriguez 1:f6ea213ed382 51 void LED_1SEG(); //Prototipo funcion para prender y apagar led cada 1 segundo
matirodriguez 0:fd466ee999a6 52
matirodriguez 1:f6ea213ed382 53 void pulsacion_TSI(); //Prototipo funcion para leer 1 solo valor del TSI cada 2.5mseg
matirodriguez 0:fd466ee999a6 54
matirodriguez 0:fd466ee999a6 55 void genero_secuencia(); // Funcion que utilizo para generar la secuencia aleatoria.
matirodriguez 0:fd466ee999a6 56
matirodriguez 2:90667b428ce6 57 void apago_leds();
matirodriguez 2:90667b428ce6 58
matirodriguez 2:90667b428ce6 59 void cambio_estado();
matirodriguez 2:90667b428ce6 60
matirodriguez 0:fd466ee999a6 61 //Variables que indican el estado de las maquinas (empiezo en estado de reset)
matirodriguez 0:fd466ee999a6 62 int estado_maq_sec = ESPERO_USUARIO;
matirodriguez 0:fd466ee999a6 63 int estado_maq_mues = ESPERO_HAB;
matirodriguez 0:fd466ee999a6 64 int estado_maq_comp = ESPERAR_HAB;
matirodriguez 0:fd466ee999a6 65
matirodriguez 0:fd466ee999a6 66 int estado_maq_tsi = NADA;
matirodriguez 0:fd466ee999a6 67
matirodriguez 0:fd466ee999a6 68 //Variables que habilitan maquinas de estados
matirodriguez 0:fd466ee999a6 69 int hab_mostrar = 0;
matirodriguez 0:fd466ee999a6 70 int hab_comparo = 0;
matirodriguez 0:fd466ee999a6 71
matirodriguez 0:fd466ee999a6 72 //Variables que me indican el fin de una maquina de estados
matirodriguez 0:fd466ee999a6 73 int fin_mostrar = 0;
matirodriguez 0:fd466ee999a6 74 int fin_comparo = 0;
matirodriguez 0:fd466ee999a6 75
matirodriguez 0:fd466ee999a6 76 //Variables que acumulan datos
matirodriguez 0:fd466ee999a6 77 int color[25]; //Esta variable contendrá toda la secuencia aleatoria de 24 valores (no voy a usar el valor 0).
matirodriguez 1:f6ea213ed382 78 int nivel = 0; //Esta variable me indica el nivel actual
matirodriguez 1:f6ea213ed382 79 int tiempo_muestreo = 0; // Variable para contar el 1 segundo para el encendido y apagado de leds
matirodriguez 1:f6ea213ed382 80 int var_pulsacion = 25; // Variable para contar los 2.5mseg de la funcion pulsacion_TSI()
matirodriguez 0:fd466ee999a6 81
matirodriguez 1:f6ea213ed382 82 int color_teclado = NADA; // Variable que contiene el valor del TSI en todo momento
matirodriguez 1:f6ea213ed382 83 int ingreso = NADA; // Variable que contiene el color presionado en el TSI, que se lee y luego es borrado
matirodriguez 0:fd466ee999a6 84
matirodriguez 1:f6ea213ed382 85 Ticker lectura; // Ticker lectura del TSI
matirodriguez 1:f6ea213ed382 86 Ticker temporizador; // Ticker para contar 1 segundo en los leds
matirodriguez 1:f6ea213ed382 87 Ticker pulsacion; // Ticker para usar la funcion pulsacion_TSI()
matirodriguez 0:fd466ee999a6 88
matirodriguez 2:90667b428ce6 89 Timeout apago;
matirodriguez 2:90667b428ce6 90 Timeout estado; // Una pequeña demora que agrego entre que comparo y muestro los niveles del juego
matirodriguez 2:90667b428ce6 91
matirodriguez 0:fd466ee999a6 92 // DEFINO SALIDAS
matirodriguez 0:fd466ee999a6 93 DigitalOut ledrojo(LED_RED);
matirodriguez 0:fd466ee999a6 94 DigitalOut ledverde(LED_GREEN);
matirodriguez 0:fd466ee999a6 95 DigitalOut ledazul(LED_BLUE);
matirodriguez 1:f6ea213ed382 96
matirodriguez 1:f6ea213ed382 97 AnalogIn noise(PTB0); // Entrada que usaré para generar la secuencia aleatoria con el ruido que me genere
matirodriguez 0:fd466ee999a6 98
matirodriguez 0:fd466ee999a6 99 int main(void)
matirodriguez 0:fd466ee999a6 100 {
matirodriguez 0:fd466ee999a6 101
matirodriguez 1:f6ea213ed382 102 // Uno las funciones con el ticker correspondiente
matirodriguez 2:90667b428ce6 103 lectura.attach(&LEER_TSI,0.1);
matirodriguez 2:90667b428ce6 104 pulsacion.attach(&pulsacion_TSI,0.001);
matirodriguez 2:90667b428ce6 105 temporizador.attach(&LED_1SEG,0.01);
matirodriguez 0:fd466ee999a6 106
matirodriguez 1:f6ea213ed382 107 // Apago los leds al iniciar
matirodriguez 0:fd466ee999a6 108 ledrojo = 1;
matirodriguez 0:fd466ee999a6 109 ledverde= 1;
matirodriguez 0:fd466ee999a6 110 ledazul = 1;
matirodriguez 0:fd466ee999a6 111
matirodriguez 0:fd466ee999a6 112 while (true) {
matirodriguez 0:fd466ee999a6 113
matirodriguez 1:f6ea213ed382 114 // Constantemente uso las maquinas de estados
matirodriguez 1:f6ea213ed382 115
matirodriguez 0:fd466ee999a6 116 MAQ_lecturaTSI();
matirodriguez 0:fd466ee999a6 117
matirodriguez 0:fd466ee999a6 118 MAQ_SECUENCIA();
matirodriguez 0:fd466ee999a6 119
matirodriguez 0:fd466ee999a6 120 MAQ_MUESTREO();
matirodriguez 0:fd466ee999a6 121
matirodriguez 0:fd466ee999a6 122 MAQ_COMPARO();
matirodriguez 0:fd466ee999a6 123
matirodriguez 0:fd466ee999a6 124 }
matirodriguez 0:fd466ee999a6 125 }
matirodriguez 0:fd466ee999a6 126
matirodriguez 2:90667b428ce6 127 void apago_leds(){
matirodriguez 2:90667b428ce6 128 ledrojo=1;
matirodriguez 2:90667b428ce6 129 ledverde=1;
matirodriguez 2:90667b428ce6 130 ledazul=1;
matirodriguez 2:90667b428ce6 131 }
matirodriguez 2:90667b428ce6 132
matirodriguez 0:fd466ee999a6 133 void LEER_TSI()
matirodriguez 0:fd466ee999a6 134 {
matirodriguez 0:fd466ee999a6 135 float auxiliar = 0;
matirodriguez 1:f6ea213ed382 136 auxiliar = tsi.readPercentage(); //Guardo de manera auxiliar el valor entre 0 y 1 del TSI
matirodriguez 1:f6ea213ed382 137
matirodriguez 1:f6ea213ed382 138 // Asocio el valor del tsi numerico con un color, dividiendo en 4 valores posibles (0, <0.33, <0.66, <1)
matirodriguez 0:fd466ee999a6 139
matirodriguez 0:fd466ee999a6 140 if(auxiliar == 0) {
matirodriguez 0:fd466ee999a6 141 color_teclado = NADA;
matirodriguez 0:fd466ee999a6 142 }
matirodriguez 0:fd466ee999a6 143
matirodriguez 2:90667b428ce6 144 if((auxiliar > 0.05)&&(auxiliar < 0.30)) {
matirodriguez 0:fd466ee999a6 145 color_teclado = ROJO;
matirodriguez 0:fd466ee999a6 146 }
matirodriguez 0:fd466ee999a6 147
matirodriguez 2:90667b428ce6 148 if((auxiliar >= 0.38)&&(auxiliar <= 0.60)) {
matirodriguez 0:fd466ee999a6 149 color_teclado = VERDE;
matirodriguez 0:fd466ee999a6 150 }
matirodriguez 0:fd466ee999a6 151
matirodriguez 2:90667b428ce6 152 if((auxiliar > 0.68)&&(auxiliar <= 1)) {
matirodriguez 0:fd466ee999a6 153 color_teclado = AZUL;
matirodriguez 0:fd466ee999a6 154 }
matirodriguez 0:fd466ee999a6 155 }
matirodriguez 0:fd466ee999a6 156
matirodriguez 0:fd466ee999a6 157 void pulsacion_TSI()
matirodriguez 0:fd466ee999a6 158 {
matirodriguez 0:fd466ee999a6 159 if(var_pulsacion > 0) {
matirodriguez 0:fd466ee999a6 160 var_pulsacion--;
matirodriguez 0:fd466ee999a6 161 }
matirodriguez 0:fd466ee999a6 162 }
matirodriguez 0:fd466ee999a6 163
matirodriguez 0:fd466ee999a6 164 void MAQ_lecturaTSI()
matirodriguez 0:fd466ee999a6 165 {
matirodriguez 1:f6ea213ed382 166 if(var_pulsacion < 1) { // Si se llegaron a los 2.5ms:
matirodriguez 1:f6ea213ed382 167 var_pulsacion = 25; // Vuelvo a establecer 2.5ms para el proximo ciclo
matirodriguez 0:fd466ee999a6 168 switch(estado_maq_tsi) {
matirodriguez 0:fd466ee999a6 169 case NADA:
matirodriguez 1:f6ea213ed382 170 ingreso = NADA; // La variable ingreso, salvo en los casos especificos, siempre se encontrará en NADA
matirodriguez 1:f6ea213ed382 171
matirodriguez 1:f6ea213ed382 172 // En vez de usar cadenas de if en las transiciones, utilizo un switch
matirodriguez 1:f6ea213ed382 173
matirodriguez 0:fd466ee999a6 174 switch(color_teclado) {
matirodriguez 0:fd466ee999a6 175 case ROJO:
matirodriguez 0:fd466ee999a6 176 estado_maq_tsi = ROJO;
matirodriguez 0:fd466ee999a6 177 ingreso = ROJO;
matirodriguez 0:fd466ee999a6 178 break;
matirodriguez 0:fd466ee999a6 179 case VERDE:
matirodriguez 0:fd466ee999a6 180 estado_maq_tsi = VERDE;
matirodriguez 0:fd466ee999a6 181 ingreso = VERDE;
matirodriguez 0:fd466ee999a6 182 break;
matirodriguez 0:fd466ee999a6 183 case AZUL:
matirodriguez 0:fd466ee999a6 184 estado_maq_tsi = AZUL;
matirodriguez 0:fd466ee999a6 185 ingreso = AZUL;
matirodriguez 0:fd466ee999a6 186 break;
matirodriguez 0:fd466ee999a6 187 }
matirodriguez 0:fd466ee999a6 188 break;
matirodriguez 1:f6ea213ed382 189
matirodriguez 0:fd466ee999a6 190 case ROJO:
matirodriguez 0:fd466ee999a6 191 switch(color_teclado) {
matirodriguez 0:fd466ee999a6 192 case NADA:
matirodriguez 0:fd466ee999a6 193 estado_maq_tsi = NADA;
matirodriguez 0:fd466ee999a6 194 break;
matirodriguez 0:fd466ee999a6 195 case VERDE:
matirodriguez 0:fd466ee999a6 196 estado_maq_tsi = VERDE;
matirodriguez 0:fd466ee999a6 197 ingreso = VERDE;
matirodriguez 0:fd466ee999a6 198 break;
matirodriguez 0:fd466ee999a6 199 case AZUL:
matirodriguez 0:fd466ee999a6 200 estado_maq_tsi = AZUL;
matirodriguez 0:fd466ee999a6 201 ingreso = AZUL;
matirodriguez 0:fd466ee999a6 202 break;
matirodriguez 0:fd466ee999a6 203 }
matirodriguez 0:fd466ee999a6 204 break;
matirodriguez 1:f6ea213ed382 205
matirodriguez 0:fd466ee999a6 206 case VERDE:
matirodriguez 0:fd466ee999a6 207 switch(color_teclado) {
matirodriguez 0:fd466ee999a6 208 case NADA:
matirodriguez 0:fd466ee999a6 209 estado_maq_tsi = NADA;
matirodriguez 0:fd466ee999a6 210 break;
matirodriguez 0:fd466ee999a6 211 case ROJO:
matirodriguez 0:fd466ee999a6 212 estado_maq_tsi = ROJO;
matirodriguez 0:fd466ee999a6 213 ingreso = ROJO;
matirodriguez 0:fd466ee999a6 214 break;
matirodriguez 0:fd466ee999a6 215 case AZUL:
matirodriguez 0:fd466ee999a6 216 estado_maq_tsi = AZUL;
matirodriguez 0:fd466ee999a6 217 ingreso = AZUL;
matirodriguez 0:fd466ee999a6 218 break;
matirodriguez 0:fd466ee999a6 219 }
matirodriguez 0:fd466ee999a6 220 break;
matirodriguez 1:f6ea213ed382 221
matirodriguez 0:fd466ee999a6 222 case AZUL:
matirodriguez 0:fd466ee999a6 223 switch(color_teclado) {
matirodriguez 0:fd466ee999a6 224 case NADA:
matirodriguez 0:fd466ee999a6 225 estado_maq_tsi = NADA;
matirodriguez 0:fd466ee999a6 226 break;
matirodriguez 0:fd466ee999a6 227 case ROJO:
matirodriguez 0:fd466ee999a6 228 estado_maq_tsi = ROJO;
matirodriguez 0:fd466ee999a6 229 ingreso = ROJO;
matirodriguez 0:fd466ee999a6 230 break;
matirodriguez 0:fd466ee999a6 231 case VERDE:
matirodriguez 0:fd466ee999a6 232 estado_maq_tsi = VERDE;
matirodriguez 0:fd466ee999a6 233 ingreso = VERDE;
matirodriguez 0:fd466ee999a6 234 break;
matirodriguez 0:fd466ee999a6 235 }
matirodriguez 0:fd466ee999a6 236 break;
matirodriguez 0:fd466ee999a6 237 }
matirodriguez 0:fd466ee999a6 238 }
matirodriguez 0:fd466ee999a6 239 }
matirodriguez 0:fd466ee999a6 240
matirodriguez 0:fd466ee999a6 241 void LED_1SEG()
matirodriguez 0:fd466ee999a6 242 {
matirodriguez 0:fd466ee999a6 243 if(tiempo_muestreo >= 0) {
matirodriguez 0:fd466ee999a6 244 tiempo_muestreo--;
matirodriguez 0:fd466ee999a6 245 }
matirodriguez 0:fd466ee999a6 246 }
matirodriguez 0:fd466ee999a6 247
matirodriguez 0:fd466ee999a6 248
matirodriguez 0:fd466ee999a6 249 void MAQ_SECUENCIA()
matirodriguez 0:fd466ee999a6 250 {
matirodriguez 0:fd466ee999a6 251
matirodriguez 0:fd466ee999a6 252 switch(estado_maq_sec) { //El switch variará entre los distintos estados de mi maquina (los numeros correspondientes se encuentran en el "enum{}" al inicio del codigo)
matirodriguez 0:fd466ee999a6 253
matirodriguez 0:fd466ee999a6 254 case ESPERO_USUARIO:
matirodriguez 1:f6ea213ed382 255 if(ingreso != NADA) { // Si se presiona algo:
matirodriguez 1:f6ea213ed382 256 genero_secuencia(); // Genero la secuencia
matirodriguez 1:f6ea213ed382 257 nivel++; // Sumo 1 a "nivel" asi comienzo por el nivel 1
matirodriguez 1:f6ea213ed382 258 hab_mostrar = 1; // Habilito la maquina de estados que muestra los colores
matirodriguez 1:f6ea213ed382 259 estado_maq_sec = MUESTRO_SECUENCIA; // Cambio de estado
matirodriguez 1:f6ea213ed382 260 ingreso = NADA; // Reseteo la variable que contenia el color presionado
matirodriguez 1:f6ea213ed382 261 ledrojo=1;
matirodriguez 1:f6ea213ed382 262 ledazul=1;
matirodriguez 1:f6ea213ed382 263 ledverde=1;
matirodriguez 0:fd466ee999a6 264 }
matirodriguez 0:fd466ee999a6 265 break;
matirodriguez 0:fd466ee999a6 266
matirodriguez 0:fd466ee999a6 267 case MUESTRO_SECUENCIA:
matirodriguez 0:fd466ee999a6 268
matirodriguez 1:f6ea213ed382 269 if(fin_mostrar == 1) { // Si se terminó la maquina de estados que muestra:
matirodriguez 1:f6ea213ed382 270 fin_mostrar = 0; // Vacio la variable que me lo indicó,
matirodriguez 1:f6ea213ed382 271 estado_maq_sec = COMPARO_SECUENCIA; // cambio de estado y
matirodriguez 1:f6ea213ed382 272 hab_comparo = 1; // habilito la maquina que compara
matirodriguez 0:fd466ee999a6 273 }
matirodriguez 0:fd466ee999a6 274
matirodriguez 0:fd466ee999a6 275 break;
matirodriguez 0:fd466ee999a6 276
matirodriguez 0:fd466ee999a6 277 case COMPARO_SECUENCIA:
matirodriguez 0:fd466ee999a6 278
matirodriguez 1:f6ea213ed382 279 if(fin_comparo == CORRECTO) { // Si el usuario no se equivocó:
matirodriguez 1:f6ea213ed382 280 if(nivel == 25) { // y se llego al maximo de niveles:
matirodriguez 1:f6ea213ed382 281 fin_comparo = 0; // Vacio la variable
matirodriguez 1:f6ea213ed382 282 estado_maq_sec = ESPERO_USUARIO; // Cambio al estado de inicio
matirodriguez 1:f6ea213ed382 283 nivel = 0; // y reseteo todos los niveles
matirodriguez 1:f6ea213ed382 284 ledverde=0; //Prendo leds para indicar que gané
matirodriguez 1:f6ea213ed382 285 ledazul=0;
matirodriguez 1:f6ea213ed382 286 }
matirodriguez 1:f6ea213ed382 287 if(nivel < 25) { // Si en cambio faltan niveles:
matirodriguez 1:f6ea213ed382 288 fin_comparo = 0; // Vacio la variable
matirodriguez 1:f6ea213ed382 289 estado_maq_sec = MUESTRO_SECUENCIA; // Vuelvo al estado de mostrar
matirodriguez 1:f6ea213ed382 290 hab_mostrar = 1; // Habilito esa maquina
matirodriguez 1:f6ea213ed382 291 nivel++; // Y subo 1 nivel
matirodriguez 1:f6ea213ed382 292 }
matirodriguez 1:f6ea213ed382 293 }
matirodriguez 1:f6ea213ed382 294 if(fin_comparo == ERROR) {
matirodriguez 0:fd466ee999a6 295 fin_comparo = 0;
matirodriguez 1:f6ea213ed382 296 estado_maq_sec = ESPERO_USUARIO;
matirodriguez 1:f6ea213ed382 297 nivel = 0;
matirodriguez 1:f6ea213ed382 298 ledrojo=0; // Prendo el leds para indicar que se perdió
matirodriguez 1:f6ea213ed382 299 ledazul = 0;
matirodriguez 0:fd466ee999a6 300 }
matirodriguez 0:fd466ee999a6 301 break;
matirodriguez 0:fd466ee999a6 302 }
matirodriguez 0:fd466ee999a6 303 }
matirodriguez 0:fd466ee999a6 304
matirodriguez 0:fd466ee999a6 305 void MAQ_MUESTREO()
matirodriguez 0:fd466ee999a6 306 {
matirodriguez 0:fd466ee999a6 307
matirodriguez 0:fd466ee999a6 308 static int nivel_mostrado; // Variable que voy a tener para saber que nivel estoy mostrando en los leds ahora
matirodriguez 0:fd466ee999a6 309
matirodriguez 0:fd466ee999a6 310 switch(estado_maq_mues) { // Uso un switch para variar entre los estados de la maquina
matirodriguez 0:fd466ee999a6 311
matirodriguez 0:fd466ee999a6 312 case ESPERO_HAB:
matirodriguez 0:fd466ee999a6 313
matirodriguez 0:fd466ee999a6 314 nivel_mostrado = 1; // El primer nivel que muestro es 1, asi que reseteo esta variable cada vez que paso por este estado
matirodriguez 0:fd466ee999a6 315
matirodriguez 0:fd466ee999a6 316 if(hab_mostrar == 1) { // Cuando recibo la habilitacion de la otra maquina de estados:
matirodriguez 0:fd466ee999a6 317
matirodriguez 0:fd466ee999a6 318 estado_maq_mues = MUESTRO; // Cambio de estado y
matirodriguez 0:fd466ee999a6 319 tiempo_muestreo = 100; // Establezco el tiempo en 1 seg (0.01seg * 100 = 1seg)
matirodriguez 0:fd466ee999a6 320 hab_mostrar = 0;
matirodriguez 0:fd466ee999a6 321
matirodriguez 0:fd466ee999a6 322 }
matirodriguez 0:fd466ee999a6 323 break;
matirodriguez 0:fd466ee999a6 324
matirodriguez 0:fd466ee999a6 325 case MUESTRO:
matirodriguez 0:fd466ee999a6 326
matirodriguez 0:fd466ee999a6 327 switch(color[nivel_mostrado]) { // Muestro el color correspondiente al primer nivel, y voy cambiando cada 2 segundos
matirodriguez 0:fd466ee999a6 328 case ROJO:
matirodriguez 0:fd466ee999a6 329 ledrojo = 0;
matirodriguez 2:90667b428ce6 330 ledverde=1;
matirodriguez 2:90667b428ce6 331 ledazul=1;
matirodriguez 0:fd466ee999a6 332 break;
matirodriguez 0:fd466ee999a6 333
matirodriguez 0:fd466ee999a6 334 case VERDE:
matirodriguez 0:fd466ee999a6 335 ledverde = 0;
matirodriguez 2:90667b428ce6 336 ledazul=1;
matirodriguez 2:90667b428ce6 337 ledrojo=1;
matirodriguez 0:fd466ee999a6 338 break;
matirodriguez 0:fd466ee999a6 339
matirodriguez 0:fd466ee999a6 340 case AZUL:
matirodriguez 0:fd466ee999a6 341 ledazul = 0;
matirodriguez 2:90667b428ce6 342 ledrojo=1;
matirodriguez 2:90667b428ce6 343 ledverde=1;
matirodriguez 0:fd466ee999a6 344 break;
matirodriguez 0:fd466ee999a6 345 }
matirodriguez 0:fd466ee999a6 346
matirodriguez 0:fd466ee999a6 347 if(tiempo_muestreo == 0) { // Si pasó 1 segundo, reseteo el tiempo y cambio de estado
matirodriguez 0:fd466ee999a6 348 tiempo_muestreo = 100; // Establezco el tiempo en 1 segundo otra vez
matirodriguez 0:fd466ee999a6 349 estado_maq_mues = APAGO; // Cambio de estado
matirodriguez 0:fd466ee999a6 350 }
matirodriguez 0:fd466ee999a6 351 break;
matirodriguez 0:fd466ee999a6 352
matirodriguez 0:fd466ee999a6 353 case APAGO:
matirodriguez 0:fd466ee999a6 354
matirodriguez 0:fd466ee999a6 355 switch(color[nivel_mostrado]) { // Ahora voy a apagar el led correspondiente al nivel que se esta mostrando.
matirodriguez 0:fd466ee999a6 356 case ROJO:
matirodriguez 0:fd466ee999a6 357 ledrojo = 1;
matirodriguez 0:fd466ee999a6 358 break;
matirodriguez 0:fd466ee999a6 359 case VERDE:
matirodriguez 0:fd466ee999a6 360 ledverde = 1;
matirodriguez 0:fd466ee999a6 361 break;
matirodriguez 0:fd466ee999a6 362 case AZUL:
matirodriguez 0:fd466ee999a6 363 ledazul = 1;
matirodriguez 0:fd466ee999a6 364 break;
matirodriguez 0:fd466ee999a6 365 }
matirodriguez 1:f6ea213ed382 366 if(tiempo_muestreo == 0) { // Si paso el tiempo
matirodriguez 1:f6ea213ed382 367 if(nivel_mostrado == nivel) { // Y no faltan niveles
matirodriguez 1:f6ea213ed382 368 nivel_mostrado = 1; // Reseteo el nivel a mostrar
matirodriguez 1:f6ea213ed382 369 estado_maq_mues = ESPERO_HAB; // Vuelvo a esperar la habilitacion
matirodriguez 1:f6ea213ed382 370 fin_mostrar = 1; // Y marco que termino la maquina de estados
matirodriguez 0:fd466ee999a6 371 } else {
matirodriguez 1:f6ea213ed382 372 estado_maq_mues = MUESTRO; // Si en cambio faltan niveles, vuelvo a mostrar
matirodriguez 1:f6ea213ed382 373 nivel_mostrado++; // Y muestro el siguiente
matirodriguez 1:f6ea213ed382 374 tiempo_muestreo = 100; // Reseteo el tiempo (1 segundo)
matirodriguez 0:fd466ee999a6 375 }
matirodriguez 0:fd466ee999a6 376 }
matirodriguez 0:fd466ee999a6 377 break;
matirodriguez 0:fd466ee999a6 378 }
matirodriguez 0:fd466ee999a6 379 }
matirodriguez 0:fd466ee999a6 380
matirodriguez 0:fd466ee999a6 381 void MAQ_COMPARO()
matirodriguez 0:fd466ee999a6 382 {
matirodriguez 0:fd466ee999a6 383
matirodriguez 0:fd466ee999a6 384
matirodriguez 0:fd466ee999a6 385 static int nivel_comparado; // Variable que voy a usar para comparar todos los niveles sucesivamente, con lo que se vaya ingresando en el TSI
matirodriguez 1:f6ea213ed382 386 static int obtenido = NADA; // En esta variable voy a guardar lo que se ingrese para poder resetear la variable que me lo indica y no perder la informacion
matirodriguez 0:fd466ee999a6 387
matirodriguez 0:fd466ee999a6 388 switch(estado_maq_comp) {
matirodriguez 0:fd466ee999a6 389 case ESPERAR_HAB:
matirodriguez 0:fd466ee999a6 390
matirodriguez 0:fd466ee999a6 391 nivel_comparado = 1; // Establezco en este estado el primer nivel que se va a comparar (el 1)
matirodriguez 0:fd466ee999a6 392
matirodriguez 0:fd466ee999a6 393 if(hab_comparo == 1) { // Si recibí habilitacion desde la otra maquina, cambio de estado
matirodriguez 0:fd466ee999a6 394 estado_maq_comp = ESPERAR_USUARIO;
matirodriguez 0:fd466ee999a6 395 hab_comparo = 0;
matirodriguez 0:fd466ee999a6 396 }
matirodriguez 0:fd466ee999a6 397
matirodriguez 0:fd466ee999a6 398 break;
matirodriguez 0:fd466ee999a6 399
matirodriguez 0:fd466ee999a6 400 case ESPERAR_USUARIO:
matirodriguez 0:fd466ee999a6 401
matirodriguez 1:f6ea213ed382 402 if(ingreso != NADA) { // Si se ingresa algo en el TSI, lo guardo en la variable "obtenido"
matirodriguez 0:fd466ee999a6 403 obtenido = ingreso;
matirodriguez 1:f6ea213ed382 404 ingreso = NADA; // Reseteo la variable que guarda el valor del TSI
matirodriguez 0:fd466ee999a6 405 estado_maq_comp = COMPARO;
matirodriguez 0:fd466ee999a6 406 }
matirodriguez 0:fd466ee999a6 407
matirodriguez 0:fd466ee999a6 408 break;
matirodriguez 0:fd466ee999a6 409
matirodriguez 0:fd466ee999a6 410 case COMPARO: //Estado donde comparo el valor que se ingresó con el valor que corresponde
matirodriguez 0:fd466ee999a6 411
matirodriguez 1:f6ea213ed382 412 if(obtenido == color[nivel_comparado]) { // Si el resultado es igual a lo que deberia:
matirodriguez 1:f6ea213ed382 413
matirodriguez 1:f6ea213ed382 414 // Imprimo en pantalla el valor que se ingresó para comprobar
matirodriguez 0:fd466ee999a6 415 switch(color[nivel_comparado]) {
matirodriguez 0:fd466ee999a6 416 case ROJO:
matirodriguez 1:f6ea213ed382 417 printf("Rojo\n");
matirodriguez 2:90667b428ce6 418 ledrojo=0;
matirodriguez 2:90667b428ce6 419 break;
matirodriguez 2:90667b428ce6 420 case VERDE:
matirodriguez 2:90667b428ce6 421 printf("Verde\n");
matirodriguez 2:90667b428ce6 422 ledverde=0;
matirodriguez 2:90667b428ce6 423 break;
matirodriguez 2:90667b428ce6 424 case AZUL:
matirodriguez 2:90667b428ce6 425 printf("Azul\n");
matirodriguez 2:90667b428ce6 426 ledazul=0;
matirodriguez 2:90667b428ce6 427 break;
matirodriguez 2:90667b428ce6 428 }
matirodriguez 2:90667b428ce6 429 apago.attach(&apago_leds,0.5);
matirodriguez 2:90667b428ce6 430 obtenido = NADA; // Reseteo la variable
matirodriguez 2:90667b428ce6 431 if(nivel_comparado <= nivel) { // Si quedan niveles
matirodriguez 2:90667b428ce6 432
matirodriguez 2:90667b428ce6 433 estado_maq_comp = ESPERAR_USUARIO; //Vuelvo al estado de esperar que el usuario ingrese algo y
matirodriguez 2:90667b428ce6 434 nivel_comparado++; // Paso al siguiente nivel.
matirodriguez 2:90667b428ce6 435 }
matirodriguez 2:90667b428ce6 436 if(nivel_comparado > nivel) { // Si no quedan niveles
matirodriguez 2:90667b428ce6 437 estado_maq_comp = ESPERAR_HAB; // Reseteo la maquina
matirodriguez 2:90667b428ce6 438 estado.attach(&cambio_estado,1); // Indico que todo lo ingresado hasta este nivel es correcto
matirodriguez 2:90667b428ce6 439 }
matirodriguez 2:90667b428ce6 440 } else { // Si, en cambio, se ingreso algo incorrecto
matirodriguez 2:90667b428ce6 441 estado_maq_comp = ESPERAR_HAB; // Reseteo la maquina
matirodriguez 2:90667b428ce6 442 fin_comparo = ERROR; // Marco error
matirodriguez 2:90667b428ce6 443 //Imprimo en pantalla que hubo error para comprobar
matirodriguez 2:90667b428ce6 444 printf("ERROR\n");
matirodriguez 2:90667b428ce6 445
matirodriguez 2:90667b428ce6 446 // Imprimo en pantalla el valor que se ingresó para comprobar
matirodriguez 2:90667b428ce6 447 switch(color[nivel_comparado]) {
matirodriguez 2:90667b428ce6 448 case ROJO:
matirodriguez 2:90667b428ce6 449 printf("Rojo\n");
matirodriguez 0:fd466ee999a6 450 break;
matirodriguez 0:fd466ee999a6 451 case VERDE:
matirodriguez 0:fd466ee999a6 452
matirodriguez 1:f6ea213ed382 453 printf("Verde\n");
matirodriguez 0:fd466ee999a6 454 break;
matirodriguez 0:fd466ee999a6 455 case AZUL:
matirodriguez 1:f6ea213ed382 456 printf("Azul\n");
matirodriguez 0:fd466ee999a6 457 break;
matirodriguez 0:fd466ee999a6 458
matirodriguez 0:fd466ee999a6 459
matirodriguez 0:fd466ee999a6 460 }
matirodriguez 0:fd466ee999a6 461
matirodriguez 0:fd466ee999a6 462 }
matirodriguez 0:fd466ee999a6 463 break;
matirodriguez 0:fd466ee999a6 464 }
matirodriguez 0:fd466ee999a6 465 }
matirodriguez 0:fd466ee999a6 466
matirodriguez 0:fd466ee999a6 467 void genero_secuencia()
matirodriguez 0:fd466ee999a6 468 {
matirodriguez 0:fd466ee999a6 469 int auxiliar;
matirodriguez 0:fd466ee999a6 470
matirodriguez 0:fd466ee999a6 471 srand(int (noise * 10000)); // Cambio la semilla de la funcion rand usando un valor de ruido en una entrada analogica al aire
matirodriguez 0:fd466ee999a6 472
matirodriguez 0:fd466ee999a6 473 for(int i = 1; i <=25 ; i++) { // Creo un for para recorren las 25 posiciones de memoria del vector "color[]" (el valor 0 no lo utilizo)
matirodriguez 0:fd466ee999a6 474
matirodriguez 0:fd466ee999a6 475
matirodriguez 0:fd466ee999a6 476 auxiliar = rand(); //Genero un valor aleatorio y lo guardo en mi variable auxiliar
matirodriguez 0:fd466ee999a6 477
matirodriguez 0:fd466ee999a6 478 // Dependiendo de cuanto resto me de al dividir por 3, asignare ese valor aleatorio con un color
matirodriguez 0:fd466ee999a6 479 if((auxiliar % 3) == 0) {
matirodriguez 0:fd466ee999a6 480 color[i] = ROJO;
matirodriguez 0:fd466ee999a6 481 }
matirodriguez 0:fd466ee999a6 482
matirodriguez 0:fd466ee999a6 483 if((auxiliar % 3 )== 1) {
matirodriguez 0:fd466ee999a6 484 color[i] = VERDE;
matirodriguez 0:fd466ee999a6 485 }
matirodriguez 0:fd466ee999a6 486
matirodriguez 0:fd466ee999a6 487 if((auxiliar % 3 )== 2) {
matirodriguez 0:fd466ee999a6 488 color[i] = AZUL;
matirodriguez 0:fd466ee999a6 489 }
matirodriguez 0:fd466ee999a6 490 switch(color[i]) {
matirodriguez 0:fd466ee999a6 491 case ROJO:
matirodriguez 0:fd466ee999a6 492 printf("%i ROJO;",i);
matirodriguez 0:fd466ee999a6 493 break;
matirodriguez 0:fd466ee999a6 494 case VERDE:
matirodriguez 0:fd466ee999a6 495 printf("%i VERDE;",i);
matirodriguez 0:fd466ee999a6 496 break;
matirodriguez 0:fd466ee999a6 497 case AZUL:
matirodriguez 0:fd466ee999a6 498 printf("%i AZUL;",i);
matirodriguez 0:fd466ee999a6 499 break;
matirodriguez 0:fd466ee999a6 500 }
matirodriguez 0:fd466ee999a6 501 }
matirodriguez 0:fd466ee999a6 502 printf("\n");
matirodriguez 2:90667b428ce6 503 }
matirodriguez 2:90667b428ce6 504
matirodriguez 2:90667b428ce6 505 void cambio_estado(){
matirodriguez 2:90667b428ce6 506 fin_comparo = CORRECTO;
matirodriguez 0:fd466ee999a6 507 }