Tabla de contenidos

1 - Control del flujo del programa en Arduino
2 - Estructura y sentencias del control

2.1 Sentencia IF
2.2 Sentencia ELSE
2.3 Sentencia ELSE IF
2.4 Sentencia FOR
2.5 Sentencia WHILE
2.6 Sentencia DO WHILE
2.7 Sentencia SWITCH CASE

En este tutorial revisaremos como manejar el flujo de un código para arduino en forma lógica y veremos que estructuras de control podemos utilizar para lograrlo.

Control del flujo del programa en Arduino

Basta con decir que la realización de un buen programa radica en el buen control del flujo  del mismo. Un código que corre en Arduino es mono hilo y secuencial.

Mono hilo significa que las líneas de código se ejecutan una a la vez, mientras que secuencial significa que una línea de código se ejecuta tras otra. Este método mediante el cual se ejecuta el programa, se puede denominar “flujo de control del programa”.

Como se ha dicho anteriormente, el código del arduino se ejecuta secuencialmente una línea de código tras otra, sin embargo, pueden surgir situaciones en un programa donde se espera que la ejecución del programa salte pasos o regrese hacia atrás incluso sin llegar a la última línea del código. Incluso en situaciones como esta, la regla general es que el flujo del programa debe permanecer lógico y sin errores.

Para hacer frente a este tipo de situaciones, necesitamos estructurar nuestro código utilizando sentencias lógicas para controlar el flujo del programa y mantenerlo libre de errores.

Estructura y sentencias de control

La estructura de control nos permiten  organizar el código para que el programa tome acciones basadas en ciertas condiciones lógicas. Por ejemplo, si quieres que tu programa encienda un LED sólo cuando un sensor mida 50°C, tienes que estructurar tu código de tal manera que ejecute ese comando cuando la condición lógica se cumpla.

Las sentencias de control son funciones en un código que permiten controlar el flujo de ejecución del programa, ya sea para esperar, saltar, repetir, etc.

Las sentencias de control de Arduino incluyen:

  • Sentencia If 
  • Sentencia Else
  • Sentencia Else if
  • Sentencia For
  • Sentencia While
  • Sentencia do while
  • Switch Case
  • Continue

Sentencia IF

La sentencia IF es básicamente la forma más simple de las sentencias de control condicional. Un código de sentencia “if” evalúa una condición única, y ejecuta una serie de instrucciones o sólo una instrucción si la condición es verdadera.

Una sentencia de control “if” es el tipo de sentencia de control que se utiliza para programar luces de calle activadas por la oscuridad, la sentencia evalúa si el entorno está oscuro o no, si el entorno está oscuro, el código de la sentencia “if” instruye al microcontrolador a ejecutar una instrucción que encenderá la luz de la calle, y si el entorno no está oscuro, el código de la sentencia “if” instruye al microcontrolador a ejecutar una instrucción de código que no encenderá la luz de la calle y la mantendrá apagada hasta que el entorno se oscurezca.

A continuación se muestra el diagrama de flujo y la sintaxis de la sentencia IF en Arduino.

Diagrama de flujo de la sentencia if

int sensorPin = A1;
int ledPin = 2;

void setup(){
pinMode (sensorPin,INPUT);
pinMode (ledPin,OUTPUT);
}

void loop(){
if (analogRead(sensorPin) >= 122){
digitalWrite (ledPin,HIGH);
}

}

Sentencia ELSE

La mayoría de las veces, una sentencia IF es seguida inmediatamente por una sentencia ELSE, la sentencia ELSE indica la instrucción alternativa que debe ser ejecutada cuando la sentencia IF es falsa. Revisemos el siguiente código.

int sensorPin = A1;
int ledPin = 2;

void setup(){
pinMode (sensorPin,INPUT);
pinMode (ledPin,OUTPUT);
}

void loop(){
if (analogRead(sensorPin) >= 122){
	digitalWrite (ledPin,HIGH);
}
else{
	digitalWrite (ledPin,LOW);
}
}

El primer código utiliza una sentencia if para encender un led cuando se cumpla que la lectura del sensor sea mayor o igual que 122. Este nuevo código incorpora además el apagado de la luz en el caso de que la lectura sea menor que 122.

