Trabajo práctico 1 Ejercicio 2 SIMON Maver, Francisco Almada, Santiago

Dependencies:   mbed tsi_sensor

Files at this revision

API Documentation at this revision

Comitter:
Franmaver
Date:
Sun Jun 02 16:51:36 2019 +0000
Commit message:
TP1_ejer2

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
tsi_sensor.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 02 16:51:36 2019 +0000
@@ -0,0 +1,321 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "stdlib.h"
+
+/* This defines will be replaced by PinNames soon */
+#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
+//defino las salidas
+DigitalOut verde(LED_GREEN);
+DigitalOut azul(LED_BLUE);
+DigitalOut rojo(LED_RED);
+
+TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
+
+int PULS_TSI();
+int COLORES();
+
+//General
+enum MAQUINA_ESTADO_GENERAL {INICIO, MUESTRO_SEC, ESPERO_SEC, APRETO, LOOSER, WIN};
+MAQUINA_ESTADO_GENERAL MAQUINA_GENERAL;
+void FUNCION_GENERAL();
+
+//Muestro
+enum MAQUINA_ESTADO_MUESTRO {INICIO2, ON, OFF};
+MAQUINA_ESTADO_MUESTRO MAQUINA_MUESTRO;
+void FUNCION_MOSTRAR();
+char paso [25];
+int nivel_muestro = 0;
+int nivel_mostrando = 0;
+int variable = 0;
+
+//Apreto
+enum MAQUINA_ESTADO_APRETO {INICIO3, ESPERO_PULS, COMPARO_PULS, DELAY, DELAY2};
+MAQUINA_ESTADO_APRETO MAQUINA_APRETO;
+void FUNCION_APRETO();
+int espero_puls = 0;
+int estado_prox = 0;
+
+//tiempo
+Ticker tiempo;
+int contador = 0;
+int contador_muestro = 0;
+int contador_apreto = 0;
+int PULSADOR = 5;
+int mostrando = 0;
+int apretar = 0;
+void funcion_tiempo();
+
+//funcion de los botones para el tsi
+int PULS_TSI()
+{
+    if((tsi.readPercentage() > 0.06) && (tsi.readPercentage() < 0.2))
+        PULSADOR = 0;//0 designado para el color rojo
+    else if((tsi.readPercentage() > 0.4) && (tsi.readPercentage() < 0.6))
+        PULSADOR = 1;//1 designado para el color verde
+    else if((tsi.readPercentage() > 0.8) && (tsi.readPercentage() < 0.94))
+        PULSADOR = 2;//2 designado para el color azul
+    else
+        PULSADOR = -1;//-1 designado cuando no se oprime el TSI
+
+    return PULSADOR;//me devuelve lo que aprete
+}
+//funcion que prende los leds 
+void COLORES(int color)
+{
+    switch(color) {
+        case 0://rojo
+            rojo = 0;
+            verde = 1;
+            azul = 1;
+            break;
+        case 1://verde
+            rojo = 1;
+            verde = 0;
+            azul = 1;
+            break;
+        case 2://azul
+            rojo = 1;
+            verde = 1;
+            azul = 0;
+            break;
+    }
+}
+
+int main(void)
+{
+    //defino los leds como apagados
+    verde = 1;
+    azul = 1;
+    rojo = 1;
+    tiempo.attach(&funcion_tiempo, 0.1);
+    
+    while (true) {
+        variable++;//variable usada para el srand
+        FUNCION_GENERAL();//GENERAL
+        FUNCION_MOSTRAR();//MOSTRAR
+        FUNCION_APRETO();//APRETAR
+    }
+}
+
+void funcion_tiempo()
+{
+    contador++;
+    contador_muestro++;
+    contador_apreto++;
+}
+
+//GENERAL
+void FUNCION_GENERAL()
+{
+    switch (MAQUINA_GENERAL) {
+
+        default:
+            MAQUINA_GENERAL = INICIO;
+            break;
+        case INICIO://igualo todas mis variables a 0 
+            mostrando = 0;
+            espero_puls = 0;
+            nivel_muestro = 0;
+            nivel_mostrando = 0;
+            contador = 0;
+            contador_muestro = 0;
+            contador_apreto = 0;
+            PULSADOR = 5;
+            mostrando = 0;
+            apretar = 0;
+            if(tsi.readPercentage() != 0) {//oprimo TSI
+                contador = 0;
+                mostrando = 1;
+                MAQUINA_GENERAL = MUESTRO_SEC;
+            }
+            break;
+        case MUESTRO_SEC:
+            if(mostrando == 0) {//mostrando va a ser 0 cuando en la funcion de mostrar ya mostro todo
+                MAQUINA_GENERAL = ESPERO_SEC;
+                apretar = 1;
+            }
+            break;
+        case ESPERO_SEC:
+            if(apretar == 0) {
+                MAQUINA_GENERAL = MUESTRO_SEC;
+                mostrando = 1;
+            }
+            break;
+        case LOOSER://caso cuando perdes
+        //prende salida color violeta por 2 segundos luego vuelve a inicio
+            azul = 0;
+            rojo = 0;
+            verde = 1;
+            if(contador >= 20) {
+                azul = 1;
+                rojo = 1;
+                verde = 1;
+                contador = 0;
+                MAQUINA_GENERAL = INICIO;
+            }
+            break;
+        case WIN://caso cuando ganas
+        //prende salida color amarillo por 2 segundos luego vuelve a inicio
+            contador = 0;
+            rojo = 0;
+            verde = 0;
+            azul = 1;
+            if(contador >= 20) {
+                azul = 1;
+                rojo = 1;
+                verde = 1;
+                contador = 0;
+                MAQUINA_GENERAL = INICIO;
+            }
+            break;
+    }
+}
+//MOSTRAR
+void FUNCION_MOSTRAR()
+{
+    switch (MAQUINA_MUESTRO) {
+        default:
+            MAQUINA_MUESTRO = INICIO2;
+            break;
+        case INICIO2:
+            if(mostrando == 1) {
+                nivel_mostrando = 0;
+                srand(variable);//como variable va a estar siempre variando, srand tomara distintas posiciones
+                paso[nivel_muestro++] = (rand() % 3);//genero mi secuencia con numero al azar entre 0 y 2
+                //POR QUE NIVEL VOY (nivel muestro)
+
+                if(nivel_muestro == 24) {//si llego a 24 niveles, gano
+                    mostrando = 0;
+                    MAQUINA_GENERAL = WIN;
+                    MAQUINA_MUESTRO = INICIO2;
+                }
+                contador_muestro = 0;
+                MAQUINA_MUESTRO = ON;
+            }
+            break;
+        case ON:
+            COLORES(paso[nivel_mostrando]);//prendo los colores de la secuencia 
+
+            //CUAL ESTOY MOSTRANDO AHORA (nivel_mostrando)
+            //a medida que se aumentan los niveles se disminuye el tiempo de encendido de los leds
+            if (nivel_muestro <= 5) {
+                if (contador_muestro >= 10) {
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = OFF;
+                }
+            }
+            if ((nivel_muestro > 5)&&(nivel_muestro <= 10)) {
+                if (contador_muestro >= 8) {
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = OFF;
+                }
+            }
+            if ((nivel_muestro > 10)&&(nivel_muestro <= 15)) {
+                if (contador_muestro >= 6) {
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = OFF;
+                }
+            }
+            if ((nivel_muestro > 15)&&(nivel_muestro <= 20)) {
+                if (contador_muestro >= 10) {
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = OFF;
+                }
+            }
+            if ((nivel_muestro > 20)&&(nivel_muestro <= 24)) {
+                if (contador_muestro >= 10) {
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = OFF;
+                }
+            }
+            break;
+        case OFF://apago las salidas
+            rojo = 1;
+            verde = 1;
+            azul = 1;
+            if(contador_muestro >= 5) {//tiempo de espera entre led y led
+                if((nivel_mostrando) == (nivel_muestro - 1)) {//si se mostraron todos los niveles
+                    mostrando = 0;//en la maquina general hbailita a pasar al caso de espero_sec
+                    MAQUINA_MUESTRO = INICIO2;
+                } else {//si quedan niveles por mostrar
+                    nivel_mostrando++;//aumento variable para luego mostrar proximo nivel
+                    contador_muestro = 0;
+                    MAQUINA_MUESTRO = ON;//vuelvo a prender el siguiente nivel
+                }
+            }
+    }
+}
+//APRETAR
+void FUNCION_APRETO()
+{
+    switch(MAQUINA_APRETO) {
+        default:
+            MAQUINA_APRETO = INICIO3;
+            break;
+        case INICIO3:
+            if(apretar == 1) {//habilitado por la maquina general cuando entro al case espero_sec
+                espero_puls = 0;
+                contador_apreto = 0;
+                MAQUINA_APRETO = ESPERO_PULS;
+            }
+            break;
+        case ESPERO_PULS:
+
+            if(PULS_TSI() != -1) {//si oprimo el tsi
+                if(PULS_TSI() == paso[espero_puls]) {//si lo oprimido es el seleccionado para el color asignado previamente
+                    if(espero_puls < (nivel_muestro-1)) {//si no oprimi todos los niveles
+                        espero_puls++;//sumo variable para apretar el proximo nivel y comparar
+                        contador_apreto = 0;
+                        MAQUINA_APRETO = DELAY;//voy al caso en el que se muestran los leds que aprete
+                        estado_prox = 1;//en el caso de tener que seguir apretando
+                    } else {
+                        MAQUINA_APRETO = DELAY;//voy al caso en el que se muestran los leds que aprete
+                        estado_prox = 2;//en el caso de no tener que apretar mas
+                    }
+                } else {// si lo oprimido no es lo seleccionado para el color asignado previamente
+                    contador = 0;
+                    MAQUINA_GENERAL = LOOSER;//pierdo
+                    MAQUINA_APRETO = INICIO3;
+                }
+            }
+            if(contador_apreto >= 30) {//si pasaron 3 segundos y no oprimi nada
+                contador = 0;
+                contador_apreto = 0;
+                MAQUINA_GENERAL = LOOSER;//pierdo
+                MAQUINA_APRETO = INICIO3;
+            }
+            break;
+        case DELAY://caso de delay
+            COLORES(PULS_TSI());//muestro los leds que oprimo con el TSI
+            if(contador_apreto > 2) {//genero un tiempo de 200ms
+                MAQUINA_APRETO = DELAY2;//voy al caso donde apago los leds
+                contador_apreto = 0;
+            }
+            break;
+        case DELAY2:
+        //apago los leds
+            rojo = 1;
+            azul = 1;
+            verde = 1;
+
+            if(estado_prox == 1 && contador_apreto > 2) {//genero otro timepo de 200ms para poder volver a leer el TSI
+            //y si tengo que seguir apretando
+                MAQUINA_APRETO = ESPERO_PULS;//vuelvo al caso donde oprimo los niveles siguientes
+                contador_apreto = 0;
+            } else if(estado_prox == 2 && contador_apreto > 2) {//y si no tengo que apretar mas
+            //y genero otro timepo de 200ms
+                apretar = 0;//hbailito a quer maquina general vuelva a muestro_sec
+                MAQUINA_APRETO = INICIO3;
+                contador_apreto = 0;
+            }
+            break;
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Jun 02 16:51:36 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	Sun Jun 02 16:51:36 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Kojto/code/tsi_sensor/#976904559b5c