Saltar a contenido

Bucles de Control

Los bucles de control permiten redirigir el flujo de un programa bajo ciertas condiciones.

Informacion

Para entender mejor esta seccion, vease Funciones Basicas en Arduino

Bucles propios del arduino

Arduino tiene en todos los proyectos dos funciones que funcionan a modo de bucles de control, uno llamado setup y otro llamado loop

Advertencia

ambos bucles deben estar presentes en el sketch de arduino y no pueden repetirse, si faltaran o se repitieran el IDE se rehusara a compilar el sketch

/*  cuando se crea un sketch nuevo, asi 
    es como se ve en el IDE
*/
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

setup

El bucle de control setup solo corre una vez cada que se energiza el arduino o se reinicia, generalmente se usa para configurar pines, inicializar buses de comunicacion y enlazar el Arduino con servomotores, entre otras cosas.

void setup() {
    Serial.begin(9600); // inicializar Serial
    servo1.attach(3);   // enlazar servomotor
    pinMode(3, OUTPUT); // declarar pines como salida o entrada
}

loop

una vez el program llega al bucle de control loop el Arduino repetira lo que sea que este en el de manera indefinida y no saldra de este bucle a no ser que se lo fuerce a salir de este en situaciones especiales, por lo general aqui es donde la gran parte de los programas se escribe.

/*  este bucle enciende el pin 13 por 1 segundo
    y luego lo vuelve a apagar por 1 segundo
*/
void loop() {  
  digitalWrite(13, HIGH);   
  delay(1000);                       
  digitalWrite(13, LOW);    
  delay(1000);               
}

if / if..else

if

Este bucle de control se usa para ejecutar codigo cuando alguna condicion que se especifique se cumpla.

Ejemplo 1

// se asigna 13 a un entero, al que llamaremos x
int x = 15;
// se verifica si 15 es mayor a 13, si es verdad se muestra una String por el monitor serial
if(x > 13) {
    Serial.println("x es mayor a 13");
}

Ejemplo 2

/*  este bucle enciende el pin 13 si mandamos una señal de 5V(HIGH) al pin 2
    dentro de
*/
if (digitalread(2) == HIGH) {
    digitalWrite(13, HIGH); // no se olviden del punto y la coma
}

if..else

se puede usar else cuando se quiere hacer algo en caso de que la condicion analizada en el if sea falsa

Ejemplo 1

// se tiene un boton en el pin 2, si llega una señal de HIGH se enciende un LED en el pin 7, si esta no se recibe, el LED se apaga
if(digitalRead(2) == HIGH)
{
    digitalWrite(7, HIGH); // encendemos un led en el pin 7
}
else
{
    digitalWrite(7, LOW); // apagamos led en el pin 7
}

cuando se necesita abarcar mas casos de condicionales, o cuando se quiere hacer otra cosa en caso de que una primera no se cumpla, se puede usar if de nuevo despues de un else, que permite añadir otra condicional al bucle.

Ejemplo 2

// se hace algo igual a lo anterior, solo que esta vez una lectura en otro pin apagara el led en lugar de que dejar de apretar el boton lo apague
if(digitalRead(2) == HIGH)
{
    digitalWrite(7, HIGH); // encendemos un led en el pin 7
}
else if (digitalRead(3) == HIGH)
{
    digitalWrite(7, LOW); // apagamos led en el pin 7
}

en algunas ocasiones se puede incluir un else al final que se ejecutara si es que ninguno de los if's anteriores resultaron verdaderos:

Ejemplo 3

/*  imaginemos dos botones, uno en el pin 2 y
    otro em el pin 3, y dos lEDs, uno en el pin
    7 y otro en el pin 8
*/
// si presionamos el boton en el pin 2
if(digitalRead(2) == HIGH)
{
    digitalWrite(7, HIGH); // encendemos un led en el pin 7
}
// si el boton 2 no esta presionado, procedemos a ver si el pin 3 esta presionado
else if (digitalRead(3) == HIGH)
{
    digitalWrite(8, HIGH); // encendemos otro en el pin 8
}
// finalmente si ninguno de los botones esta presionado
else
{
    // apagamos todos los LEDs
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
}

for

el ciclo for se utiliza para repetir partes de codigo un determinado numero de veces, para funcionar, necesita 3 partes en este orden:

  • Una variable de control, la cual se ocupa por lo general para controlar cuantas veces se repetira el ciclo, comunmente se suele usar un entero llamado i.
  • Una condicion de salida, el ciclo continuara ejecutandose hasta que la condicion de salida ya no se cumpla
  • Un parametro de incremento, cada que se termine de ejecutar el bucle este parametro incrementara o configurara la variable de control

Ejemplo 1

/*  se tienen 4 leds en fila desde el pin 4, 
    hasta el pin 7, este ciclo for
    los enciende en secuencia
*/
for (int i = 4, i < 8, i++) {
    /*  dentro del bucle se puede 
        usar la variable "i"
        para automatizar tareas,
        en este caso se usara para 
        designar el pin del led al que
        se mandara una salida
    */
    digitalWrite(i, HIGH);
    // 1 segundo de espera
    delay(1000);
    /*  al salir del bucle se
        ejecuta el parametro
        de incremento, en este
        caso, la variable "i"
        se incrementa en 1
    */
}

while

el ciclo while ejecutara una parte de codigo de manera indefinida hasta que determinada condicion de salida se cumpla

Ejemplo 1

/*  se tiene un boton en el pin 2
    y unled en el pin 5, mientras
    el boton este presionado el
    LED seguira encendido,
*/
while(digitalRead(2) == HIGH)
{
    digitalWrite(5,HIGH);
}
/*  al salir del bucle, el
    led se apagara
*/
digitalWrite(5, LOW);

switch

Bastante similar al if, switch controla que porciones de codigo se pueden ejecutar segun una condicion. La diferencia es que switch solo admite caracteres char y numeros enteros int

Ejemplo 1

/*  Se tiene un auto a control remoto
    y esta es la funcion de control,
    para controlar la direccion usa 
    un char que llega de la conexion 
    bluetooth.

    El auto tiene librerias 
    preconfiguradas para avanzar,
    retroceder, etc.
*/

char direccion = Serial.read();
switch (direccion) {
    case 'd':
        avanzar();
    break;
    case 'r':
        retroceder();
    break;
    case 'i':
        girar_izquierda();
    break;
    case 'd':
        girar_derecha();
    break;
    default:
        detener();
    break;
}