Sentencia ELSE IF

La sentencia “Else if” se utiliza cuando queremos comprobar tres condiciones diferentes. Incluye una sentencia IF, una sentencia ELSE IF y una sentencia ELSE en el mismo código. 

int sensorPin = A1;
int light_1 = 2;
int light_2 = 3;


void setup(){
pinMode (sensorPin,INPUT);
pinMode (light_1,OUTPUT);
pinMode (light_2,OUTPUT);
}

void loop(){
if (analogRead(sensorPin) >= 122){
digitalWrite (light_1,HIGH);
}
else if (analogRead(sensorPin) >= 500){
digitalWrite (light_2,HIGH);
}
else{
digitalWrite (light_1,LOW);
digitalWrite (light_2,LOW);
}
}

Esquema que muestra la declaración ELSE IF

Sentencia FOR

La sentencia For es también una sentencia condicional para la estructura de control de arduino utilizada para operaciones repetitivas. Como su nombre indica, se utiliza para llevar a cabo una operación repetitiva para una condición verdadera. Por ejemplo, cuando una compañía de telecomunicaciones te advierte que “si intentas recargar tu número de teléfono con un pin de recarga erróneo POR 5 veces serás excluido” la condición es que puedes intentar recargar ese número repetidamente con un pin de recarga erróneo hasta cuatro veces sin ser excluido, sin embargo, en el quinto intento, la condición se rompe y eres excluido.

La sentencia For da una condición y comprueba si la condición todavía se mantiene, si lo hace, una acción se ejecuta y una repetición puede tener lugar, esto seguirá sucediendo hasta que la condición ya no se mantiene y la acción que está ligada a la condición dejará de ser ejecutada. Esto puede ser usado para incrementar un evento. Por ejemplo, podemos usar una sentencia For para encender o apagar un LED gradualmente.

int PWMpin = 6; 
void setup(){
pinMode(PWMpin,OUTPUT); 
}
 void loop(){ 
int y = 1;
for (int i = 0; i>-1; i=i+y){
 analogWrite(PWMpin, i);
 if (i==225){
 y= -1; 
 } 
 delay(10);
 }
 }

Atenuación de un LED con ciclo for

Normalmente, el bucle for se utiliza para repetir un bloque de código encerrado entre llaves.
Se suele utilizar un contador de incremento para incrementar y terminar el bucle.

 Sintaxis del bucle For

for(inicialización; condición; incremento) 
{ Statement(s); 
}

Inicialización: Ocurre primero y una vez.

Condición: Cada vez que se pasa por el bucle, se comprueba la condición; si es verdadera, se bloquea la sentencia y se ejecuta el incremento, luego se vuelve a comprobar la condición.
Cuando la condición es falsa, el bucle termina.

Incremento: se ejecuta cada vez a través del bucle cuando la condición es
verdadera.

La imagen de la figura anterior es un simple boceto que puede desvanecer un LED conectado a los pines de modulación de ancho de pulso (PWM) de una placa arduino. Para más información sobre el PWM de arduino, consulta algun tutorial de Arduino para principiantes

Sentencia WHILE

Una sentencia while es como una sentencia “if”, excepto que continúa repitiendo un bloque de código (un bloque de código es lo que está dentro de las llaves) mientras la condición sea verdadera. Vea el ejemplo siguiente

int sensorPin = A1;
int light_1 = 2;
int light_2 = 3;

void setup(){
pinMode (sensorPin,INPUT);
pinMode (light_1,OUTPUT);
pinMode (light_2,OUTPUT);
}

void loop(){
 while (analogRead(sensorPin)>100){
	digitalWrite (light_1,HIGH);
	delay(500);
	digitalWrite (light_1,LOW);
	delay(500);
 }
 while (analogRead(sensorPin)<100){
 	digitalWrite (light_2,HIGH);
 	delay(500);
 	digitalWrite (light_2,LOW);
 	delay(500);
 }
}

Un enunciado While utilizado para hacer parpadear dos LEDs para dos condiciones diferentes

Sentencia DO WHILE

Una sentencia do while es como la sentencia else if pero funciona de la misma manera que el bucle while, excepto que la condición se comprueba al final del bucle, por lo que la sentencia do siempre se ejecutará al menos una vez. Vea el esquema de abajo:

