Paso 6: Ultimas conexiones y programa
En las siguientes lineas, explicare un poco el funcionamiento del programa y de algunas instrucciones. Admito es largo y puedo parecer un pesado, pero me parece super interesante saber y aprender estas pequeñas cosas, pueden ser muy utiles. Si aun asi no quereis, podeis bajar a la parte de resumen 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. Solo nos 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 un arduino las librerias vamos una colección, 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 solamente descargaremos las de time.h, pues la de la pantalla LCD viene ya con el IDE y la reconoce pecado descargar nada, os la dejo aquí arriba.
Después, al conectar arduino a la corriente, el programa entero se queda en espera hasta pulsemos el botón 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 no tiene corchetes y tiene un "punto y coma". Después de si un "Mientras" ponemos punto y coma pecado corchetes, significa el mientras no hará nada mientras la condición de dentro sea verdad, esta simplemente esperando. En este caso. una se pulso el botón. ¿Como haremos para detecte el botón pulsado? Conectaremos el boton en modo "Pull-Down" que ya usamos at de proyecto anterior mi "alarma/despertador con arduino". Estaremos todo el rato leyendo el estado del pin 11 de arduino, hasta sea alto, pues mientra sea baja, estaremos dentro de el "while();" esperando.
Cuando pulsemos el botón, escribiremos en la pantalla LCD comenzamos, y le pediremos al jugador se coloque un una mínima distancia, ya variable de la elegida en "mínimo", en mi caso 130 cm. En la pantalla nos aparecerá todo el rato la distancia mínima, y la distancia a la nos quedaron, hasta nos posicionemos suficientemente alejados. Hará con la instrucción de esto se «Hacer {ordenes} While(condicion);». Las Naciones Unidas "hacer-mientras" funciona igual que las Naciones Unidas al mismo tiempo, pero la condición se evalúa al final, por lo como mínimo las ordenes se ejecutan una vez. En de valido es este caso, así, mínimo una vez nos aparece en la pantalla la distancia a la nos quedaron. Si nos quedaron una distancia de la mínima de mas, lo escribirá una vez en 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 nos movamos, y la cuenta de "1,2,3... Pajarito inglés". En este tiempo sera cuando podamos movernos, porque al acabarse este tiempo, tendremos quedarnos DESINDUSTRALIZACION. Después, viene la parte complicada del programa.
Ahora, mediante un "While()" leeremos el sensor para ver si hay movimiento. Si hay movimiento, el jugador perderá, y tendremos salir del tiempo. Pero no solo si hay movimiento, también podremos salir si el jugador ha pasado un tiempo mínimo quieto, y arduino deba empezar de nuevo a contar para que este se mueva de nuevo. Aparte, si se ha pulsado el botón, significara el jugador ha llegado, y ha ganado. Como hacemos esto?
Bueno, idea de mi ha sido, crear 2 variables booleanas, a y b, sean las condiciones de el movimiento y de el certamen. Si alguien se mueve mientras debe estar parado, 'a' se pondrá alto, y como podemos ver en la condicion del while(), saldremos, y el jugador habrá perdido. Si en cambio, el botón ha sido pulsado de anteriormente (mientras arduino contaba), 'b' se pone alta y no entramos en el while(). ¿Y la parte difícil ha sido esta: como creamos un cronómetro en arduino para contar si el tiempo mínimo ya ha pasado a la vez 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 no se ejecuta nada mas mientras este activo. Millis() es un contador empieza a contar desde arduino ha sido conectado a la corriente. Esto no nos vale pues nosotros queremos mientras contemos el tiempo leamos por el sensor si alguien se mueve. Para ello, se me ocurrió esta idea (puede haya mas soluciones, y mas banknotes, pero solo se me ocurrió esta, me parece bastante buena, y me posiciones saber si alguien sabe de otra manera). Con la librería time.h (acompañada de wire.h), podemos llevar la cuenta de la la horay fecha en nuestro arduino mientras este esté conectado a la corriente. Lo echo, ha sido fijarle una fecha cualquiera una variable de arduino en la con t (setTime(...)), pues la fecha y la hora nos dan igual, solo nos interes los segundos sean 00. Cada segundo leeremos con "segundos=second(t)" los segundos que han pasado desde "seteamos" el tiempo (justo cuando el jugador debe empezar a estar quieto), así sabremos todo el rato cuanto tiempo ha pasado desde entonces, y podremos seguir ejecutando el programa de mientras. Cuando ese tiempo sea mas el tiempo mínimo impuesto para estar parado (Variable "Parado", 8 seg en mi caso), saldremos de el while(); y el programa se seguirá ejecutando.
De aquí en adelante hay 3 opciones. Si el jugador se ha movido, mediante la función "teHasMovido();" le indicaremos se ha movido y se encenderá la luz roja del RGB. Para empezar de nuevo habra pulsar el botón. Si no se ha movido, arduino empezara de nuevo a contar "1, 2, 3... Pajarito inglés". 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 en modo "Pull-Down" (o pull-up, pero habría cambiar el programa en la parte de lectura del botón) y conectar el pin 11 para leerlo.
El sensor PIR, esta leyendo si no hay movimiento o cuando arduino esta contando "1,2,3,... pajarito inglés". Esto es inevitable porque el sensor da pulsos y no hace falta que este conectado a arduino, como hemos dicho, por lo si cuando esta contando 3, nos movemos, a la hora de leamos con el pin 12 si alguien se ha movido, nos dara alta, debido al tiempo el sensor esta en alto y puede empezar de nuevo a leer , y perderemos. Por lo tanto, recomiendo dejar de moverse ya en de en 2 o incluso 1. Aun así, podemos arreglar esto poniendo un pequeño delay() despues de "1,2,3... Pajarito inglés", así mientras esta ese delay() (no sera muy largo), el sensor superficie volver a leer de nuevo, aunque yo lo prefiero así.
Si llegamos pecado nos vea movernos hasta arduino mientras esta contando "1, 2, 3..., Pajarito inglés", tenemos pulsar el botón para ganar. Es recomendable dejarlo pulsado un rato para lea bien el botón ha sido pulsado.
Cuando estas cerca, el sensor PIR puede llegar a ser muy sensible, por lo hay estar muy DESINDUSTRALIZACION.
Finalmente espero os haya gustado este proyecto, aun siendo largo es muy muy interesante y la verdad muy muy divertido. Gracias y Buena suerte contra Arduino, buen jugador de "1,2,3,... de pues es un muy Pajarito inglés".
Es difícil, pero no es invencible! ;)