En la lección anterior, se vio el bucle While y el pulsador, donde podíamos programar acciones mientras que no sucediera algún tipo de evento. Si tienes montado el circuito de la lección anterior, no te hará falta modificar nada, y si no lo tienes, estos son los esquemas de conexión:
Los módulos de pulsador y de led se conectan a los pines digitales 5 y 3, respectivamente. También puede realizarse con el led integrado en la placa, el cual está conectado al pin número 13.
El bucle Do While
El bucle Do While es parecido, ya que está a la espera del evento, pero tiene ciertas diferencias: mientras que el bucle While se ejecuta mientras se cumpla la condición, el bucle Do While se ejecuta al menos una vez y después comprueba si la condición se cumple. A continuación podéis ver las dos representaciones gráficas del bucle While, izquierda, y el bucle Do While, derecha:
![]() |
![]() |
La sintaxis del bucle Do While puede verse aquí:
1 2 3 |
do{ // tu código va aquí }while(condicion); |
En primer lugar nos encontramos con la parte comprendida entre corchetes, donde escribiremos el código que se ejecutará, y en segundo lugar la condición. Una vez que se haya realizado una vez el código incluido dentro del do { }, se comprobará si la condición se cumple o no. En caso de que la condición se cumpla, se volverá a repetir este proceso hasta que se deje de cumplir la condición, mientras que en el bucle While se comprueba la condición antes de ejecutar el código, siendo ésta es la única diferencia entre los bucles While y Do While.
Siguiendo con el ejemplo del código anterior,veamos como sería el código arduino del bucle Do While. Asumamos que existe una variable a que es un entero y que en alguna otra parte de nuestro programa se actualiza, el bucle Do While sería:
1 2 3 4 5 6 |
do{ digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); }while(a<10); |
Puedes ver la referencia completa del bucle do while aquí.
El pulsador
Para aprender sobre el pulsador y las entradas digitales entra en la entrada anterior del curso, El bucle while y el pulsador.
El código
Asumiendo que has conectado los elementos como se ha descrito al principio de la entrada, es decir, el módulo de pulsador en el pin 5 y el módulo led en el pin 3, podemos comenzar a programar. En primer lugar declaramos unas variables que almacenarán el número del pin al que hemos conectado el hardware. Esta práctica es realmente útil, ya que si modificamos el esquema de conexión, solo tendremos que cambiar una vez el número de pin utilizado. Para ello utilizamos el siguiente código:
1 |
int pinButton = 5, led = 3; |
Así, en vez de utilizar el número de pin podremos utilizar su nombre, con lo que será más fácil programar, sobre todo si utilizamos como nombre una palabra clave.
Una vez que hemos declarado las variables de los pines, tenemos que indicar como va a funcionar cada uno de los pines, para ello:
1 2 3 4 |
void setup(){ pinMode(pinButton, INPUT); pinMode(led, OUTPUT); } |
Este código es equivalente a:
1 2 3 4 5 |
void setup() { pinMode(5,INPUT); //push button pin pinMode(3,OUTPUT); // LED pin } |
Una vez hecho esto, vamos a hacer un programa que haga parpadear el LED con dos patrones distintos, uno si no pulsamos el botón y otro si el botón esta pulsado, por lo que el código quedaría así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
int pinButton = 5, led = 3; //Declaración de las variables void setup() { Serial.begin(9600); // Iniciamos la comunicación serie a 9600 bauds pinMode(pinButton, INPUT); // Establecemos el pin que tiene conectado el botón como entrada pinMode(led, OUTPUT); // Establecemos el pin que tiene conectado el LED como salida } void loop() { boolean firstTime = false; // Inicializamos la variable firstTime de tipo Boolean con el valor false do { // Inicio del bucle do while if (firstTime == false) { // Si la variable firstTime es falsa, entonces entrará aquí firstTime = true; } else { // Si la variable firstTime es verdadera, entonces entrará aquí. firstTime = false; } // Serial.println("Inside of do-while"); // Indica por medio de un mensaje que se esta ejecutando el bucle do while if (firstTime) { // if lee el valor almacenado en la variable firstTime. Si es true (verdadero) o 1 entonces entra aquí blinky(1, 1000); // Llamada a la función blinky con los parámetros times = 1 y delay_led = 1000 } else { // if lee el valor almacenado en la variable. Si es false (falso) o 0 entonces entra aquí blinky(20, 50); //Llamada a la función blinky con los parámetros times = 20 y delay_led = 50 } } while (digitalRead(pinButton)); // Lectura de la condición de repetición del bucle do while. Si el botón esta pulsado, volverá // a repetir el código dentro del do while. //Serial.println("Outside of do-while"); // Indica por medio de un mensaje que ya se ha ejecutado el bucle do while. } /* Declaración de la función de tipo void (no devuelve resultado) de nombre blinky. Tiene dos parámetros: times (variable de tipo entero) que determina el número de veces que se producirá el parpadeo. delay_led (variable de tipo entero) que determina el tiempo que habrá entre los dos estados del led: Determina la frecuencia del parpadeo. Nota: La función enciende el led y lo apaga, por lo que la variable times representa el número de ciclos de encendido y apagado (times = n encenderá y apagará el led n veces) */ void blinky(int times, int delay_led) { for (int i = 0; i < times; i++) { //Bucle for y declaración de la variable i. El bucle se ejecuta desde i hasta times - 1 Serial.print("iteration "); // Imprime junto a la siguiente línea información sobre el número de veces que se ejecuta for. Serial.println(i); // imprime el número de veces que se ejecuta el bucle for digitalWrite(led, HIGH); // Activa el pin al que esté conectado el LED delay(delay_led); // Espera el tiempo que se ha indicado al llamar a la función con el parámetro delay_led digitalWrite(led, LOW); // Desactiva el pin al que esté conectado el LED delay(delay_led); // Espera el tiempo que se ha indicado al llamar a la función con el parámetro delay_led } } |
Como podrás ver las líneas 21 y 32 tienen delante ” // “, esto indica a Arduino que estas lineas son comentarios, por lo que no se toman en cuenta durante el desarrollo del programa. Hay varias formas de realizar comentarios, la primera ” // ” solo comenta una linea, mientras que ” /* */ ” se utiliza para comentar bloques de código o texto. Puedes ver la referencia de los comentarios aquí.
En la línea de código 23 verás comenzar la estructura de control if-else:
1 2 3 4 5 |
if (firstTime){ blinky(1,1000); }else{ blinky(20,50); } |
En este código podemos ver como se utiliza firstTime como condición, sin ningún tipo de operación o comparación más. La estructura de control if espera una respuesta del tipo true o false o 1 ó 0, que precisamente es lo que estamos dando, ya que firstTime es una variable de tipo boolean. Si quieres recordar las variables puedes visitar esta entrada del curso o la referencia de Arduino. Además, utilizamos la misma función para crear un patrón en el LED completamente distinto, haciendo el código mucho más corto, fácil de entender y de modificar – por nosotros mismos y los demás.
Si quieres ver los mensajes que envía el programa para saber si está o no dentro del bucle Do While, elimina los comentarios de las lineas 21 y 31 de código.
Como ejercicio, crea una copia del proyecto, busca y modifica manualmente todos los campos donde aparezca la variable led por el número de pin donde tengas conectado el led, en el caso del vídeo en el número 13, y después en el proyecto original, conecta el led en otro pin, modifica el valor de la variable led al principio del código, ¿ves el poder de la asignación de pines a variables?