Todos los días, antes de comenzar con la nueva clase vamos a resolver los retos planteados el día anterior.
El primer reto planteado consistía en iluminar el led RGB con nueve colores diferentes. Os propusimos usar los colores del arcoíris, con los cuales el código, si usamos funciones propias, podría quedar de la siguiente forma:
El segundo reto consistía en crear una melodía diferente a la de la clase, ¡a vuestro gusto! Un ejemplo podría ser el siguiente:
Ambos retos te los puedes descargar en Classroom, están en la sección Solución retos 1 y 2 en DÍA 2: 3, 2, 1… ¡¡YAAA!! de Tareas de Clase. Son los archivos con nombres «dia2_pulsador_solucion2.ino» y «dia2_pulsador_solucion2.ino«.
Recordad que en estos retos os propusimos ideas subjetivas, por lo que lo normal será que no todo sea igual, que hayáis escogido tonos diferentes o el color tenga otra tonalidad. ¡Seguid usando los vuestros!
Ya hemos solucionado los retos de ayer, así que… ¿Estáis preparadas para empezar con el proyecto?
Hoy vamos a unir conocimientos que aprendimos ayer con nuevos componentes, y así vamos a ir implementando un temporizador. Vamos a comenzar presentándoos un nuevo componente: el pulsador.
Como su nombre indica, un pulsador (o botón) es un elemento el cual al pulsarlo ocurre una determinada acción. La diferencia con un interruptor, sería que este último mantiene su posición. Por ejemplo, cuando entráis de noche a vuestro cuarto, cambiáis la posición del interruptor para encender la luz. En cambio, el pulsador solo tiene en cuenta un instante, en función de cómo se programe, ese instante será la bajada del pulsador mientras le dais (falling) o la subida cuando soltáis (rising).
Esto vamos a ir viéndolo con más detalle en nuestro código asociado a una alarma. La idea es conectar un pulsador que nos permita apagar una alarma. Igual que ayer, nos vamos a plantear las mismas preguntas:
¿qué va a hacer mi programa?
Lógica: Vamos a estar escuchando ciertos sonidos (unos tonos predefinidos) y queremos que paren cuando nosotras decidamos. Para ello, al pulsar el botón, éstos dejarán de oírse. Por tanto, una secuencia de tonos va a ir oyéndose y en el instante que pulsemos el botón esto dejará de ocurrir.
Estructura: El buzzer va a estar emitiendo nuestra melodía. Para pararlo, se debe indicar en el código que se tenga en cuenta la situación del pulsador. Pensad que la alarma es un sistema en tiempo real. Como el airbag de un coche. Todo el sistema funciona con normalidad (sonar alarma o mover el motor en caso del coche) hasta que ocurre un evento externo (pulsar botón o fuerte golpe en el coche) que hace reaccionar el sistema y ejecuta unas «instrucciones de emergencia» que bien son parar la música o lanzar un airbag. Así que vamos a tener que definir el evento físico urgente que necesita atención inmediata (pulsar botón) mediante una interrupción. Más adelante veremos en detalle en qué consisten las interrupciones.
Materiales: La placa de Arduino uno, el cable para poder programarla y cables para poder conectar los componentes a los pines. Además, en este caso necesitaremos el buzzer y un pulsador. Con respecto a los cables, os aconsejamos usar 7 cables macho-macho. También os queremos pedir que os fijéis en nuestro esquema de conexión y no miréis otros por internet, ya que hay muchos tipos de conexiones diferentes, ¡y esta funciona con nuestros materiales!
El código para descargar se encuentra en Classroom, en la tarea su nombre es «Código pulsador«. Vamos a ir viendo poco a poco cómo sería esto:
La declaración de variables sería igual que en el código del buzzer, sólo que hay que escoger un pin más de Arduino al que asociar el pulsador:
La variable botonPulsado se trata de una variable lógica, la cual va a estar como 0 o false hasta que pulsemos el botón, pasando a estar a 1 o true.
Las grandes diferencias con el código del día anterior van a estar dentro de void setup(), en el cual debemos definir toda la configuración del botón:
Con pinMode() estamos definiendo tanto el pin asociado al pulsador como su forma de conectar el circuito. Como hemos visto antes, los botones se pueden conectar de dos formas, usaremos el modo PullUp ya que Arduino incorpora componentes internos para facilitar las conexiones de botones de este modo. También vamos a utilizar una función llamada interrupción que nos permite asociar un trozo de código a la pulsación de un botón. Esta es attachInterrupt(). Las interrupciones se atienden con unas instrucciones de emergencia que se definen en una función. Por eso usamos un método que se llama «attachInterrupt» que asocia un evento físico en un pin a una función (pararAlarma).
Gracias a esta función, cuando el Arduino está ejecutando el programa, si se pulsa el botón asociado a la interrupción, el programa interrumpirá la instrucción en la que se encontraba y saltará inmediatamente a ejecutar la función asociada. ¿Cuándo vamos a utilizar esta interrupción? Mientras la melodía está sonando, si se pulsa el botón se ejecutará inmediatamente la función encargada de parar la melodía.
Como hemos definido varios tonos, éstos no pueden sonar a la vez ni todo el rato. Para controlar el funcionamiento correcto vamos a aprender un tipo de bucle que se puede usar con arduino: el condicional while. Éste permite que lo que haya dentro de él se siga ejecutando hasta que no sea cierta la condición que se le asocia.
Dentro de void loop() tendremos lo siguiente:
Aquí hemos visto por primera vez el condicional while(). En este caso, la condición que se le asocia es que el botón no haya sido pulsado. Así el buzzer va a seguir sonando hasta que el pulsador se acciona.
Dentro tenemos una función que se llama sonarNota(). ¿Qué significa? ¿Arduino tiene una función que se llame así? La respuesta es no, es una función que nosotras creamos para que el código se vea más bonito, con menos líneas. Dicha función se define debajo del loop() y en su interior están las líneas de código asociadas a ella. En este caso:
Aquí vemos que en su interior se encuentra un código muy similar a la clase anterior, con las funciones tone(), noTone(), y delay(). Es decir, cuando se llame a sonarNota(), efectivamente ¡sonará una nota! La que toque según la variable nTonoActual.
Esto sería una configuración básica que une el pulsador y el buzzer, ¡ahora a practicar!
RETOS DIARIOS
Hoy hay bastantes retos, pero no os agobiéis. ¡Vamos a hacerlo poco a poco!
Reto1: 3,2,1… ¡alarma!
Añadir una cuenta atrás utilizando una variable que actúe de temporizador. Para poder realizar el temporizador os dejamos la siguiente pista: tened en mente un contador hacia atrás, es decir, usad una estructura que permita ir disminuyendo una variable hasta que llegue a cero. ¿Hemos usado algo similar en algún código de clase?
Para poder resolver este reto te facilitamos parte del código con algunos huecos que debes rellenar tú. El código de la plantilla está en la sección Reto 1 : [ ???? ] … ¡¡YA!!
Reto2: ¡El led de Arduino parpadea!
Si no os habéis fijado, Arduino tiene un led que se ve parpadear en determinadas ocasiones…
En este reto, te proponemos usar LED_BUILTIN para que el led interno de tu Arduino parpadee mientras se hace la cuenta atrás. Tened en cuenta que la cuenta atrás va “segundo a segundo”, por lo que habrá que dividir la actuación de este led como encendido los primeros 500ms y apagado la otra mitad.
Como pista para resolverlo, te recomendamos que mires el ejemplo del código Blink.ino del primer día (Archivo -> Ejemplos -> 01.Basics -> Blink : led del Arduino en parpadeo).
Reto3: ¿Cómo reiniciamos la alarma?
Como hemos visto en clase, las interrupciones son funciones que tienen prioridad para Arduino, de tal forma que cuando se usa esa función de interrupción, Arduino deja el programa por donde iba leyendo para ejecutar el código que tiene la función de interrupción. El código que os dimos, tiene programada la interrupción para que al pulsar el botón(A) se pare la alarma.
El reto va a consistir en añadir un segundo botón (B) que lo que hará es reiniciar la alarma.
El botón (B) se tiene que conectar al pin 3 con interrupción.
Es decir, la secuencia de nuestro programa queremos que sea:
1. Esperar a que pase el tiempo transcurrido
2. Hacer que suene la alarma
3. Pulsar el botón A para detener la alarma
4. Esperar el tiempo deseado y pulsar el botón B
5. Volver al tiempo transcurrido
Para resolver este reto, te facilitamos la plantilla en la tarea Reto 3 : Reiniciar la alarma sin reiniciar nuestro Arduino, dónde está marcado con astericos (**) el lugar donde tendrás que escribir la parte del código necesaria para poder reiniciar la alarma y realizar las comprobaciones de si está encendida o no… ¡Así que no os agobiéis y usad la plantilla!
El objetivo final de hacer estos retos es ir construyendo un programa final que tiene como misión poder establecer un tiempo de espera, encender el temporizador con un botón B, y esperar a que salte la alarma con la melodía creada el día anterior. Solo se podrá parar la alarma con el botón de parada, A. Si se desea reanudar la alarma habrá que pulsar B de nuevo.
3, 2, 1… ¡Conseguido! 😉
Cuando lo tengas manda un video funcionando por telegram a @F3l1c13n74 y ¡lo publicaremos en las redes sociales! Si tienes twitter o instagram añádenos tu usuario junto con el vídeo en el mensaje de telegram para que te mencionemos en la cuenta de SereIngeniera y de la OSLUGR.