prueba
Dependencies: mbed SDFileSystem FXOS8700Q
TP para SO. Escribe a memoria SD, lee inputs desde la coneccion serial a una pc, muestra en pantalla de la misma un menu y permite visualizar el funcionamiento del sensor acelerometro.
Diff: main.cpp
- Revision:
- 6:3c77a20acb12
- Parent:
- 5:cf92a5a1f081
- Child:
- 7:f49ea76f3ac1
--- a/main.cpp Wed Jun 05 21:40:19 2019 +0000 +++ b/main.cpp Sun Jun 23 17:05:49 2019 +0000 @@ -1,8 +1,16 @@ #include "mbed.h" #include "SDFileSystem.h" +#include "FXOS8700Q.h" //creamos el objeto sd con la clase SDFileSystem con los pines de la sd para usar el sistema de archivos SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS + +I2C i2c(PTE25, PTE24); +FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Configura sensor acelerometro + +//creamos la comunicacion serial con la pc +Serial pc(USBTX, USBRX); + //creamos los led con la clase digitalout con los pines de los leds DigitalOut led1(PTB22); DigitalOut led2(PTE26); @@ -14,13 +22,113 @@ //creo un puntero para el archivo FILE *fp; -//contafor para los "puntos" -int cont=0; + int cont=0;//contador de los puntos + +void menu(); +void boton2(); +void boton3(); +void opcion3(); +void opcion1(); + +// main() runs in its own thread in the OS +int main() +{ + sw2.rise(&boton2);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2 + sw3.rise(&boton3);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3 + led1=1;//apago el led rojo + menu();//llamo al menu + +} + +void menu(){ + char c='0';//inicializo el char para leer del teclado + int buffer;//int para leer del archivo de puntos + while(c!='q'){//mientras que no salga muestro el menu + pc.printf("----------------------- \n \r"); + pc.printf("1-Iniciar juego \n \r"); + pc.printf("2-mostrar puntuacion anterior \n \r"); + pc.printf("3-opcion3 \n \r"); + pc.printf("q-salir \n \r"); + c=pc.getc();//leo del teclado + switch(c){ + case '1':opcion1();//llamo al metodo principal del juego + break; + case '2':pc.printf("\033[2J");//limpio la pantalla + //leo el archivo y muestro por pantalla + fp = fopen("/sd/puntos.txt", "r");//asigno el archivo a fp + if (fp != NULL) { + fscanf(fp,"%d",&buffer);//leo el contenido + fclose(fp);//cierro el archivo + } + pc.printf("Puntos anteriores: "); + pc.printf("%d",buffer); //escribo en la pantalla el entero formateado a string + pc.printf("\n \r"); + break; + case '3': opcion3();//llamo al metodo de la prueba del acelerometro + break; + } + } + } + + +void opcion1(){//metodo principal del juego + bool aux=true;//bolean para salir + char tecla='0';//char para leer del teclado + cont=0;//inicializo el contador de puntos en 0 + int i;//int para el random + led2=0;//apago los leds + led3=0; + pc.printf("\033[2J"); + pc.printf("----------------------- \n \r");//muestro comienzo del juego + pc.printf("Comenzo el juego!\n \r"); + pc.printf("Para terminar presione x \n \r"); + pc.printf("----------------------- \n \r"); + //bucle principal + while(aux){ + // Pone valor random en i (de 0 a 1) y prende el color correspondiente + i=rand()%2; + switch(i){ + case 0: led2=1;//si es 0 prendo el verde + break; + case 1: led3=1;//si es 1 prendo el azul + break; + } + + //bucle para esperar la interrupcion + while((led2.read()!=0 || led3.read()!=0) && aux){ + // espero a que aprete boton + if(pc.readable()){ + tecla=pc.getc(); + if(tecla=='x'){//si lee x del teclado sale del metodo y vuelve al menu + aux=false; + return; + } + } + } + //desactivo las interrupciones para escribir sin problemas + __disable_irq(); + //abro el archivo para escribir si no existe se crea + fp = fopen("/sd/puntos.txt", "w");//asigno el archivo a fp + if (fp != NULL) { + fprintf(fp, "%d",cont);//escribo el contenido de cont en el archivo fp + fclose(fp);//cierro el archivo + } + //vuelvo a activar las interrupciones + __enable_irq(); + + //espero en la salida para mostrar el resultado + wait_ms(500); + //apago el led rojo si esta prendido + if(led1.read()==0) + led1=1; + } +} //funciones para las interrupciones void boton2(){ if(led2.read()!=0){ cont++;//si se apreta el sw2 y esta el led2 en 1 se cuenta un punto y apaga el led + pc.printf("Buena pulsada , un punto \n \r"); //muestro por pantalla un mensaje motivacional led2=0; } else { //apago el led y prendo el led rojo @@ -29,59 +137,40 @@ led1=0; //resto un punto cont--; + pc.printf("Fallaste \n \r"); } } -//lo mismo que boton2 pero para el otro boton +//parecido a boton2 pero para el otro boton void boton3(){ if(led3.read()!=0){ - cont++;//si se apreta el sw3 y esta el led3 en 1 se cuenta y apaga el led + cont++;//si se apreta el sw3 y esta el led3 en 1 se cuenta y apaga el led + pc.printf("Buena pulsada , un punto \n \r"); //muestro por pantalla un mensaje motivacional led3=0; }else{ led2=0; led1=0; cont--; + pc.printf("Fallaste \n \r"); } } - - -// main() runs in its own thread in the OS -int main() -{ - sw2.rise(&boton2);//asigno a la interrupcion que produce el sw2 al soltarse la funcion boton2 - sw3.rise(&boton3);//asigno a la interrupcion que produce el sw3 al soltarse la funcion boton3 - int i;//entero usado para el random - led1=1;//apago el led rojo - //bucle principal - while(true){ - // Pone valor random en i (de 0 a 1) y prende el color correspondiente - i=rand()%2; - switch(i){ - case 0: led2=1;//si es 0 prendo el verde - break; - case 1: led3=1;//si es 1 prendo el azul - break; - } - //desactivo las interrupciones para escribir sin problemas - __disable_irq(); - //abro el archivo para escribir si no existe se crea - fp = fopen("/sd/puntos.txt", "w");//asigno el archivo a fp - if (fp != NULL) { - fprintf(fp, "%d",cont);//escrivo el contenido de cont en el archivo fp - fclose(fp);//cierro el archivo - } - //vuelvo a activar las interrupciones - __enable_irq(); - //bucle para esperar la interrupcion - while(led2.read()!=0 || led3.read()!=0){ - // espero a que aprete boton - } - //espero en la salida para mostrar el resultado - wait_ms(500); - //apago el led rojo si esta prendido - if(led1.read()==0) - led1=1; - } - -} +void opcion3(){ + float faX;//variable para el valor de x + acc.enable();//activar el sensor + while (true) { + acc.getX(faX);//funcion del sensor que devuelve la orientacion en x + if(faX>0.25f){//si esta inclinado a la derecha se mueve a la derecha + pc.printf("| | |o| \r\n"); + }else{ + if (faX<0.001f){//si esta inclinado a la izquierda se mueve a la izquierda + pc.printf("|o| | | \r\n"); + }else//sino queda en el centro + pc.printf("| |o| | \r\n");} + if(pc.readable()){ + menu(); + return; + } + } + +} \ No newline at end of file