TP 1 Ejer 2 simon Cobas, Montero

Dependencies:   mbed tsi_sensor

Committer:
cobasjuan
Date:
Thu Jun 06 13:56:58 2019 +0000
Revision:
2:edadb31efe9b
Parent:
1:2ec64607a2a4
TP 1 Ej 2 simon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cobasjuan 0:694030aeaef8 1 #include "mbed.h"
cobasjuan 0:694030aeaef8 2 #include "tsi_sensor.h"
cobasjuan 0:694030aeaef8 3
cobasjuan 0:694030aeaef8 4 /* This defines will be replaced by PinNames soon */
cobasjuan 0:694030aeaef8 5 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
cobasjuan 0:694030aeaef8 6 #define ELEC0 9
cobasjuan 0:694030aeaef8 7 #define ELEC1 10
cobasjuan 0:694030aeaef8 8 #elif defined (TARGET_KL05Z)
cobasjuan 0:694030aeaef8 9 #define ELEC0 9
cobasjuan 0:694030aeaef8 10 #define ELEC1 8
cobasjuan 0:694030aeaef8 11 #else
cobasjuan 0:694030aeaef8 12 #error TARGET NOT DEFINED
cobasjuan 0:694030aeaef8 13 #endif
cobasjuan 0:694030aeaef8 14
cobasjuan 0:694030aeaef8 15 #define ESPERAR_A 300
cobasjuan 0:694030aeaef8 16 #define MOSTRAR 301
cobasjuan 0:694030aeaef8 17 #define ESPERO_JUG 302
cobasjuan 0:694030aeaef8 18 #define MUESTREO 303
cobasjuan 0:694030aeaef8 19 #define ESPERAR_B 304
cobasjuan 0:694030aeaef8 20 #define ESPERAR_C 305
cobasjuan 0:694030aeaef8 21 #define JUGANDO 306
cobasjuan 2:edadb31efe9b 22 #define GEN_SEC 307
cobasjuan 0:694030aeaef8 23
cobasjuan 2:edadb31efe9b 24 // Salidas
cobasjuan 0:694030aeaef8 25 DigitalOut ledr(LED1);
cobasjuan 0:694030aeaef8 26 DigitalOut ledg(LED2);
cobasjuan 0:694030aeaef8 27 DigitalOut ledb(LED3);
cobasjuan 0:694030aeaef8 28
cobasjuan 2:edadb31efe9b 29 // Funciones
cobasjuan 0:694030aeaef8 30 void GENERAL();
cobasjuan 0:694030aeaef8 31 void MOSTRAR_LED();
cobasjuan 0:694030aeaef8 32 void JUEGO();
cobasjuan 0:694030aeaef8 33 void PULSADORES();
cobasjuan 2:edadb31efe9b 34 void t();
cobasjuan 0:694030aeaef8 35
cobasjuan 2:edadb31efe9b 36 // Timer
cobasjuan 2:edadb31efe9b 37 Ticker timer;
cobasjuan 2:edadb31efe9b 38
cobasjuan 2:edadb31efe9b 39 // Variables
cobasjuan 2:edadb31efe9b 40 int secuencia[20], variable=0;
cobasjuan 0:694030aeaef8 41 int cant=0, finsec=0, n=0, P1=0, P2=0, P3=0;
cobasjuan 0:694030aeaef8 42 int habmostrar=0, habjug=0, fin_mostrar=0, finjug=0, perdiste=0;
cobasjuan 0:694030aeaef8 43 volatile unsigned int tiempo=100;
cobasjuan 0:694030aeaef8 44 static int traba=0, principio=0;
cobasjuan 0:694030aeaef8 45
cobasjuan 2:edadb31efe9b 46 // Entradas
cobasjuan 0:694030aeaef8 47 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
cobasjuan 0:694030aeaef8 48
cobasjuan 0:694030aeaef8 49 int main()
cobasjuan 0:694030aeaef8 50 {
cobasjuan 0:694030aeaef8 51 ledr=1;
cobasjuan 0:694030aeaef8 52 ledb=1;
cobasjuan 0:694030aeaef8 53 ledg=1;
cobasjuan 0:694030aeaef8 54 timer.attach(&t,0.01);
cobasjuan 0:694030aeaef8 55 while(1) {
cobasjuan 2:edadb31efe9b 56 variable++; // SEMILLA
cobasjuan 0:694030aeaef8 57 GENERAL();
cobasjuan 0:694030aeaef8 58 MOSTRAR_LED();
cobasjuan 0:694030aeaef8 59 JUEGO();
cobasjuan 0:694030aeaef8 60 PULSADORES();
cobasjuan 0:694030aeaef8 61 }
cobasjuan 0:694030aeaef8 62 }
cobasjuan 0:694030aeaef8 63
cobasjuan 0:694030aeaef8 64
cobasjuan 2:edadb31efe9b 65 void GENERAL() // Maquina de estados: funcionamiento general del programa
cobasjuan 0:694030aeaef8 66 {
cobasjuan 0:694030aeaef8 67 static int paso_a=ESPERAR_A;
cobasjuan 0:694030aeaef8 68 switch(paso_a) {
cobasjuan 2:edadb31efe9b 69 case ESPERAR_A: // RESET
cobasjuan 0:694030aeaef8 70 habmostrar=0;
cobasjuan 0:694030aeaef8 71 habjug=0;
cobasjuan 0:694030aeaef8 72 fin_mostrar=0;
cobasjuan 0:694030aeaef8 73 finjug=0;
cobasjuan 0:694030aeaef8 74 perdiste=0;
cobasjuan 0:694030aeaef8 75 cant=0;
cobasjuan 0:694030aeaef8 76 principio=0;
cobasjuan 2:edadb31efe9b 77 if((P1 == 1 || P2 == 1 || P3 == 1) && traba == 0) { // Con que el TSI detecte algo alcanza para comenzar el juego
cobasjuan 0:694030aeaef8 78 traba=1;
cobasjuan 2:edadb31efe9b 79 paso_a=GEN_SEC;
cobasjuan 0:694030aeaef8 80 principio++;
cobasjuan 0:694030aeaef8 81 printf("Inicio del juego\n\r");
cobasjuan 0:694030aeaef8 82 }
cobasjuan 0:694030aeaef8 83 break;
cobasjuan 2:edadb31efe9b 84 case GEN_SEC: // Genero una secuencia aleatoria
cobasjuan 2:edadb31efe9b 85 srand(variable);
cobasjuan 2:edadb31efe9b 86 secuencia[cant]=(rand() % 3);
cobasjuan 2:edadb31efe9b 87 paso_a=MOSTRAR;
cobasjuan 2:edadb31efe9b 88 break;
cobasjuan 2:edadb31efe9b 89 case MOSTRAR: // Habilito la maquina de estados de muestreo
cobasjuan 0:694030aeaef8 90 habmostrar=1;
cobasjuan 0:694030aeaef8 91 finjug=0;
cobasjuan 0:694030aeaef8 92 if(fin_mostrar==1) {
cobasjuan 0:694030aeaef8 93 paso_a=ESPERO_JUG;
cobasjuan 0:694030aeaef8 94 }
cobasjuan 0:694030aeaef8 95 break;
cobasjuan 2:edadb31efe9b 96 case ESPERO_JUG: // Habilito la maquina de estados de juego
cobasjuan 0:694030aeaef8 97 habjug=1;
cobasjuan 0:694030aeaef8 98 fin_mostrar=0;
cobasjuan 2:edadb31efe9b 99 if(finjug==1) { // Si se levanto el flag de final de jugada incremento el nivel
cobasjuan 0:694030aeaef8 100 cant++;
cobasjuan 2:edadb31efe9b 101 if(cant == 24){ // Si el juego llega al nivel 24 termina
cobasjuan 1:2ec64607a2a4 102 printf("Ganaste!\n\r");
cobasjuan 1:2ec64607a2a4 103 paso_a=ESPERAR_A;
cobasjuan 1:2ec64607a2a4 104 }
cobasjuan 1:2ec64607a2a4 105 else
cobasjuan 2:edadb31efe9b 106 paso_a=GEN_SEC;
cobasjuan 0:694030aeaef8 107 }
cobasjuan 2:edadb31efe9b 108 if(perdiste==1) { // Si se levanta el flag de partida perdida reinicio el juego
cobasjuan 0:694030aeaef8 109 paso_a=ESPERAR_A;
cobasjuan 0:694030aeaef8 110 }
cobasjuan 0:694030aeaef8 111 break;
cobasjuan 0:694030aeaef8 112 }
cobasjuan 0:694030aeaef8 113 }
cobasjuan 0:694030aeaef8 114
cobasjuan 0:694030aeaef8 115
cobasjuan 2:edadb31efe9b 116 void MOSTRAR_LED() // Maquina de estados: muestreo de la secuencia de leds a seguir
cobasjuan 0:694030aeaef8 117 {
cobasjuan 0:694030aeaef8 118 static int paso_b=ESPERAR_B;
cobasjuan 0:694030aeaef8 119 switch(paso_b) {
cobasjuan 0:694030aeaef8 120 case ESPERAR_B:
cobasjuan 0:694030aeaef8 121 if(habmostrar==1) {
cobasjuan 0:694030aeaef8 122 paso_b=MUESTREO;
cobasjuan 0:694030aeaef8 123 }
cobasjuan 0:694030aeaef8 124 break;
cobasjuan 2:edadb31efe9b 125 case MUESTREO:
cobasjuan 2:edadb31efe9b 126 if(finsec==0) { // Muestra un valor n de la secuencia un determinado tiempo, se apaga un determinado tiempo e incrementa n
cobasjuan 0:694030aeaef8 127 if (tiempo == 0) {
cobasjuan 0:694030aeaef8 128 if(cant < n) {
cobasjuan 0:694030aeaef8 129 finsec=1;
cobasjuan 2:edadb31efe9b 130 } else if(secuencia[n]== 0) {
cobasjuan 0:694030aeaef8 131 ledr=0;
cobasjuan 0:694030aeaef8 132 ledg=1;
cobasjuan 0:694030aeaef8 133 ledb=1;
cobasjuan 0:694030aeaef8 134 printf("LED_ROJO\n\r");
cobasjuan 2:edadb31efe9b 135 } else if(secuencia[n]== 1) {
cobasjuan 0:694030aeaef8 136 ledr=1;
cobasjuan 0:694030aeaef8 137 ledg=0;
cobasjuan 0:694030aeaef8 138 ledb=1;
cobasjuan 0:694030aeaef8 139 printf("LED_VERDE\n\r");
cobasjuan 2:edadb31efe9b 140 } else if(secuencia[n]== 2) {
cobasjuan 0:694030aeaef8 141 ledr=1;
cobasjuan 0:694030aeaef8 142 ledg=1;
cobasjuan 0:694030aeaef8 143 ledb=0;
cobasjuan 0:694030aeaef8 144 printf("LED_AZUL\n\r");
cobasjuan 0:694030aeaef8 145 }
cobasjuan 0:694030aeaef8 146 tiempo = 130;
cobasjuan 0:694030aeaef8 147 n++;
cobasjuan 0:694030aeaef8 148 }
cobasjuan 2:edadb31efe9b 149 if(tiempo == 40) { // Se apaga un determinado tiempo para diferenciar en caso de ser dos veces el mismo color
cobasjuan 0:694030aeaef8 150 ledr=1;
cobasjuan 0:694030aeaef8 151 ledg=1;
cobasjuan 0:694030aeaef8 152 ledb=1;
cobasjuan 0:694030aeaef8 153 }
cobasjuan 2:edadb31efe9b 154 } else if(finsec==1) { // Muestreo finalizado
cobasjuan 0:694030aeaef8 155 ledr=1;
cobasjuan 0:694030aeaef8 156 ledg=1;
cobasjuan 0:694030aeaef8 157 ledb=1;
cobasjuan 0:694030aeaef8 158 fin_mostrar=1;
cobasjuan 0:694030aeaef8 159 habmostrar=0;
cobasjuan 0:694030aeaef8 160 paso_b=ESPERAR_B;
cobasjuan 0:694030aeaef8 161 }
cobasjuan 0:694030aeaef8 162 break;
cobasjuan 0:694030aeaef8 163 }
cobasjuan 0:694030aeaef8 164 }
cobasjuan 0:694030aeaef8 165
cobasjuan 0:694030aeaef8 166
cobasjuan 2:edadb31efe9b 167 void JUEGO() // Maquina de estados: se compara lo que presiona el jugador con la secuencia generada
cobasjuan 0:694030aeaef8 168 {
cobasjuan 0:694030aeaef8 169 static int paso_c=ESPERAR_C;
cobasjuan 0:694030aeaef8 170 switch(paso_c) {
cobasjuan 0:694030aeaef8 171 case ESPERAR_C:
cobasjuan 0:694030aeaef8 172 if(habjug==1) {
cobasjuan 0:694030aeaef8 173 paso_c=JUGANDO;
cobasjuan 0:694030aeaef8 174 n=0;
cobasjuan 0:694030aeaef8 175 finsec=0;
cobasjuan 0:694030aeaef8 176 }
cobasjuan 0:694030aeaef8 177 break;
cobasjuan 0:694030aeaef8 178 case JUGANDO:
cobasjuan 0:694030aeaef8 179 if(finsec == 0) {
cobasjuan 2:edadb31efe9b 180 if((P1 == 1 || P2 == 1 || P3 == 1) && traba == 0) { // Se espera a que se presione el TSI para no comparar todo el tiempo
cobasjuan 0:694030aeaef8 181 traba=1;
cobasjuan 2:edadb31efe9b 182 if((secuencia[n] == 0 && P1 == 1) || (secuencia[n] == 1 && P2 == 1) || (secuencia[n] == 2 && P3 == 1)) { // Comparo lo que se presiono con la secuencia
cobasjuan 2:edadb31efe9b 183 n++; // Si coincide incremento
cobasjuan 2:edadb31efe9b 184 } else { // Si difiere levanto el flag de partida perdida
cobasjuan 0:694030aeaef8 185 printf("Game Over\n\r");
cobasjuan 0:694030aeaef8 186 perdiste=1;
cobasjuan 0:694030aeaef8 187 principio=0;
cobasjuan 0:694030aeaef8 188 habjug=0;
cobasjuan 0:694030aeaef8 189 break;
cobasjuan 0:694030aeaef8 190 }
cobasjuan 2:edadb31efe9b 191 if(cant < n) { // Si termino la secuencia y todas las comparaciones fueron coincidentes levanto el flag de final de secuencia
cobasjuan 0:694030aeaef8 192 finsec=1;
cobasjuan 0:694030aeaef8 193 printf("Enhorabuena!\n\r");
cobasjuan 0:694030aeaef8 194 }
cobasjuan 0:694030aeaef8 195 }
cobasjuan 2:edadb31efe9b 196 } else if(finsec == 1) { // Si se levanto el flag de final de secuencia levanto el flag de final de jugada
cobasjuan 0:694030aeaef8 197 finjug=1;
cobasjuan 0:694030aeaef8 198 habjug=0;
cobasjuan 0:694030aeaef8 199 paso_c=ESPERAR_C;
cobasjuan 0:694030aeaef8 200 }
cobasjuan 0:694030aeaef8 201 break;
cobasjuan 0:694030aeaef8 202
cobasjuan 0:694030aeaef8 203 }
cobasjuan 0:694030aeaef8 204 }
cobasjuan 0:694030aeaef8 205
cobasjuan 0:694030aeaef8 206
cobasjuan 0:694030aeaef8 207 void t()
cobasjuan 0:694030aeaef8 208 {
cobasjuan 0:694030aeaef8 209 if (tiempo > 0)
cobasjuan 0:694030aeaef8 210 tiempo--;
cobasjuan 0:694030aeaef8 211 }
cobasjuan 0:694030aeaef8 212
cobasjuan 0:694030aeaef8 213
cobasjuan 2:edadb31efe9b 214 void PULSADORES() // Separacion del TSI en pulsadores
cobasjuan 0:694030aeaef8 215 {
cobasjuan 0:694030aeaef8 216 static int lectura=0, color=0;
cobasjuan 2:edadb31efe9b 217 float valor=tsi.readPercentage(); // Leo el TSI una vez y lo guardo en una variable para no leerlo reiteradas veces
cobasjuan 0:694030aeaef8 218 if(tiempo == 0) {
cobasjuan 2:edadb31efe9b 219 tiempo=3; // Tiempo de retardo para no leer todo el tiempo
cobasjuan 2:edadb31efe9b 220 if(valor != 0 && lectura == 0) { // la variable lectura se encarga de detectar el flanco para no leer distintos valores de un mismo pulso
cobasjuan 0:694030aeaef8 221 lectura=1;
cobasjuan 0:694030aeaef8 222 if(valor > 0.37 && valor < 0.73) {
cobasjuan 0:694030aeaef8 223 P2=1;
cobasjuan 0:694030aeaef8 224 } else if(valor <= 0.33) {
cobasjuan 0:694030aeaef8 225 P1=1;
cobasjuan 0:694030aeaef8 226 } else if(valor >= 0.77) {
cobasjuan 0:694030aeaef8 227 P3=1;
cobasjuan 0:694030aeaef8 228 }
cobasjuan 0:694030aeaef8 229 } else if( valor == 0 && lectura == 1) {
cobasjuan 0:694030aeaef8 230 ledr=1;
cobasjuan 0:694030aeaef8 231 ledg=1;
cobasjuan 0:694030aeaef8 232 ledb=1;
cobasjuan 0:694030aeaef8 233 traba=0;
cobasjuan 0:694030aeaef8 234 color=0;
cobasjuan 0:694030aeaef8 235 lectura=0;
cobasjuan 0:694030aeaef8 236 P1=0;
cobasjuan 0:694030aeaef8 237 P2=0;
cobasjuan 0:694030aeaef8 238 P3=0;
cobasjuan 0:694030aeaef8 239 }
cobasjuan 0:694030aeaef8 240 if(valor != 0 && principio > 0 && color == 0) {
cobasjuan 0:694030aeaef8 241 color=1;
cobasjuan 0:694030aeaef8 242 if(valor > 0.37 && valor < 0.73) {
cobasjuan 0:694030aeaef8 243 printf("Tocaste el color VERDE\n\r");
cobasjuan 0:694030aeaef8 244 ledg=0;
cobasjuan 0:694030aeaef8 245 } else if(valor <= 0.33) {
cobasjuan 0:694030aeaef8 246 printf("Tocaste el color ROJO\n\r");
cobasjuan 0:694030aeaef8 247 ledr=0;
cobasjuan 0:694030aeaef8 248 } else if(valor >= 0.77) {
cobasjuan 0:694030aeaef8 249 printf("Tocaste el color AZUL\n\r");
cobasjuan 0:694030aeaef8 250 ledb=0;
cobasjuan 0:694030aeaef8 251 }
cobasjuan 0:694030aeaef8 252 }
cobasjuan 0:694030aeaef8 253 }
cobasjuan 0:694030aeaef8 254 }