Instrucciones de Repetición 1.- Instrucciones de repetición En la unidad anterior vimos que hay dos tipos de instrucciones para controlar el flujo de un programa: las instrucciones de selección y las de repetición. Después de haber estudiado las de selección, le llega ahora el turno a las instrucciones de repetición. Estas instrucciones permiten crear bucles en nuestro programa. Un bucle es un bloque de código que se repite un determinado número de veces. A cada una de esas repeticiones se le llama iteración. Por tanto, las instrucciones de repetición permiten hacer que un bloque de código se repita tantas veces como nosotros queramos. Estas instrucciones son for, while y do-while. 2.- Instrucción for Imagina que queremos ejecutar un conjunto de instrucciones un determinado número de veces. Por ejemplo, queremos que un LED parpadee 100 veces seguidas. Con lo que sabemos hasta ahora, no tendríamos más remedio que repetir 100 veces las mismas instrucciones, lo que implicaría un código muy largo y pesado. Para evitar tener que repetir código innecesario, existe una instrucción que permite repetir un determinado código las veces que queremos. Tan sólo hay que especificarle cuántas veces queremos que se repita. Esta instrucción se llama for, y su estructura es la siguiente: La instrucción for inicializa una variable al valor elegido por nosotros. Cuando termina la primera iteración, incrementa la variable según lo especificado, y comprueba si dicha variable cumple la condición indicada. Si la cumple, se ejecuta una nueva iteración. Si no la cumple, se abandona el bucle. Por ejemplo, para hacer que el LED interno parpadee 100 veces escribiríamos: En este ejemplo, estamos utilizando la variable i para contar el número de iteraciones. Concretamente, estamos diciendo que inicialmente la variable i valga 0. Después decimos que las acciones se repitan mientras i sea menor que 100. Finalmente, estamos diciendo que cada vez que se ejecute una nueva iteración, la variable i se incremente en 1 su valor. Cuestión: Indica cuántas veces se ejecutará el código que se encuentra dentro de la siguiente instrucción for: Ejercicios. 1.- Realiza un programa para que el microcontrolador de Arduino haga que cuatro diodos LED parpadeen al mismo tiempo cuatro veces cada vez que se acciona un pulsador. 2.- Realiza un programa para que el microcontrolador de Arduino controle el parpadeo de cuatro diodos LED mediante cuatro pulsadores, según las siguientes reglas: • Si se acciona el pulsador 1, los LEDs papadearán 2 veces. • Si se acciona el pulsador 2, los LEDs parpadearán 4 veces. • Si se acciona el pulsador 3, los LEDs parpadearán 6 veces. • Si se acciona el pulsador 4, los LEDs parpadearán 8 veces. 3.- Si el ejercicio 2 lo has resuelto escribiendo 4 bucles for, cada uno de ellos con un número de iteraciones diferente, vuelve a realizar el ejercicio 2, pero esta vez escribiendo un único bucle for, en el que el número de iteraciones no sea un número fijo sino una variable. 4.- Realiza un programa para que el microcontrolador de Arduino provoque el parpadeo de cuatro diodos LED, de forma que el usuario pueda elegir el número de veces que los LEDs parpadean, utilizando para ello 2 pulsadores. El funcionamiento será el siguiente: el usuario irá pulsando uno de los pulsadores, y el microcontrolador deberá ir contando el número de pulsaciones. Cuando el usuario accione el segundo pulsador, los LEDs deberán parpadear tantas veces como se haya pulsado el primer pulsador. 3.- Instrucción while_ Existe otra instrucción que sirve para repetir un mismo código un número determinado de veces. Esa instrucción se llama while, y su estructura es la siguiente: While significa en inglés mientras. Por tanto, la acción o acciones que se encuentran dentro de las llaves se ejecutarán mientras se cumpla la condición establecida entre paréntesis. Esta condición puede cambiar a expensas de una expresión dentro del código del bucle o por un evento externo, por ejemplo, un cambio en un pin al que esté conectado un sensor o un pulsador. Para hacer que el LED interno de Arduino parpadee 100 veces escribiríamos: En este caso, la variable que utilizamos para contar el número de iteraciones ha de ser inicializada antes de empezar la instrucción while (mientras que), y debe ser actualizada durante la ejecución del bucle para que el programa pueda salir de él en un momento dado. Como acabamos de ver en el ejemplo anterior, es posible escribir el mismo bucle utilizando dos instrucciones diferentes: while (mientras que) o for(repite). Si esto es así, ¿por qué existen dos instrucciones distintas cuando sobraría con una sola? La respuesta es que en realidad no son dos instrucciones equivalentes, sino que tienen una diferencia muy importante: cuando escribimos una instrucción for, tenemos que saber de antemano cuántas veces queremos que se repita el bucle. Sin embargo, cuando utilizamos la instrucción while, no necesariamente tenemos que saber cuántas veces debe ejecutarse el bucle, sino que eso puede definirse a lo largo de la ejecución del programa. Por ejemplo, imagina que quieres hacer un programa para que el LED interno parpadee indefinidamente hasta que el usuario accione un pulsador. En este caso, cuando escribimos el código no sabemos cuántas veces tiene que repetirse el bucle, ya que de hecho el número de repeticiones puede cambiar cada vez. Por tanto, deberíamos usar la instrucción while de la siguiente manera: En el programa de la derecha, las acciones se repetirán mientras el valor leído en el pin 11 del pulsador sea 1, es decir, mientras el pulsador no esté pulsado. En el momento en que alguien accione el pulsador, el valor leído en el pin será 0, por lo que no se cumplirá la condición y se saldrá del bucle. Es decir, en este programa la condición de salida del bucle depende de algo que sucede externamente. Ejercicios. 5.- Vuelve a escribir el programa del ejercicio 1, pero utilizando un bucle while en lugar de un bucle for. 6.- Vuelve a escribir el programa del ejercicio 4, pero utilizando un bucle while en lugar de un bucle for. 7.- Realiza un programa para que el microcontrolador de Arduino genere una secuencia de encendido y apagado de 2 diodos LED. La secuencia en concreto debe ser la siguiente: - Inicialmente debe parpadear 4 veces el diodo derecho. - A continuación, deben parpadear los dos LEDs indefinidamente hasta que el usuario accione un pulsador. - Finalmente debe parpadear 4 veces el LED izquierdo. - Una vez terminada la secuencia, ésta debe repetirse desde el principio. 8.- Realiza un programa para que el microcontrolador de Arduino genere una secuencia de encendido y apagado de 8 diodos LED controlada por un conmutador. La secuencia en concreto debe ser la siguiente: - Inicialmente parpadeará únicamente el primer LED, hasta que el usuario ponga el conmutador en la posición de ‘1’ lógico. - A continuación, parpadeará únicamente el segundo LED, hasta que el usuario ponga el conmutador en la posición de ‘0’ lógico. - Seguidamente parpadeará únicamente el tercer LED, hasta que el usuario vuelva a poner el conmutador en la posición de ‘1’ lógico. - A continuación, parpadeará únicamente el cuarto LED, hasta que el usuario vuelva a poner el conmutador en la posición de ‘0’ lógico. - El proceso continuará hasta que todos los LEDs hayan parpadeado, momento en el que la secuencia volverá a empezar desde el principio. 9.- Realiza un programa para que el microcontrolador de Arduino una serie de efectos de visualización sobre dos diodos LED controlados por dos conmutadores y un pulsador. Cuando el usuario accione el pulsador, el microcontrolador leerá los dos conmutadores y realizará los siguientes efectos: - Si los dos conmutadores están a 0, parpadeará 4 veces el LED derecho. - Si el primer conmutador está a 0 y el segundo está a 1, parpadeará 4 veces el LED izquierdo. - Si el primer conmutador está a 1 y el segundo está a 0, parpadearán 6 veces los dos LEDs. - Si los dos conmutadores están a 1, parpadearán 8 veces los dos LEDs. Cuando termine la secuencia seleccionada, los LEDs permanecerán apagados hasta que el usuario vuelva a accionar el pulsador, momento en que volverá a repetirse la secuencia elegida. 4.- Instrucción do-while El formato de la instrucción do-while es el siguiente: La instrucción do-while funciona de la forma parecida a la instrucción while, con la salvedad de que la condición se evalúa al final del bucle, en lugar de al principio. Esto implica que el bucle siempre se ejecutará al menos una vez. En cambio, en la instrucción while, si la condición no se cumple desde el principio, el bucle no llega a ejecutarse ninguna vez. Para hacer que un LED parpadee 100 veces con la instrucción do-while escribiríamos: A modo de resumen, utilizaremos las instrucciones for, while o do-while según lo siguiente: ▪ For: cuando sepamos de antemano el número de veces que debe ejecutarse el bucle. ▪ While: cuando no sepamos de antemano el número de veces que se ejecutará el bucle, sino que esto se decidirá durante la ejecución del programa. ▪ Do-while: cuando no sepamos de antemano el número de veces que se ejecutará el bucle, y además deseamos que pase lo que pase se ejecute al menos una vez. Ejercicios 10.- Vuelve a escribir el programa del ejercicio 5, pero utilizando un bucle do-while en lugar de un bucle while. 11.- Vuelve a escribir el programa del ejercicio 6, pero utilizando un bucle do-while en lugar de un bucle while. 12.- Vuelve a escribir el programa del ejercicio 7, pero utilizando un bucle do-while en lugar de un bucle while. 5.- Instrucción continue La instrucción continue se utiliza dentro de un bucle, y hace que el programa se salte el resto de las instrucciones de la iteración actual del bucle, y vaya directamente a comprobar si se cumple la condición para la siguiente iteración. Por ejemplo, en el siguiente programa: Cuando el bucle se encuentre entre las iteraciones 31 y 49, se ejecutará la instrucción continue, lo que hará que se salte las acciones que vienen a continuación, pasando directamente a la siguiente iteración. Es decir, las acciones escritas a continuación de la instrucción continue no se ejecutan en las iteraciones que van de la 31 a la 49. La instrucción continue no es muy utilizada, pero conviene conocerla porque puede ayudar a simplificar la programación en algunos casos. Ejercicios. 13.- Se pretende realizar un sistema que controle la activación de una pantalla de 7 segmentos mediante dos pulsadores. El funcionamiento debe ser el siguiente: - Inicialmente, la pantalla mostrará el número 0. - Cada vez que se accione el pulsador 1, el número de la pantalla irá incrementándose en 1 (para simplificar el problema, supondremos que no se pulsará más de 9 veces). - Cuando el usuario accione el pulsador 2, el sistema comenzará a generar una cuenta atrás automática, empezando en el último número mostrado en pantalla, y terminando en 0. Cada número se mostrará durante 1 segundo. - Cuando termine la cuenta atrás, el sistema inicializará todos los valores para poder comenzar de nuevo. Ejemplo: si, una vez alimentada la placa, el usuario acciona 5 veces el pulsador 1, la pantalla irá incrementándose con cada pulsación hasta el número 5. Si en ese momento acciona el pulsador 2, comenzará la siguiente cuenta atrás automática: 5-4-3-2-1-0 (cada número durante 1 segundo). 14.- Se pretende implementar un dado electrónico con una pantalla de 7 segmentos y un pulsador. El funcionamiento debe ser el siguiente: - Nada más resetear el microcontrolador, éste comenzará a contar del 1 al 6 periódicamentea mucha velocidad. Deesta forma, el usuario no podrá distinguir el número que aparece en la pantalla de 7 segmentos. - Cuando el usuario apriete un pulsador, la cuenta se detendrá durante dos segundos, de forma que el usuario podrá ver el valor de la tirada del dado electrónico. - Después, el número que aparece en pantalla parpadeará tantas veces como indique el propio número. Es decir, si sale un 4, parpadeará 4 veces, con un tiempo de apagado y encendido de 500ms. - Después del parpadeo el microcontrolador volverá a la situación inicial, contando a gran velocidad, preparado para una nueva tirada. 15.- Utiliza la placa Arduino UNO para diseñar un pequeño programador de riego de 4 sectores. El programador dispondrá de un pulsador para iniciar el riego, 2 conmutadores para que el usuario pueda seleccionar el número de veces que se repetirá el ciclo de riego, 4 salidas para activar 4 electroválvulas (una por sector) y una pantalla de 7 segmentos donde aparecerá el tiempo que queda de riego del sector que se está regando en ese momento. El funcionamiento del programador será el siguiente: inicialmente, el usuario utilizará los dos conmutadores para seleccionar el número de veces que se repetirá el ciclo de riego (00 -> no se riega; 01 -> el ciclo se hace sólo una vez; 10 -> el ciclo se repite dos veces; 11 -> el ciclo se repite tres veces). Cuando el usuario accione el pulsador, comienza el ciclo de riego, en el que cada sector se debe regar durante 3 minutos. En concreto, el ciclo será el siguiente: - Inicialmente se activa la electroválvula 1, y en la pantalla aparece el número 3. Transcurrido un minuto, en la pantalla aparece el 2. Transcurrido otro minuto, aparece un 1. - Cuando transcurre otro minuto, se apaga la electroválvula 1, se enciende la número 2, y en la pantalla vuelve a aparecer el número 3, que va decrementándose conforme pasan los minutos. - El mismo ciclo se repite para las electroválvulas 3 y 4. Cuando termina el ciclo de riego, éste debe repetirse tantas veces como haya indicado previamente el usuario con los conmutadores. Para simular las electroválvulas se emplearán diodos LED. Por otro lado, para no tener que esperar tantos minutos para comprobar el correcto funcionamiento del circuito, se puede sustituir cada minuto por 1 segundo, es decir, que cada sector se riegue 3 segundos en lugar de 3 minutos.