1,2,3... Pajarito Ingles-Proyecto Arduino (6 / 6 steg)
Steg 6: Ultimas conexiones y programa
En las siguientes Lineasen, explicare un poco el funcionamiento del programa y de algunas instrucciones. Admito que es largo y puedo parecer un pesado, pero me parece super interesante saber y aprender estas pequeñas cosas, que pueden ser muy utiles. SI aun asi ingen quereis, podeis bajar a la parte de resumen y consejos y saltaros todo esto para saber las ultimas conexiones del proyecto y Algún pequeño consejo. Aun asi repito que me parece algo muy interesante de sabel, pero es vuestra eleccion jaja.
Explicacion del programa
Ya hemos conectado y sabemos como funcionan casi todos los elementos de nuestro proyecto. Solo nr falta ver el programa, entenderlo, y acabar de conectar unas pocas cosas mas para ejecutarlo.
El programa funciona de la siguiente manera:
Primero, como siempre, le decimos en arduino las librerias que vamos en necesitar, en este caso la de la pantalla LCD y la librería time.h, para controlar el tiempo (luego veréis por que). Wire.h es una pequeña librería dentro de la librería time.h, por lo que solamente descargaremos las de time.h, pues la de la pantalla LCD viene ya con el IDE y la reconoce synd descargar nada, que os la dejo aquí arriba.
Después, al conectar arduino a la corriente, el programa entero se queda sv espera hasta que pulsemos el botón que nos permitirá empezar. ESTA espera se hace con la ya conocida instrucción de "While();". Pero si os fijáis bien, este "While()" tiene un pequeña diferencia, pues ingen tiene corchetes y tiene un "punto y coma". SI después de FN "Medan" ponemos punto y koma synd corchetes, que significa el medan ingen hará nada mientras la condición de dentro havet verdad, esta simplemente esperando. En este caso. en que se puls el botón. Como haremos para que detecte el botón pulsado? Conectaremos el boton sv modo "Pull-Down" que ya usamos sv mi främre proyecto de "alarma/despertador con arduino". Estaremos todo el rato leyendo el estado del stift 11 de arduino, hasta que sea hög, pues mientra havet låg, estaremos dentro de el "while();" esperando.
Cuando pulsemos el botón, escribiremos en la pantalla LCD que comenzamos, y le pediremos al jugador que se coloque en una mínima distancia, ya elegida en la variabel "mínimo", sv mi caso 130 cm. En la pantalla nos aparecerá todo el rato la distancia mínima, y la distancia a la que nos encontramos, hasta que nos posicionemos suficientemente alejados. Esto se hará con la instrucción "Göra {ordenes} While(condicion);". FN: S "göra-medan" funciona igual que un medan pero la condición se evalúa al slutlig, por lo que como mínimo las ordenes se ejecutan una vez. ES valido en este caso, así, mínimo una vez nos aparece en la pantalla la distancia a la que nos encontramos. SI nos encontramos en mas distancia de la mínima, lo escribirá una vez sv la pantalla, y el programa seguirá. La distancia, sera medida con la función "medirDistancia", explicada anteriormente.
Al colocarnos a la distancia requerida en la pantalla veremos un aviso de que nos movamos, y la cuenta de "1,2,3... Pajarito Ingles". En este tiempo sera cuando podamos movernos, porque al acabarse este tiempo, tendremos que quedarnos quietos. Después, viene la parte complicada del programa.
Ahora, mediante FN: s "While()" leeremos el sensor para ver si hay movimiento. SI hay movimiento, el jugador perderá, y tendremos que salir del tag. Pero inte solo si hay movimiento, también podremos salir si el jugador ha pasado FN tiempo mínimo quieto, y arduino deba empezar de nuevo en contar para que este se mueva de nuevo. Aparte, si se ha pulsado el botón, significara que el jugador ha llegado, y ha ganado. Como hacemos esto?
Bueno, mi idé ha sido, crear 2 variabler booleanas, en y b, que sean las condiciones de el movimiento y de el botón. SI alguien se mueve mientras debe estar parado, "a" se pondrá hög, y como podemos ver en la condicion del while(), saldremos, y el jugador habrá perdido. SI sv cambio, el botón ha sido anteriormente pulsado (mientras arduino contaba), "b" se pone hög y inga entramos en el while(). Y la parte difícil ha sido esta: como creamos un cronometro en arduino para contar si el tiempo mínimo ya ha pasado a la vez que seguimos ejecutando el programa? Arduino tiene varias funciones para contar el tiempo, delay() y millis() por ejemplo. Delay() para cualquier otra cosa que este haciendo el micro-controlador y inga se ejecuta nada mas mientras este activo. Millis() es un contador que empieza en contar arduino desde que ha sido conectado a la corriente. Esto ingen nos vale pues nosotros queremos que mientras contemos el tiempo leamos por el sensor si alguien se mueve. Para ello, se mig ocurrió esta idé (que puede que haya mas soluciones, y mas fáciles, pero solo se mig ocurrió esta, que me parece bastante buena, y mig gustaría saber si alguien sabe de otra manera). Con la librería time.h (acompañada de wire.h), podemos llevar la cuenta de la horay la fecha sv nuestro arduino mientras este esté conectado a la corriente. Lo que han echo, ha sido fijarle una fecha cualquiera en arduino sv la variabel t con (setTime(...)), pues la fecha y la hora nos dan igual, solo nr interesa que los segundos sean 00. Cada segundo leeremos con "segundos=second(t)" los segundos que han pasado desde que "seteamos" el tiempo (justo cuando el jugador debe empezar en estar quieto), así sabremos todo el rato cuanto tiempo ha pasado desde entonces, y podremos seguir ejecutando el programa de mientras. Cuando ese tiempo havet mas que el tiempo mínimo impuesto para estar parado (variabeln "Parado", 8 seg sv mi caso), saldremos de el while(); y el programa se seguirá ejecutando.
De aquí en adelante hö 3 opciones. SI el jugador se ha movido, mediante la función "teHasMovido()," le indicaremos que se ha movido y se encenderá la luz roja del RGB. Para empezar de nuevo habra que pulsar el botón. SI ingen se ha movido, arduino empezara de nuevo en contar "1,2, 3... Pajarito Ingles". Y si por ultimo estaba pulsando el botón, se encenderá la luz verde del RGB y le indicaremos que ha ganado con la función "hasGanado();"
Resumen y consejos
Para acabar por tanto, nos falta conectar el botón sv modo "Pull-Down" (o Pull-up, pero habría que cambiar el programa sv la parte de lectura del botón) y conectar el pin 11 para leerlo.
El sensor PIR, esta leyendo si hay movimiento o ingen cuando arduino esta contando "1,2,3,... pajarito ingles". Esto es oundvikliga porque el sensor da pulsos y ingen hare falta que este conectado en arduino, como hemos dicho, por lo que si cuando esta contando 3, nr movemos, a la hora de que leamos con el stift 12 si alguien se ha movido, nos dara hög, debido al tiempo que el sensor esta en hög y puede empezar de nuevo en leer , y perderemos. Por lo tanto, recomiendo dejar de moverse ya en 2 o incluso en 1. Aun así, podemos arreglar esto poniendo un pequeño delay() despues de "1,2,3... Pajarito Ingles", así mientras esta ese delay() (que inget serum muy largo), el sensor podrá volver en leer de nuevo, aunque yo lo prefiero así.
SI llegamos synd que nos vea movernos hasta arduino mientras esta contando "1,2, 3..., Pajarito Ingles", tenemos que pulsar el botón para ganar. ES recomendable dejarlo pulsado un rato para que lea bien que el botón ha sido pulsado.
Cuando estas cerca, el sensor PIR puede llegar en ser muy förnuftiga, por lo que hay que estar muy quietos.
Finalmente espero que os haya gustado este proyecto, que aun siendo largo es muy muy interesante y la verdad que muy muy divertido. Gracias y Buena suerte contra Arduino, pues es un muy buen jugador de "1,2,3... Pajarito Ingles".
ES difícil, pero ingen es invencible! ;)