int sensorPin = A1;
int light_1 = 2;

void setup (){
pinMode (sensorPin,INPUT);
pinMode (light_1,OUTPUT);
}

void loop(){
do{
 digitalWrite (light_1,HIGH);
 delay(500);
 digitalWrite (light_1,HIGH);
 delay(500);
 }while (analogRead (sensorPin)>100);
}

Sentencia do while
utilizada para hacer parpadear un LED en respuesta a la lectura de un sensor

Sentencia SWITCH CASE

Llega un momento en un diseño, cuando deseamos que una acción se realice con respecto a un resultado específico, en un amplio rango de resultados. Por ejemplo, digamos que usted está tratando de monitorear el nivel de agua en un tanque usando un sensor ultrasónico, usted desea encender un LED para diferentes niveles de agua en el tanque.

Digamos que estamos viendo 10 niveles. En nuestro código de arduino, tendríamos una variable que registra la distancia del agua desde el sensor ultrasónico, con esta distancia podemos elegir los niveles que queremos.

Para programar el arduino para que encienda los LEDs en los distintos niveles que hemos elegido, podemos utilizar la sentencia “if”. Con la sentencia “if”, le decimos al microcontrolador que encienda un LED si la distancia registrada por el sensor ultrasónico es tal y tal. El uso de una sentencia “if” hará un buen trabajo, pero para que el programa sea elegante, utilizamos la sentencia “switch case”.

El uso de la sentencia “if” requerirá que repitamos la sentencia para cada nivel que deseemos ejecutar. Vea la imagen de abajo:

if (distance == 50) 
{ 
 digitalWrite (LED1,HIGH); 
} 
if (distance == 100) 
{
 digitalWrite (LED2,HIGH); 
} 
if (distance == 150) 
{ 
digitalWrite (LED3,HIGH); 
} 
if (distance == 200) 
{ 
digitalWrite (LED4,HIGH); 
}

  Uso de la sentencia IF para determinar tantas condiciones Por otro lado, un sketch que utilice una sentencia switch case tendrá el siguiente aspecto: 
switch (distance){
 case 50:
 digitalWrite (LED1,HIGH);
 break;
case 100:
 digitalWrite (LED2,HIGH);
 break;
case 150:
 digitalWrite (LED3,HIGH);
 break;
case 200:
 digitalWrite (LED4,HIGH);
 break;
}
   Uso de la sentencia switch case para ejecutar códigos condicionales

El código de la línea 1 inicia la sentencia switch para empezar a comprobar las condiciones.

El código de la línea 2 comprueba la condición cuando la variable distancia es 50.

El código de la línea 3 realiza una acción si el caso 50 es verdadero, es decir, si la distancia es igual a 50

El código de la línea 4 rompe el bucle para el caso condición distancia igual a 50.

El código de la línea 5 comprueba el caso de distancia igual a 100.

El proceso se repite para comprobar todas las condiciones y se rompe después de llamar a la función break. Una sentencia switch case hace que un sketch tenga un aspecto elegante e inteligente.

Continue puede ser usado para saltar pasos en un proceso de iteración. Digamos que estás contando números del 1 al 20 y al mismo tiempo imprimiéndolos en la pantalla, puedes usar la sentencia continue para saltar la impresión de algunos números en la iteración. Vea el código siguiente

for (i = 0; i <= 20; i++)
{
 if (i >= 5 && i <= 8)
 {
  continue;
 }
 Serial.println (i);
 delay (1000);
}
Uso de la sentencia continue para saltar pasos en la iteración

El código de la línea 1 itera del 1 al 20

El código de la línea 3 crea cifras para saltar (5 a 8)

El código de la línea 5 llama a la función de salto

El código de la línea 7 imprime todos los números del 1 al 20 que no sean los que se deben saltar

Espero que este tutorial te sirva de ayuda. Con un buen conocimiento de las diferentes declaraciones de flujo de control del programa podemos escribir diferentes códigos
para ejecutar diferentes acciones con facilidad.

 Arduino program control flow, structure and statements. Ettron.

https://ettron.com/arduino-program-control-flow-structure-and-statements/