En esta lección aprenderás a codificar la sentencia iterativa que permite ejecutar un conjunto de instrucciones y si se requiere, que el ciclo se repita hasta que una condición se cumpla y deje de hacerlo, utilizando la sentencia do while.
En numerosas ocasionas, se requiere en un programa que las sentencias de un bucle de instrucciones se ejecuten al menos una vez. En este caso utilizamos la sentencia de iteración do while.
do while
La estructura do while se ejecuta al menos una vez y después repite las acciones del cuerpo de un bucle hasta que se cumple una determinada condición.
Vamos a revisar el diagrama de flujo de la sentencia do while con la siguiente figura:

Cómo puedes ver en la imagen de la figura1, se ejecutan las instrucciones y evalúa la condición, si es verdadera se repite el ciclo y vuelve a evaluar, y así continuamente hasta que la condición sea falsa y termina el ciclo. Veamos ahora su sintaxis:
Sintaxis
do {
// instrucciones
} while (condición);
Parámetros
instrucciones – La operación o conjunto de operaciones que se van a realizar.
condición – Cualquier expresión relacional o lógica.
Vamos a ver el uso de la sentencia do while con el siguiente ejemplo:
Un semáforo continuamente tiene el color verde para que los carros pasen. Cuando un peatón requiere cruzar la calle, presiona el botón del semáforo y espera a que el semáforo cambie del color verde al amarillo y después al rojo para cruzar la calle. (figura 3)

Se desea programar un circuito electrónico que mantiene encendido un LED color verde, cuando el botón sea presionado, parpadea el Led verde tres veces y se apaga, se enciende un LED amarillo tres segundos y se apaga para encender un LED rojo por cuatro segundos y vuelve a encender el LED verde hasta que sea presionado nuevamente el botón. El botón esta conectado en el pin 5, el LED verde al pin 4, el LED amarillo al pin 3 y un LED rojo al pin 2 ( Figura 3).

En este circuito, la tarjeta Arduino leerá el valor que indica el estado del botón, entonces debemos configurar el pin 5 de entrada. La instrucción de configuración del pin 5 digital sería:
pinMode(5,INPUT); // Configura el pin 5 de Entrada ( botón)
La tarjeta Arduino enviará a los leds el valor HIGH (1) para encenderlo y LOW (0) para apagarlos, por lo tanto se deben configurar los pines 2, 3 y 4 como salida. La instrucción de configuración de los pines sería:
pinMode(2,OUTPUT); // configura el pin 2 de salida (led rojo)
pinMode(3,OUTPUT); // configura el pin 3 de salida (led amarillo)
pinMode(4,OUTPUT); // configura el pin 4 de salida (led verde)
Para comenzar, la tarjeta Arduino envía el valor LOW a los LEDS amarillo y rojo (pin 4 y 3 ) como lo muestran las siguientes instrucciones:
digitalWrite(2,LOW); // Apaga el LED rojo
digitalWrite(3,LOW); // Apaga el LED amarillo
El bucle de intrucciones a repetir comienza enviando la tarjeta Arduino el valor HIGH al LED verde (pin 4) como sigue:
digitalWrite(4,HIGH); // Enciende el LED verde
Utilizamos la función digitalRead para leer el valor del pin 5 conectado al botón y se almacena en una variable llamada valBtn como sigue:
valBtn = digitalRead(5); // Lee valor de pin 5 y lo guarda en valBtn
El valor almacenado en la variable valBtn es utilizado para construir la condición que permita verificar si se a presionado el botón. Todas las instrucciones que forman el cuerpo del bucle están encerradas entre las palabras clave do y while, por eso las sentencias del bucle se ejecutan al menos una vez antes de evaluar la condición. el bucle completo sería:
do { // Inicia el ciclo de instrucciones a repetir
digitalWrite(4,HIGH); // Enciende el LED verde
valBtn = digitalRead(5); // Lee valor de pin 5 y lo guarda en valBtn
} while( valBtn != HIGH); // mientras vBtn es diferente a HIGH(1) continúa el ciclo
Cuando se ha presionado el botón (HIGH) no se cumple la condición y termina el ciclo de repeticiones. Entonces se ejecutas las siguientes instrucciones que hacen parpadear el LED verde con un ciclo for
for (parpadeo=0; parpadeo<=3; parpadeo++) // Repite con estructura for prender y apagar el LED verde
{ digitalWrite(4,HIGH);
delay (250);
digitalWrite(4,LOW);
delay (250);
} // fin for
Una vez terminado el ciclo de parpadeo del LED verde, ahora prendemos el LED amarillo por tres segundos:
digitalWrite(3,HIGH); // Enciende LED amarillo
delay (2000);
digitalWrite(3,LOW);
Y terminamos prendiendo el LED rojo por 4 segundos para que el peatón pueda cruzar la calle:
digitalWrite(2,HIGH); // Enciende LED rojo
delay(4000);
Manos a la obra

