Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
--- /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
--- /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
--- /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