Juan Ignacio Jimenez Copati
/
tp1_ktane
bomba
Revision 0:c015c84abb0a, committed 2019-06-04
- Comitter:
- juanijc
- Date:
- Tue Jun 04 13:49:59 2019 +0000
- Commit message:
- bomba;
Changed in this revision
diff -r 000000000000 -r c015c84abb0a main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jun 04 13:49:59 2019 +0000 @@ -0,0 +1,312 @@ +#include "mbed.h" +#include "tsi_sensor.h" + +//tsi +#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) +#define ELEC0 9 +#define ELEC1 10 +#elif defined (TARGET_KL05Z) +#define ELEC0 9 +#define ELEC1 8 +#else +#error TARGET NOT DEFINED +#endif +TSIAnalogSlider tsi(ELEC0, ELEC1, 40); + +enum estados_me_proceso {espera, conteo, comparo, fin, bum}; +enum estados_me_proceso me_proceso_estado = espera; +enum estados_me_titilar_display {on1, off1}; +enum estados_me_titilar_display me_titilar_display_estado = on1; + +//entradas +DigitalIn cable_1(PTC1); +DigitalIn cable_2(PTC2); +DigitalIn cable_3(PTB3); +DigitalIn cable_4(PTB2); + +//salidas +BusOut unidades_(PTA1,PTA13,PTD4,PTA12); +BusOut decenas_(PTA4,PTA5,PTC8,PTC9); +PwmOut led_verde(LED_GREEN); +PwmOut led_rojo(LED_RED); + +//ME y funciones empleadas +void me_proceso(); +void display_bcd(); +void detector(); +void tiempo(); +void me_titilar_display(); +int azar(); + +Ticker t; + +//retencion o habilitacion +int primera=0, hab_comparacion=0, prioridad=0, a=0, ant_[4]= {0}; +//tiempo +int segundos=0, segundos_transformados=0,detener=0, tmo=0, decenas, unidades; +//utilizadas en azar() +int cantidad_azar=0, memoria_azar[3]= {0,0,0}, cable_correcto=0; +int secuencia[4]; +int sacados[4]; +//estados +int i; +int nivel=0; +int start=0; + + + +int main() +{ + //llamo a la funcion tiempo() cada 0.01 seg + t.attach(&tiempo,0.01); + //estado inicial de leds + led_verde=1; + led_rojo=1; + while(true) { + //ME + me_proceso(); + me_titilar_display(); + //funciones que operan constantemente + display_bcd(); + detector(); + } +} + +void me_proceso() +{ + + switch(me_proceso_estado) { + + default: + //estado de espera: pongo estados iniciales de variables. al pulsar el TSI se da inicio + case espera: + + if(primera==0) { + printf("\nConecte todos los cables a masa y pulse el TSI para iniciar\n"); + primera=1; + i=0; + } + + if(tsi.readPercentage()>0.35 && tsi.readPercentage()<0.65 && cable_1==0 && cable_2==0 && cable_3==0 && cable_4==0) { + me_proceso_estado=conteo; + primera=0; + detener=0; + segundos=0; + printf("\nInicia el conteo\n"); + } + //genero secuencia aleatoria + for(i=0; i<4; i++) { + secuencia[i]=azar(); + } + + break; + + case conteo: + //establezco el tiempo de los displays y muestro secuencia correcta + if(primera==0) { + led_verde=1; + led_rojo=1; + if(segundos==0) + segundos=3000; + primera=1; + start=1; + printf("%i\n",secuencia[0]); + printf("%i\n",secuencia[1]); + printf("%i\n",secuencia[2]); + printf("%i\n",secuencia[3]); + } + //si hab_comparacion==1, voy al estado "comparo" + if(hab_comparacion==1) + me_proceso_estado=comparo; + + + break; + //en este estado verifico si el cable sacado coincide con la secuencia correcta + case comparo: + //si coincide vuelvo al estado "conteo" y doy el mensaje de "correcto" + if(secuencia[a-1]==sacados[a-1]) { + me_proceso_estado=conteo; + nivel++; + hab_comparacion=0; + printf("Correcto!\n"); + //si no coincide, paso al estado "bum" + } else { + primera=0; + me_proceso_estado=bum; + hab_comparacion=0; + } + //si llego al nivel 4 (4 cables sacados correctamente) voy al estado "fin" + if(nivel==4) { + primera=0; + me_proceso_estado=fin; + } + + break; + //en este estado informo al usuario que gano y preparo las variables para un nuevo juego + case fin: + + led_verde=0; + + if(primera==0) { + printf("\nGanaste!\nPulse el TSI para volver al comienzo\n"); + primera=1; + cable_correcto=0; + detener=1; + nivel=0; + } + //si pulso el TSI paso al estado "espera" + if(tsi.readPercentage()>=0.35&&tsi.readPercentage()<=0.65) { + primera=0; + start=0; + me_proceso_estado=espera; + } + break; + //en este estado informo al usuario que perdio y preparo las variables para un nuevo juego + case bum: + + if(primera==0) { + printf("\nPerdiste...\nPulse el TSI para volver al comienzo\n"); + primera=1; + cable_correcto=0; + detener=1; + nivel=0; + } + //si pulso el TSI paso al estado "espera" + if(tsi.readPercentage()>=0.35&&tsi.readPercentage()<=0.65) { + primera=0; + start=0; + me_proceso_estado=espera; + } + break; + } +} +//variable que maneja el tiempo +void tiempo() +{ + //si el juego esta en curso ("detener"==0) que descuente a la variable "segundos" + if(detener==0) { + if(segundos>0) + segundos--; + } + //variable utilizada para hacer titilar display y led + if(tmo!=0) + tmo--; + //si el tiempo llega a 0, el juego fue iniciado y estaba en curso ==> pasa a estado "bum" + if(segundos==0 && start==1 && detener==0) { + me_proceso_estado=bum; + primera=0; + detener=1; + } + +} +//ME que hace titilar el display y el led rojo +void me_titilar_display() +{ + switch(me_titilar_display_estado) { + default: + case on1: + led_rojo=1; + //si se termina el juego activo el proceso de titilar. 1/2 seg prendiso y 1/2 seg apagado + if(tmo==0 && detener==1) { + tmo=50; + //poniendo el BCD del banquito de ensayos con un nro mayor a 9, se apaga + unidades_=12; + decenas_=12; + me_titilar_display_estado=off1; + //para no solapar esta ME y la de display_bcd() + prioridad=1; + if(me_proceso_estado==bum) + led_rojo=0; + } + break; + + case off1: + + if(tmo==0) { + tmo=50; + led_rojo=1; + me_titilar_display_estado=on1; + prioridad=0; + led_rojo=1; + } + break; + } +} +//funcion que genera la secuencia aleatoria sin repetir nros +int azar() +{ + cantidad_azar++; + while(cable_correcto==memoria_azar[0]||cable_correcto==memoria_azar[1]||cable_correcto==memoria_azar[2]) { + cable_correcto=rand()%4+1; + } + //guardo los nros generados para no repetirlos + switch(cantidad_azar) { + default: + case 1: + memoria_azar[0]=cable_correcto; + break; + case 2: + memoria_azar[1]=cable_correcto; + break; + case 3: + memoria_azar[2]=cable_correcto; + break; + case 4: + memoria_azar[0]=0; + memoria_azar[1]=0; + memoria_azar[2]=0; + cantidad_azar=0; + break; + } + return cable_correcto; +} +//funcion que detecta cuando saco un cable +void detector() +{ + //cada vez que saco un cable ==> hab_comparacion==1 + if(cable_1!=0 && ant_[0]==0) { + ant_[0]=1; + sacados[a]=1; + a++; + hab_comparacion=1; + } + if(cable_2!=0 && ant_[1]==0) { + ant_[1]=1; + sacados[a]=2; + a++; + hab_comparacion=1; + } + if(cable_3!=0 && ant_[2]==0) { + ant_[2]=1; + sacados[a]=3; + a++; + hab_comparacion=1; + } + if(cable_4!=0 && ant_[3]==0) { + ant_[3]=1; + sacados[a]=4; + a++; + hab_comparacion=1; + } + //si se termina el juego, vuelvo las variables a su estado de inicio + if(detener==1) { + a=0; + ant_[0]=0; + ant_[1]=0; + ant_[2]=0; + ant_[3]=0; + + } +} +//funcion que traduce los segundos en binario y lo entrega al BCD del banquito de ensayos +void display_bcd() +{ + segundos_transformados=segundos/100; + decenas=segundos_transformados/10; + unidades=segundos_transformados%10; + + if(prioridad==0) { + unidades_=unidades; + decenas_=decenas; + } +} \ No newline at end of file
diff -r 000000000000 -r c015c84abb0a mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Jun 04 13:49:59 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file
diff -r 000000000000 -r c015c84abb0a tsi_sensor.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsi_sensor.lib Tue Jun 04 13:49:59 2019 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Kojto/code/tsi_sensor/#976904559b5c