Ahora vamos a aplicar la sentencia do while haciendo la práctica que consiste en la construcción y programación de un circuito electrónico electrónico que mantiene un LED verde encendido hasta que se presione un botón, entonces apaga el LED color verde y enciende y apaga un LED amarillo y un LED rojo.
Materiales
Los materiales requeridos para hacer la práctica son los siguientes:










Los materiales ya los hemos utilizado en prácticas anteriores de este manual, si no te acuerdas o deseas repasar las características técnicas y funcionamiento de alguno de los componentes electrónicos, puedes dar clic sobre su imagen para consultar su información.
Construcción del circuito electrónico
Realiza las conexiones del circuito electrónico que se muestra en el diagrama esquemático de la Figura 4. Recuerda que el ánodo de cada led va conectado a la resistencia y el cátodo a la tierra.

Programación del circuito electrónico
Ahora te toca a ti capturar el código del programa en el IDE de Arduino. Procura realizarlo tú mismo para aprender la forma de codificar la sentencia do while.
/* Manual de programación con Arduino
* Práctica: Aplicación de sentencia do while
* Objetivo: Encender leds simulando un semáforo de crucero activado por un botón
* Fecha: noviembre 2020
* Autor: Milagros Pacheco Castañeda
*/
int valBtn=0; // Declaración e inicialización de la variable valBtn
int parpadeo=0; // Declaración e inicialización de la variable parpadeo
void setup()
{
pinMode(2,OUTPUT); // Configura el pin 2 de salida (led rojo)
pinMode(3,OUTPUT); // Configura el pin 3 de salida (led amarillo)
pinMode(4,OUTPUT); // Configura el pin 4 de salida (led verde)
pinMode(5,INPUT); // Configura el pin 5 de Entrada ( botón)
Serial.begin(9600); // Configuración de la velocidad de transmisión del monitor serial
}
void loop()
{
digitalWrite(2,LOW); // Apaga el led rojo
digitalWrite(3,LOW); // Apaga el led amarillo
do { // Inicia el ciclo de instrucciones a repetir
digitalWrite(4,HIGH); // enciende el led verde
valBtn = digitalRead(5); // lee valor de pin 5 y lo guarda en valBtn
Serial.print("Carro circulando ");
Serial.print("Edo botón: ");
Serial.println(valBtn);
} while( valBtn != HIGH); // mientras valor de vBtn es diferente a HIGH(1) continúa el ciclo
// Instrucciones fuera del ciclo de repetición
for (parpadeo=0; parpadeo<=3; parpadeo++) // Repite con for prender y apagar led verde
{ digitalWrite(4,HIGH);
delay (250);
digitalWrite(4,LOW);
delay (250);
} // fin for
digitalWrite(3,HIGH); // Enciende led amarillo
delay (2000);
digitalWrite(3,LOW);
digitalWrite(2,HIGH); // Enciende led rojo
Serial.println("Carros en alto, puede cruzar la calle");
delay(4000);
}
Observa que el bloque de instrucciones dentro de las llaves del do se ejecutan una vez, después se evalúa la condición del while para determinar si vuelve a repetir el bloque o continúa con el programa
Compila, depura y sube el sketch a la tarjeta Arduino UNO.
Funcionamiento del circuito electrónico
Prueba el funcionamiento de tu circuito electrónico. Verifica que el circuito funcione como la simulación que se muestra a continuación. Presiona el botón Código y da un clic en el símbolo monitor en serie para abrir la pantalla. Presiona el botón Iniciar simulación, observa como el led verde se mantiene encendido, da un clic sostenido sobre el botón para simular que lo presionas y observa cómo el led verde se apaga y se encienden los otros leds simulando un semáforo.
Si en tu navegador no se muestra la simulación, ingresa al enlace https://www.tinkercad.com/embed/5aerkWKBpPK?editbtn=1

Autoevaluación

Para aprender más
Ancona R. (2015) Bucle Do-While vs bucle While. España DIWO. Recuperado de http://diwo.bq.com/bucle-do-while-vs-bucle-while/.