Stap 6: Ultimas conexiones y programa
Nl las kunt lineas, explicare un poco el funcionamiento del programa y algunas istruzioni Gebruikershandleiding. 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 geen quereis, podeis bajar a la parte de Gonzalez y consejos y saltaros todo esto para saber las ultimas conexiones del proyecto y algun pequeño consejo. Aun asi repito que me parece algo muy interesante de saber, pero es vuestra eleccion jaja.
Explicacion del programa
Ya hemos conectado y sabemos como funcionan casi todos los elementos de nuestro proyecto. Individuele amendementen falta ver el programa, entenderlo, y acabar de verbinden Oenas pocas cosas mas para ejecutarlo.
El programa funciona de la siguiente manera:
Nl, Primero, como siempre, le decimos een arduino las librerias que vamos een necesitar 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 zonde descargar nada, que os la dejo aquí arriba.
Después, al contact arduino a la corriente, el programa entero se queda nl 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 permitteert, pues neen tiene corchetes y tiene un "punto y coma". Si después de VN "Terwijl" ponemos punto y coma zonde corchetes, significa que el terwijl geen hará nada mientras la condición de dentro zee verdad, esta simplemente esperando. Nl este caso. een que se pulse el botón. Como haremos para que detecte el botón pulseren? Conectaremos el boton nl modo "Pull-Down" que ya usamos nl mi anterior proyecto de "alarma/despertador con arduino". Bedriegen todo el rato leyendo el estado del pin 11 de arduino, hasta que zee hoog, pues mientra zee laag, bedriegen dentro de el "while();" esperando.
Cuando pulsemos el botón, escribiremos nl la pantalla LCD que comenzamos, y le pediremos al jugador que se coloque een una mínima distancia, ya elegida nl la variabele "mínimo", en mi caso 130 cm. nl la pantalla amendementen 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 "Do {ordenes} While(condicion);". Un "doen-terwijl" funciona igual que un terwijl, pero la condición se evalúa al finale, por lo que como mínimo las ordenes se ejecutan una vez. Es valido nl este caso, así, mínimo una vez amendementen aparece nl la pantalla la distancia a la que nos encontramos. Si amendementen encontramos een mas distancia de la mínima, lo escribirá una vez nl la pantalla, y el programa seguirá. La distancia, sera medida con la función "medirDistancia", explicada anteriormente.
Al colocarnos a la distancia requerida nl la pantalla veremos VN aviso de que nos movamos, y la cuenta de "1,2,3... Pajarito Ingles". Nl este tiempo sera cuando podamos movernos, porque al acabarse este tiempo, tendremos que quedarnos quietos. Después, viene la parte complicada del programa.
Ahora, zwaartelijn un "While()" leeremos el sensor para ver si hay movimiento. Si hay movimiento, el jugador perderá y tendremos que salir del tijdje. Pero geen solo si hay movimiento, también podremos salir si el jugador ha pasado un tiempo mínimo quieto, y arduino deba empezar de nuevo een contar para que este se mueva de nuevo. Aparte, si se ha pulseren el botón, el jugador van significara que ha llegado, y ha ganado. Como hacemos esto?
Bueno, mi idee ha sido, crear 2 variabelen booleanas, een 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á hoog, y como podemos ver nl la condicion del while(), saldremos, y el jugador habrá perdido. Si nl cambio, el botón ha sido anteriormente pulseren (mientras arduino contaba), 'b' se pone hoge y neen entramos nl el while(). Y la parte difícil ha sido esta: como creamos un cronometro nl arduino para contar si el tiempo mínimo ya ha pasado a la vez que seguimos el ejecutando 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 geen se ejecuta nada mas mientras este activo. Millis() es un contador que empieza een arduino contar desde que ha sido conectado a la corriente. Esto geen amendementen vale pues nosotros queremos que mientras contemos el tiempo leamos por el sensor si alguien se mueve. Para ello, se me ocurrió esta idee (que puede que haya mas geavanceerde, y mas voor, pero solo se me ocurrió esta, que me parece bastante buena, y me 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 nl nuestro arduino mientras este kent conectado a la corriente. Lo que hij echo, ha sido fijarle una fecha iedereen een arduino nl la variabele t con (setTime(...)), pues la fecha y la hora amendementen dan igual, solo amendementen 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 een estar quieto), así sabremos todo el rato cuanto tiempo ha pasado desde entonces, y podremos seguir ejecutando el programa de mientras. Cuando ese tiempo zee mas que el tiempo mínimo impuesto para estar parado (variabele "Parado", 8 seg nl mi caso), saldremos de el while(); y el programa se seguirá ejecutando.
De aquí nl adelante hay 3 Options. Si el jugador se ha movido, zwaartelijn 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 neen se ha movido, arduino empezara de nuevo een 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();"
Gonzalez y consejos
Para acabar por tanto, amendementen falta verbinden el botón nl modo "Pull-Down" (o Pull-up, pero habría que wisselmakelaar el programa en la parte de lectura del botón) y verbinden el pin 11 para leerlo.
El sensor, PIR, esta leyendo si hay movimiento o geen cuando arduino esta contando "1,2,3 pajarito ingles". Esto es onvermijdelijk porque el sensor da pulsos y geen hace falta que este conectado een arduino, como hemos dicho, por lo que si cuando esta contando 3, nos movemos, a la hora de que leamos con el pin 12 si alguien se ha movido, amendementen dara hoog, dat al tiempo que el sensor esta nl hoge y puede empezar de nuevo een leer , y perderemos. Por lo tanto, recomiendo dejar de moverse ya nl 2 o inclusief nl 1. Aun así, podemos arreglar esto poniendo un pequeño delay() despues de "1,2,3... Pajarito Ingles", así mientras esta ese delay() (que geen sera muy largo), el sensor pakket volver een leer de nuevo, aunque yo lo prefiero así.
Si llegamos zonde 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 pulseren un rato para que lea bien que el botón ha sido pulseren.
Cuando estas cerca, el sensor PIR puede llegar een ser muy verstandig, por lo que hay que estar muy quietos.
Finalmente espero que os haya situação 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 neen es invencible! ;)