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.
Dependencies: mbed tsi_sensor MMA8451Q
Diff: main.cpp
- Revision:
- 0:ad5829ebd588
diff -r 000000000000 -r ad5829ebd588 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun Jun 23 13:43:37 2019 +0000
@@ -0,0 +1,443 @@
+#include "mbed.h"
+#include "tsi_sensor.h"
+#include "MMA8451Q.h"
+#include "math.h"
+
+DigitalOut ledazul(LED_BLUE);
+DigitalOut ledverde(LED_GREEN);
+DigitalOut ledrojo(LED_RED);
+DigitalIn enta(PTC7);
+DigitalIn entb(PTC0);
+DigitalIn entc(PTC3);
+
+
+int e=0,cuenta=2,cantidad=1,estado=1,mal=0,nuevo=0,erro=0,b=1,demo=0,ap=4,cuenta2=0,temp1=0,temp2=0,temp3=0;
+int dato[50];
+Ticker tic2;
+Ticker tic1;
+void funcion();
+void cuento();
+
+
+int main(void)
+{
+ tic2.attach(&funcion, 1); //Contador general 1seg
+ tic1.attach(&cuento, 0.01); //Contador del sistema de antirebote 10mseg
+
+ ledrojo=1; //Apagamos todo antes de empezar por las dudas
+ ledazul=1;
+ ledverde=1;
+ printf("Presione los botones en el siguiente orden: (verde=1)(rojo=2)(azul=3)\n");
+
+ while (true) {
+
+ switch (estado) { //Maquina de estados gemeral
+ default:
+ case 1: //Estado para generar colores
+
+ if(b!=cuenta) { //Generamos colores hasta que generamos todos los que necesitamos (cuenta nos dice cuantos)
+ dato[b]=rand() % (1+2)+1; //Dato almacena los colores
+ printf("%d\n",dato[b]);
+ b++; //b nos va a servir para llevar la cuenta internamente en muchos estados
+ cantidad++; //Cantidad almacena cuantos colores hay guardados
+
+ }
+
+
+ if(b==cuenta) { //Si b alcanzo a la cantidad que colores que tendriamos que tener generados, avanza
+ estado=2;
+ b=1; //Borramos esta variable para que los siguientes estados la puedan usar
+
+ }
+ break;
+
+ case 2: //Estado para mostrar los colores que hay que apretar luego
+
+ if(dato[b]==1) { //Si esta almacenado el verde, se muestra el verde
+ ledverde=0;
+ ledrojo=1;
+ ledazul=1;
+ }
+ if(dato[b]==2) {
+ ledverde=1;
+ ledrojo=0;
+ ledazul=1;
+ }
+ if(dato[b]==3) {
+ ledverde=1;
+ ledrojo=1;
+ ledazul=0;
+ }
+
+ if(e==1) { //Luego de 1seg mostrando un color, nos vamos al estado 7 para esperar 1seg
+ estado=7;
+
+ e=0; //Volvemos a poner en 0 la variable del ticker
+ ledverde=1; //Apagamos todo para esperar 1seg
+ ledrojo=1;
+ ledazul=1;
+ b++; //Guardamos que mostramos 1 color mas
+ }
+ if(b==cantidad) { //Si mostramos todos los colores que tenemos almacenados avanzamos a la siguiente etapa
+
+ estado=4;
+ cuenta2=0;
+ demo=0; //Ponemos en 0 todas las variables locales para que las siguientes etapas las puedan usar
+ e=0;
+ ledverde=1; //Apagamos leds
+ ledrojo=1;
+ ledazul=1;
+ b=1;
+ }
+ break;
+
+ case 4:
+
+
+ switch (temp1) { //Maquina de antirebote para el color rojo
+ case 0:
+ if(enta==0){//Esperamos a que se apriete el pulsador
+ temp1=1;//Vamos al estado 1
+
+ cuenta2=0;
+ }
+
+
+ break;
+ case 1:
+ if(cuenta2>=1) {//Esperamos que pasen 20mseg antes de poder avanzar, asi ignoramos el rebote
+ temp1=2;
+
+
+ e=0; //Ponemos en 0 el ticker otra vez
+ ledverde=1; //Prendemos el led rojo
+ ledrojo=0;
+ ledazul=1;
+ ap=2; //Guardamos que se pulso el led rojo
+ }
+ break;
+ case 2:
+ if(enta==1){ //Esperamos a que se despulse
+ temp1=3; //Vamos al siguiente estado
+ cuenta2=0;
+ }
+
+ break;
+ case 3:
+ if(cuenta2>=1) { //Esperamos 20mseg para ignorar el rebote
+ temp1=0;
+
+ //Todas las maquinas de antirebote son iguales, solo que correspondientes a su pulsador y color asociado.
+ }
+ break;
+ }
+
+
+ switch (temp2) { //Maquina de antirebote para el color verde
+ case 0:
+ if(entb==0){
+ temp2=1;
+ cuenta2=0;
+ }
+ break;
+ case 1:
+ if(cuenta2>=1) {
+ temp2=2;
+
+
+ e=0;
+ ledverde=0;
+ ledrojo=1;
+ ledazul=1;
+ ap=1;
+ }
+ break;
+ case 2:
+ if(entb==1){
+ temp2=3;
+ cuenta2=0;
+ }
+ break;
+ case 3:
+ if(cuenta2>=1) {
+ temp2=0;
+
+
+ }
+ break;
+ }
+ switch (temp3) { //Maquina de antirebote del color azul
+ case 0:
+ if(entc==0){
+ temp3=1;
+ cuenta2=0;
+ }
+ break;
+ case 1:
+ if(cuenta2>=1) {
+ temp3=2;
+
+
+ e=0;
+ ledverde=1;
+ ledrojo=1;
+ ledazul=0;
+ ap=3;
+ }
+ break;
+ case 2:
+ if(entc==1){
+ temp3=3;
+ cuenta2=0;
+ }
+ break;
+ case 3:
+ if(cuenta2>=1) {
+ temp3=0;
+
+
+ }
+ break;
+ } //Termina la maquina
+
+ if(ap!=4) { //AP es 4 cuando nada se aprieta, en caso de que no sea 4 significa que algo se apreto
+ if(ap==dato[b]&&e==1) { //Si lo que se apreto es igual a lo que habia que apretar, avanzamos (tambien hay que esperar a que pase 1seg)
+ b++; //Guardamos que avanzamos en 1
+ estado=5; //Si es correcto, vamos al estado 5 que es un clon de este estado
+ e=0;
+
+ ap=4; //Ponemos AP en 4 para que no nos cuente mas de 1 vez un solo apriete
+ ledverde=1; //Apagamos todo
+ ledrojo=1;
+ ledazul=1;
+
+ }
+ if(ap!=dato[b]&&e==1) { //Si el boton no corresponde con lo que habia que apretar, aplicamos la parte del error
+
+ estado=6;
+ e=0;
+ b=1; //Ponemos en 0 todo (o 1 en caso de b)
+ }
+ }
+ if(b==cuenta) { //Si avanzamos correctamente hasta el punto que no hay mas colores que apretar, significa que ganamos
+
+ cuenta++; //Guardamos que queremos 1 color mas
+ e=0;
+ estado=8;
+ }
+ if(b==24) { //Si llegamos a 24 significa que el juego termino
+
+ b=1;
+ e=0;
+ estado=6;
+ }
+
+ if(cuenta2>=3000) { //Si pasan 3 segundos sin tocar nada tambien se pierde significa que el juego termino
+
+ b=1;
+ e=0;
+ estado=6;
+ }
+
+ break;
+ case 5: //Clon del estado 4
+
+
+ switch (temp1) {
+ case 0:
+ if(enta==0){
+ temp1=1;
+ cuenta2=0;
+ }
+ break;
+ case 1:
+ if(cuenta2>=2) {
+ temp1=2;
+
+ e=0;
+ ledverde=1;
+ ledrojo=0;
+ ledazul=1;
+ ap=2;
+ }
+ break;
+ case 2:
+ if(enta==1){
+ temp1=3;
+ cuenta2=0;
+ }
+ break;
+ case 3:
+ if(cuenta2>=2) {
+ temp1=0;
+
+
+ }
+ break;
+ }
+
+
+ switch (temp2) {
+ case 0:
+ if(entb==0){
+ temp2=1;
+ cuenta2=0;
+ }
+ break;
+ case 1:
+ if(cuenta2>=2) {
+ temp2=2;
+
+
+ e=0;
+ ledverde=0;
+ ledrojo=1;
+ ledazul=1;
+ ap=1;
+ }
+ break;
+ case 2:
+ if(entb==1){
+ temp2=3;
+ cuenta2=0;
+ }
+ break;
+ case 3:
+ if(cuenta2>=2) {
+ temp2=0;
+
+
+ }
+ break;
+ }
+ switch (temp3) {
+ case 0:
+ if(entc==0){
+ temp3=1;
+ cuenta2=0;
+ }
+ break;
+ case 1:
+ if(cuenta2>=2) {
+ temp3=2;
+
+
+ e=0;
+ ledverde=1;
+ ledrojo=1;
+ ledazul=0;
+ ap=3;
+ }
+ break;
+ case 2:
+ if(entc==1){
+ temp3=3;
+ cuenta2=0;
+ }
+ break;
+ case 3:
+ if(cuenta2>=2) {
+ temp3=0;
+
+
+ }
+ break;
+ }
+
+
+ if(ap!=4) {
+ if(ap==dato[b]&&e==1) {
+ b++;
+ estado=4; //Si es correcto, vamos al estado 4 otra vez. Es un ciclo infinito
+ e=0;
+ ap=4;
+ ledverde=1;
+ ledrojo=1;
+ ledazul=1;
+
+ }
+ if(ap!=dato[b]&&e==1) {
+
+ estado=6;
+ e=0;
+ b=1;
+ }
+ }
+ if(b==cuenta) {
+
+ cuenta++;
+ e=0;
+ estado=8;
+ }
+ if(b==24) { //Si llegamos a 24 significa que el juego termino
+
+ b=1;
+ e=0;
+ estado=6;
+ }
+
+
+ if(cuenta2>=3000) { //Si pasan 3 segundos sin tocar nada tambien se pierde significa que el juego termino
+
+ b=1;
+ e=0;
+ estado=6;
+ }
+ break;
+ case 6:
+ //Estado de error
+ ledverde=1; //Apagamos todo
+ ledrojo=1;
+ ledazul=1;
+ ap=4;
+
+ cantidad=1; //Ponemos todas las variables para empezar desde 0 todo el juego
+ cuenta=2;
+ b=1;
+ if(e==1) {
+ estado=1; //Luego de esperar 1seg, vamos al estado 1 a empezar otra vez
+ printf("Presione los botones en el siguiente orden: (rojo=2)(verde=1)(azul=3)\n");
+ }
+ e=0;
+
+
+ case 7:
+
+ if(e==1)
+ estado=2;//Esperamos 1seg antes de mostrar el siguiente color
+ e=0;
+ break;
+ case 8:
+ if(e==1)
+ estado=1;//Esperamos 1seg antes de avanzar en el juego
+ e=0;
+ break;
+
+
+
+
+
+
+
+ }
+
+
+
+
+ }
+}
+
+
+void cuento()
+{
+
+ cuenta2++; //Cuenta cada 10mseg para el sistema de antirebote
+
+}
+void funcion()
+{
+
+ if(e==0) //Se pone en 1 cada 1seg
+ e=1;
+
+}
\ No newline at end of file