RAMIRO MENTERES / Mbed 2 deprecated DesactivalaBomba

Dependencies:   mbed

Committer:
rf4186
Date:
Tue Jun 07 02:27:03 2022 +0000
Revision:
0:1afb8ee86b88
Ejerecicio desactiva la bomba. ; LOPEZ,MANTARAS-6B

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rf4186 0:1afb8ee86b88 1 #include "mbed.h"
rf4186 0:1afb8ee86b88 2 #include <stdio.h>
rf4186 0:1afb8ee86b88 3
rf4186 0:1afb8ee86b88 4 #define BASE_TIEMPO 0.0001
rf4186 0:1afb8ee86b88 5
rf4186 0:1afb8ee86b88 6 //Declaración de estados
rf4186 0:1afb8ee86b88 7 enum{
rf4186 0:1afb8ee86b88 8 NORMAL,
rf4186 0:1afb8ee86b88 9 Juego1,
rf4186 0:1afb8ee86b88 10 Juego2,
rf4186 0:1afb8ee86b88 11 Juego3,
rf4186 0:1afb8ee86b88 12 Gano,
rf4186 0:1afb8ee86b88 13 Perdio
rf4186 0:1afb8ee86b88 14 };
rf4186 0:1afb8ee86b88 15
rf4186 0:1afb8ee86b88 16 //Declaración de entradas y salidas
rf4186 0:1afb8ee86b88 17 DigitalIn SW(D4);
rf4186 0:1afb8ee86b88 18 DigitalIn C1(PTC7);
rf4186 0:1afb8ee86b88 19 DigitalIn C2(PTC0);
rf4186 0:1afb8ee86b88 20 DigitalIn C3(PTC3);
rf4186 0:1afb8ee86b88 21 DigitalIn C4(PTC4);
rf4186 0:1afb8ee86b88 22 DigitalOut ROJO(D2);
rf4186 0:1afb8ee86b88 23 DigitalOut VERDE(D3);
rf4186 0:1afb8ee86b88 24 DigitalOut BUZZER(D5);
rf4186 0:1afb8ee86b88 25 DigitalOut A(PTC17);
rf4186 0:1afb8ee86b88 26 DigitalOut B(PTC16);
rf4186 0:1afb8ee86b88 27 DigitalOut C(PTC13);
rf4186 0:1afb8ee86b88 28 DigitalOut D(PTC12);
rf4186 0:1afb8ee86b88 29 DigitalOut BL(D8);
rf4186 0:1afb8ee86b88 30 DigitalOut DISPLAY1(D9);
rf4186 0:1afb8ee86b88 31 DigitalOut DISPLAY2(D10);
rf4186 0:1afb8ee86b88 32
rf4186 0:1afb8ee86b88 33 //Declaración de variables
rf4186 0:1afb8ee86b88 34 Ticker tick;
rf4186 0:1afb8ee86b88 35 Serial pc(USBTX, USBRX);
rf4186 0:1afb8ee86b88 36 int segundos = 0 , music = 0 ,notime = 0;
rf4186 0:1afb8ee86b88 37 int t = 0;
rf4186 0:1afb8ee86b88 38 int E = 0;
rf4186 0:1afb8ee86b88 39 int Cable = 4;
rf4186 0:1afb8ee86b88 40 int MUSICA = 0;
rf4186 0:1afb8ee86b88 41 int GREEN = 0 , RED = 0, BLINK = 0;
rf4186 0:1afb8ee86b88 42 int valor = 0;
rf4186 0:1afb8ee86b88 43 int mux_display = 0;
rf4186 0:1afb8ee86b88 44
rf4186 0:1afb8ee86b88 45 //Declaración de funciones
rf4186 0:1afb8ee86b88 46 void bomba();
rf4186 0:1afb8ee86b88 47 void display(int);
rf4186 0:1afb8ee86b88 48 void secuencia();
rf4186 0:1afb8ee86b88 49 void Interrupt(){
rf4186 0:1afb8ee86b88 50 segundos++;
rf4186 0:1afb8ee86b88 51 mux_display++;
rf4186 0:1afb8ee86b88 52 music++;
rf4186 0:1afb8ee86b88 53 //El buzzer modifica su oscilación dependiendo de MUSICA, siempre y cuando se encuentre en partida.
rf4186 0:1afb8ee86b88 54 if(music >= 30000 - 9000*MUSICA && MUSICA >= 1 && MUSICA <= 3){
rf4186 0:1afb8ee86b88 55 BUZZER ? BUZZER = 0 : BUZZER = 1;
rf4186 0:1afb8ee86b88 56 music =0;
rf4186 0:1afb8ee86b88 57 }else
rf4186 0:1afb8ee86b88 58 BUZZER = 0;
rf4186 0:1afb8ee86b88 59 //Cada medio segundo hago oscilar los leds y el display, solo si RED o GREEN se activan
rf4186 0:1afb8ee86b88 60 if(segundos == 5000 || segundos == 10000){
rf4186 0:1afb8ee86b88 61 if(GREEN)
rf4186 0:1afb8ee86b88 62 VERDE ? (VERDE = 0) : (VERDE = 1);
rf4186 0:1afb8ee86b88 63 else
rf4186 0:1afb8ee86b88 64 VERDE = 0;
rf4186 0:1afb8ee86b88 65 if(RED)
rf4186 0:1afb8ee86b88 66 ROJO ? (ROJO = 0) : (ROJO = 1);
rf4186 0:1afb8ee86b88 67 else
rf4186 0:1afb8ee86b88 68 ROJO = 0;
rf4186 0:1afb8ee86b88 69 if(BLINK)
rf4186 0:1afb8ee86b88 70 BL ? (BL = 0) : (BL = 1);
rf4186 0:1afb8ee86b88 71 else
rf4186 0:1afb8ee86b88 72 BL = 1;
rf4186 0:1afb8ee86b88 73 }
rf4186 0:1afb8ee86b88 74 //Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
rf4186 0:1afb8ee86b88 75 if(segundos >= 10000 ){
rf4186 0:1afb8ee86b88 76 if(t > 0)
rf4186 0:1afb8ee86b88 77 t--;
rf4186 0:1afb8ee86b88 78 segundos = 0;
rf4186 0:1afb8ee86b88 79 }
rf4186 0:1afb8ee86b88 80 //Utilizo la siguiente secuencia para marcar los pasos de 1s (t)
rf4186 0:1afb8ee86b88 81 if(mux_display >= 41 ){
rf4186 0:1afb8ee86b88 82 if(BLINK)
rf4186 0:1afb8ee86b88 83 display(valor);
rf4186 0:1afb8ee86b88 84 else
rf4186 0:1afb8ee86b88 85 display(t);
rf4186 0:1afb8ee86b88 86 mux_display = 0;
rf4186 0:1afb8ee86b88 87 }
rf4186 0:1afb8ee86b88 88 }
rf4186 0:1afb8ee86b88 89
rf4186 0:1afb8ee86b88 90 int main(){
rf4186 0:1afb8ee86b88 91 tick.attach(&Interrupt , BASE_TIEMPO);
rf4186 0:1afb8ee86b88 92 while(1){
rf4186 0:1afb8ee86b88 93 bomba();
rf4186 0:1afb8ee86b88 94 }
rf4186 0:1afb8ee86b88 95 }
rf4186 0:1afb8ee86b88 96
rf4186 0:1afb8ee86b88 97 void bomba(){
rf4186 0:1afb8ee86b88 98 static int estado = NORMAL;
rf4186 0:1afb8ee86b88 99 //Declaro los estados como se diagramaron en la máquina de estados
rf4186 0:1afb8ee86b88 100 switch(estado){
rf4186 0:1afb8ee86b88 101 case NORMAL:
rf4186 0:1afb8ee86b88 102 if(SW.read() == 1){
rf4186 0:1afb8ee86b88 103 secuencia();
rf4186 0:1afb8ee86b88 104 estado = Juego1;
rf4186 0:1afb8ee86b88 105 t = 70;
rf4186 0:1afb8ee86b88 106 MUSICA = 1;
rf4186 0:1afb8ee86b88 107 RED = 0;
rf4186 0:1afb8ee86b88 108 GREEN = 0;
rf4186 0:1afb8ee86b88 109 pc.printf("El juego esta ahora en marcha. Primeros 30s\n");
rf4186 0:1afb8ee86b88 110 }
rf4186 0:1afb8ee86b88 111 break;
rf4186 0:1afb8ee86b88 112 case Juego1:
rf4186 0:1afb8ee86b88 113 secuencia();
rf4186 0:1afb8ee86b88 114 if(t <= 40){
rf4186 0:1afb8ee86b88 115 estado = Juego2;
rf4186 0:1afb8ee86b88 116 MUSICA = 2;
rf4186 0:1afb8ee86b88 117 pc.printf("La musica se intensifica\n");
rf4186 0:1afb8ee86b88 118 }
rf4186 0:1afb8ee86b88 119 if(E){
rf4186 0:1afb8ee86b88 120 estado = Perdio;
rf4186 0:1afb8ee86b88 121 valor = t;
rf4186 0:1afb8ee86b88 122 t = 10;
rf4186 0:1afb8ee86b88 123 RED = 1;
rf4186 0:1afb8ee86b88 124 MUSICA = 5;
rf4186 0:1afb8ee86b88 125 BLINK = 1;
rf4186 0:1afb8ee86b88 126 pc.printf("Partida terminada, el jugador pierde.\n");
rf4186 0:1afb8ee86b88 127 }
rf4186 0:1afb8ee86b88 128 if(Cable == 0){
rf4186 0:1afb8ee86b88 129 estado = Gano;
rf4186 0:1afb8ee86b88 130 GREEN = 1;
rf4186 0:1afb8ee86b88 131 MUSICA = 4;
rf4186 0:1afb8ee86b88 132 BLINK = 1;
rf4186 0:1afb8ee86b88 133 valor = t;
rf4186 0:1afb8ee86b88 134 t = 10;
rf4186 0:1afb8ee86b88 135 pc.printf("Partida terminada, el jugador gana.\n");
rf4186 0:1afb8ee86b88 136 }
rf4186 0:1afb8ee86b88 137 break;
rf4186 0:1afb8ee86b88 138 case Juego2:
rf4186 0:1afb8ee86b88 139 secuencia();
rf4186 0:1afb8ee86b88 140 if(t <= 20){
rf4186 0:1afb8ee86b88 141 estado = Juego3;
rf4186 0:1afb8ee86b88 142 MUSICA = 3;
rf4186 0:1afb8ee86b88 143 pc.printf("Queda poco tiempo\n");
rf4186 0:1afb8ee86b88 144 }
rf4186 0:1afb8ee86b88 145 if (E){
rf4186 0:1afb8ee86b88 146 estado = Perdio;
rf4186 0:1afb8ee86b88 147 RED = 1;
rf4186 0:1afb8ee86b88 148 MUSICA = 5;
rf4186 0:1afb8ee86b88 149 BLINK = 1;
rf4186 0:1afb8ee86b88 150 valor = t;
rf4186 0:1afb8ee86b88 151 t=10;
rf4186 0:1afb8ee86b88 152 pc.printf("Partida terminada, el jugador pierde.\n");
rf4186 0:1afb8ee86b88 153 }
rf4186 0:1afb8ee86b88 154 if(Cable == 0){
rf4186 0:1afb8ee86b88 155 estado = Gano;
rf4186 0:1afb8ee86b88 156 GREEN = 1;
rf4186 0:1afb8ee86b88 157 MUSICA = 4;
rf4186 0:1afb8ee86b88 158 BLINK = 1;
rf4186 0:1afb8ee86b88 159 valor = t;
rf4186 0:1afb8ee86b88 160 t = 10;
rf4186 0:1afb8ee86b88 161 pc.printf("Partida terminada, el jugador gana.\n");
rf4186 0:1afb8ee86b88 162 }
rf4186 0:1afb8ee86b88 163 break;
rf4186 0:1afb8ee86b88 164 case Juego3:
rf4186 0:1afb8ee86b88 165 secuencia();
rf4186 0:1afb8ee86b88 166 if(t <= 10 || E){
rf4186 0:1afb8ee86b88 167 estado = Perdio;
rf4186 0:1afb8ee86b88 168 MUSICA = 5;
rf4186 0:1afb8ee86b88 169 RED = 1;
rf4186 0:1afb8ee86b88 170 BLINK = 1;
rf4186 0:1afb8ee86b88 171 valor = t;
rf4186 0:1afb8ee86b88 172 pc.printf("Partida terminada, el jugador pierde.\n");
rf4186 0:1afb8ee86b88 173 }
rf4186 0:1afb8ee86b88 174 if(t <= 10)
rf4186 0:1afb8ee86b88 175 notime = 1;
rf4186 0:1afb8ee86b88 176 if(Cable == 0){
rf4186 0:1afb8ee86b88 177 estado = Gano;
rf4186 0:1afb8ee86b88 178 GREEN = 1;
rf4186 0:1afb8ee86b88 179 MUSICA = 4;
rf4186 0:1afb8ee86b88 180 BLINK = 1;
rf4186 0:1afb8ee86b88 181 valor = t;
rf4186 0:1afb8ee86b88 182 t = 10;
rf4186 0:1afb8ee86b88 183 pc.printf("Partida terminada, el jugador gana.\n");
rf4186 0:1afb8ee86b88 184 }
rf4186 0:1afb8ee86b88 185 break;
rf4186 0:1afb8ee86b88 186 case Gano:
rf4186 0:1afb8ee86b88 187 if(t == 0){
rf4186 0:1afb8ee86b88 188 estado = NORMAL;
rf4186 0:1afb8ee86b88 189 Cable = 4;
rf4186 0:1afb8ee86b88 190 MUSICA = 0;
rf4186 0:1afb8ee86b88 191 BLINK = 0;
rf4186 0:1afb8ee86b88 192 GREEN = 0;
rf4186 0:1afb8ee86b88 193 pc.printf("El juego se encuentra listo para comenzar.\n");
rf4186 0:1afb8ee86b88 194 }
rf4186 0:1afb8ee86b88 195 break;
rf4186 0:1afb8ee86b88 196 case Perdio:
rf4186 0:1afb8ee86b88 197 if(t == 0){
rf4186 0:1afb8ee86b88 198 estado = NORMAL;
rf4186 0:1afb8ee86b88 199 Cable = 4;
rf4186 0:1afb8ee86b88 200 E = 0;
rf4186 0:1afb8ee86b88 201 MUSICA = 0;
rf4186 0:1afb8ee86b88 202 BLINK = 0;
rf4186 0:1afb8ee86b88 203 RED = 0;
rf4186 0:1afb8ee86b88 204 pc.printf("El juego se encuentra listo para comenzar.\n");
rf4186 0:1afb8ee86b88 205 }
rf4186 0:1afb8ee86b88 206 break;
rf4186 0:1afb8ee86b88 207 default:
rf4186 0:1afb8ee86b88 208 estado = NORMAL;
rf4186 0:1afb8ee86b88 209 }
rf4186 0:1afb8ee86b88 210 }
rf4186 0:1afb8ee86b88 211
rf4186 0:1afb8ee86b88 212 //Funcion de control de multiplexado
rf4186 0:1afb8ee86b88 213 void display(int x){
rf4186 0:1afb8ee86b88 214 char decenas;
rf4186 0:1afb8ee86b88 215 char unidades;
rf4186 0:1afb8ee86b88 216 if(x > 10){
rf4186 0:1afb8ee86b88 217 decenas = (x-10)/10;
rf4186 0:1afb8ee86b88 218 unidades = (x-10)%10;
rf4186 0:1afb8ee86b88 219 }else{
rf4186 0:1afb8ee86b88 220 decenas = 0;
rf4186 0:1afb8ee86b88 221 unidades = 0;
rf4186 0:1afb8ee86b88 222 }
rf4186 0:1afb8ee86b88 223 static char estado = 0;
rf4186 0:1afb8ee86b88 224 //estado indica el display a utilizar.
rf4186 0:1afb8ee86b88 225 //En ambos casos se toma bit a bit el número (unidad o decena) y se la inserta en el CD4511 mediante A, B, C y D
rf4186 0:1afb8ee86b88 226 //Los displays se apagan por un breve momento mientras se configura el Cd4511
rf4186 0:1afb8ee86b88 227 if(estado == 0){
rf4186 0:1afb8ee86b88 228 DISPLAY2 = 0;
rf4186 0:1afb8ee86b88 229 A = (decenas & 0b1000)>>3;
rf4186 0:1afb8ee86b88 230 B = (decenas & 0b100)>>2;
rf4186 0:1afb8ee86b88 231 C = (decenas & 0b10)>>1;
rf4186 0:1afb8ee86b88 232 D = decenas & 1;
rf4186 0:1afb8ee86b88 233 DISPLAY1 = 1;
rf4186 0:1afb8ee86b88 234 estado = 1;
rf4186 0:1afb8ee86b88 235 }else if(estado == 1){
rf4186 0:1afb8ee86b88 236 DISPLAY1 = 0;
rf4186 0:1afb8ee86b88 237 A = (unidades & 0b1000)>>3;
rf4186 0:1afb8ee86b88 238 B = (unidades & 0b100)>>2;
rf4186 0:1afb8ee86b88 239 C = (unidades & 0b10)>>1;
rf4186 0:1afb8ee86b88 240 D = unidades & 1;
rf4186 0:1afb8ee86b88 241 DISPLAY2 = 1;
rf4186 0:1afb8ee86b88 242 estado = 0;
rf4186 0:1afb8ee86b88 243 }
rf4186 0:1afb8ee86b88 244 }
rf4186 0:1afb8ee86b88 245
rf4186 0:1afb8ee86b88 246 //Funcion que se encarga de modificar la secuencia y su correcto seguimiento durante la partida.
rf4186 0:1afb8ee86b88 247 void secuencia(){
rf4186 0:1afb8ee86b88 248 static int flag = 0 , flagc1 = 0 , flagc2 = 0 , flagc3 = 0 , flagc4 = 0;
rf4186 0:1afb8ee86b88 249 static int secuencia[4];
rf4186 0:1afb8ee86b88 250 if (flag == 0){
rf4186 0:1afb8ee86b88 251 flagc1 = 0;
rf4186 0:1afb8ee86b88 252 flagc2 = 0;
rf4186 0:1afb8ee86b88 253 flagc3 = 0;
rf4186 0:1afb8ee86b88 254 flagc4 = 0;
rf4186 0:1afb8ee86b88 255 secuencia[0]= 0;
rf4186 0:1afb8ee86b88 256 secuencia[1]= 0;
rf4186 0:1afb8ee86b88 257 secuencia[2]= 0;
rf4186 0:1afb8ee86b88 258 secuencia[3]= 0;
rf4186 0:1afb8ee86b88 259
rf4186 0:1afb8ee86b88 260 //Declaro las variables dentro de la secuencia hasta que tenga un ejemplar de cada numereo del 1 al 4
rf4186 0:1afb8ee86b88 261 for(int i = 0 ; i < 4 ;){
rf4186 0:1afb8ee86b88 262 secuencia[i] = rand() % 4 + 1;
rf4186 0:1afb8ee86b88 263 for(int j = i - 1 ; j >= 0 ; j--){
rf4186 0:1afb8ee86b88 264 if (secuencia[i] == secuencia[j]){
rf4186 0:1afb8ee86b88 265 i--;
rf4186 0:1afb8ee86b88 266 break;
rf4186 0:1afb8ee86b88 267 }
rf4186 0:1afb8ee86b88 268 }
rf4186 0:1afb8ee86b88 269 i++;
rf4186 0:1afb8ee86b88 270 }
rf4186 0:1afb8ee86b88 271 pc.printf("LA SECUENCIA A REPRODUCIR ES %d %d %d %d\n" , secuencia[0] , secuencia[1] , secuencia[2] , secuencia[3]);
rf4186 0:1afb8ee86b88 272 flag++;
rf4186 0:1afb8ee86b88 273 }else{
rf4186 0:1afb8ee86b88 274 //Cada cable tiene su propio número asignado. Cuando lo desconecto
rf4186 0:1afb8ee86b88 275 //ese código debe conincidir con la secuencia, de otro modo será un
rf4186 0:1afb8ee86b88 276 //error. Una vez desactivado se utiliza una variable para descartarlos
rf4186 0:1afb8ee86b88 277 //hatsa la proxima partida.
rf4186 0:1afb8ee86b88 278 if(C1.read() == 1){
rf4186 0:1afb8ee86b88 279 if(secuencia [flag-1] == 1 && !flagc1){
rf4186 0:1afb8ee86b88 280 Cable--;
rf4186 0:1afb8ee86b88 281 flag++;
rf4186 0:1afb8ee86b88 282 flagc1 = 1;
rf4186 0:1afb8ee86b88 283 }else if(!flagc1)
rf4186 0:1afb8ee86b88 284 E = 1;
rf4186 0:1afb8ee86b88 285 }
rf4186 0:1afb8ee86b88 286 if(C2.read() == 1 && !flagc2){
rf4186 0:1afb8ee86b88 287 if(secuencia [flag-1] == 2){
rf4186 0:1afb8ee86b88 288 Cable--;
rf4186 0:1afb8ee86b88 289 flag++;
rf4186 0:1afb8ee86b88 290 flagc2 = 1;
rf4186 0:1afb8ee86b88 291 }else if(!flagc2)
rf4186 0:1afb8ee86b88 292 E = 1;
rf4186 0:1afb8ee86b88 293 }
rf4186 0:1afb8ee86b88 294 if(C3.read() == 1 && !flagc3){
rf4186 0:1afb8ee86b88 295 if(secuencia [flag-1] == 3){
rf4186 0:1afb8ee86b88 296 Cable--;
rf4186 0:1afb8ee86b88 297 flag++;
rf4186 0:1afb8ee86b88 298 flagc3 = 1;
rf4186 0:1afb8ee86b88 299 }else if(!flagc3)
rf4186 0:1afb8ee86b88 300 E = 1;
rf4186 0:1afb8ee86b88 301 }
rf4186 0:1afb8ee86b88 302 if(C4.read() == 1 && !flagc4){
rf4186 0:1afb8ee86b88 303 if(secuencia [flag-1] == 4){
rf4186 0:1afb8ee86b88 304 Cable--;
rf4186 0:1afb8ee86b88 305 flag++;
rf4186 0:1afb8ee86b88 306 flagc4 = 1;
rf4186 0:1afb8ee86b88 307 }else if(!flagc4)
rf4186 0:1afb8ee86b88 308 E = 1;
rf4186 0:1afb8ee86b88 309 }
rf4186 0:1afb8ee86b88 310 //Cuando se terina la secuencia, se comete un error o se acaba el
rf4186 0:1afb8ee86b88 311 // tiempo se vuelve al primer estado flag = 0
rf4186 0:1afb8ee86b88 312 if (flag == 5 || E == 1 || notime == 1){
rf4186 0:1afb8ee86b88 313 flag = 0;
rf4186 0:1afb8ee86b88 314 notime = 0;
rf4186 0:1afb8ee86b88 315 }
rf4186 0:1afb8ee86b88 316 }
rf4186 0:1afb8ee86b88 317 }