En este momento estás viendo Programación en Arduino: como funciona un for y un while

Programación en Arduino: como funciona un for y un while

Los bloques repetitivos permiten ejecutar ciertas instrucciones de forma cíclica siempre que la condición que evalúen sea cierta (true) estos bloques o funciones son los while y los for.

¿Cómo funciona la función while?

La función while (mientras) es un bloque que implementa un bucle; es decir, repite la ejecución de las instrucciones que están dentro de sus llaves de apertura y cierre mientras la condición especificada entre sus paréntesis sea cierta (true). Su sintaxis es muy sencilla:

while (condición) {
//Instrucciones que se repetirán mientras la condición sea cierta – true –
}

Si se llega por primera vez a una sentencia while y la condición resulta ser falsa, no se ejecutarán las sentencias interiores ninguna vez. Este detalle es importante tenerlo en cuenta.

Ejemplo 1

byte x=1; //Declaro una variable tipo byte
void setup(){
Serial.begin(9600);   //Inicio la comunicación serie a 9600 baudios
while (x <= 50){      //Mientras x sea menor o igual a 50 ejecuto las instrucciones
    Serial.print(x);  //Imprime en el monitor serie el valor de la variable x
    Serial.println(" es menor de 50");  //Imprime un mensaje del valor de x 
    x=x+1;  //Incrementa en uno el valor de x
    }
  Serial.println("x es mayor que 50");  //Imprime un mensaje del valor de x 
}
void loop(){}

¿Y la función do while?

El bucle do funciona exactamente igual que el bucle while, con la excepción de que la condición es evaluada después de ejecutar las instrucciones escritas dentro de las llaves. Esto hace que las instrucciones siempre sean ejecutadas como mínimo una vez, aun cuando la condición sea falsa. La sintaxis es de la siguiente forma:

do {
//Instrucciones que se repetirán mientras la condición sea cierta – true – 
} while (condición)

Repeticiones determinadas con la función for

La diferencia entre un bucle while y un bucle for está en que en el primero el número de iteraciones realizadas depende del estado de la condición definida, pero en un bucle for el número de iteraciones se puede fijar a un valor exacto. Por tanto, usaremos el bucle for para ejecutar un conjunto de instrucciones (escritas dentro de llaves) un número concreto de veces. La sintaxis general del bucle for es la siguiente:

for (valor_inicial_contador;condicion_final;incremento) {
//Instrucciones que se repetirán un número determinado de veces
}

Tal como se observa, entre paréntesis se deben escribir tres partes diferentes, separadas por puntos y coma. Estas tres partes son opcionales (pueden omitirse cualquiera de ellas) y son las siguientes:

  • Valor inicial del contador: en esta parte se asigna el valor inicial de una variable entera que se utilizará como contador en las iteraciones del bucle.  Por ejemplo, si allí escribimos x=0, se fijará la variable x a cero al inicio del bucle.
  • Condición final del bucle: en esta parte se especifica una condición. Justo antes de cada iteración se comprueba que sea cierta para pasar a ejecutar el grupo de sentencias internas. Si la condición se evalúa como falsa, se finaliza el bucle, y continúa el programa tras su llave de cierre.
  • Incremento del contador: en la última de las tres partes es donde se indica el cambio de valor que sufrirá al inicio de cada iteración del bucle la variable usada como contador. Este cambio se expresa con una asignación. Por ejemplo, la sentencia x=x+1 le sumará 1 a la variable x antes de cada nueva iteración del bucle, por lo que en realidad estaríamos haciendo un contador que aumenta de uno en uno a cada repetición. Este cambio se efectúa justo antes de comprobar la condición de final del bucle.

Ejemplo 2

byte x;  //Declaro una variable tipo byte
void setup(){
  Serial.begin(9600);  //Inicio la comunicación serie a 9600 baudios
  for (x=0;x<10;x=x+1){   //Imprime los números del 0 al 9 en el monitor serie
  Serial.println(x);   //Imprime en el monitor serie el valor de la variable x
  }
}
void loop(){}

Las instrucciones break y continue

La instrucción break debe estar escrita dentro de las llaves que delimitan las sentencias internas de un bucle, y sirve para finalizar este inmediatamente. Es decir, esta instrucción forzará al programa a seguir su ejecución a continuación de la llave de cierre del bucle.

La instrucción continue también debe estar escrita dentro de las llaves que delimitan las sentencias internas de un bucle y sirve para finalizar la iteración actual y comenzar inmediatamente con la siguiente. Es decir, esta instrucción forzará al programa a “volver arriba” y comenzar la evaluación de la siguiente iteración aun cuando todavía queden instrucciones pendientes de ejecutar en la iteración actual.

Ejemplo 3

byte x;                //Declaro una variable tipo byte
void setup(){
  Serial.begin(9600);  //Inicio la comunicación serie a 9600 baudios
  for(x=0;x<16;x++){   //Imprime los números del 0 al 15 en el monitor serie
    if (x==10) break;  //interrumpe la ejecución del for cuando x es igual a 10
  Serial.println(x);   //Imprime en el monitor serie el valor de la variable x
 }
}
void loop(){}

Ejercicios

Ejercicio 1: Números del 50 al 1

Imprimir en el monitor serial los números del 50 al 1.

Ejercicio 2: Números pares

Imprimir en el monitor serial los números pares del 0 al 50. Ordenados en 5 filas.

Ejercicio 3: Break o continue

Partiendo del ejercicio anterior usando las funciones “break” o “continue” evitar que se imprima el 20 y el 40.

Ejercicio 4: Variar los colores de un LED RGB

Probar todas las combinaciones de colores que podemos hacer con un LED RGB (rojo, verde y azul) usando PWM con valores que vayan desde 150 hasta 255. Debemos tener en cuenta un tiempo de espera de 10ms entre cada cambio de color.

Para ello es necesario montar el siguiente circuito:

Esta entrada tiene 3 comentarios

  1. felipe ruiz juarez

    como salir del bucle for e intentado void setup no inicia y void loop cuando se cumple la sentencia se repite infinitamente no continua con el resto del codigo alguna sugerencia

    //liquid Cristal profe garcia.
    //temp LCD Monitor Serial
    //Rig triunbirato
    //robojax vcc gnd pin Digital

    #include «max6675.h»
    #include
    #include

    LiquidCrystal_I2C lcd(0x27, 20 , 4); // variantes .
    // 0x27 0x3F , 0x20 , 0x38 , 16 , 2 20 , 4

    const byte thermoDO = 6;
    const byte thermoCS = 5;
    const byte thermoCLK = 4;

    MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

    int boton = 10;
    const byte vccPin = 3;
    const byte gndPin = 2;
    const byte gndPinf = 8;
    const byte vccPinr = 9;
    const byte relePinA = 12;
    const byte relePinB = 13;
    float temprelePinA;
    float temprelePinB;
    unsigned long instanteAnterior;
    bool enfriando = false;

    void setup() {

    lcd.init();
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(«D. Marmo Servicios»); // Mensaje a desplegar
    lcd.setCursor(0, 2);
    lcd.print(» Secadora Do 6 «); // Mensaje 2 a desplegar
    delay(3000); // espera 3 segundos con el mensaje estatico

    Serial.begin(9600);

    pinMode(vccPin, OUTPUT);
    digitalWrite(vccPin, HIGH);

    pinMode(gndPin, OUTPUT);
    digitalWrite(gndPin, LOW);

    pinMode(vccPinr, OUTPUT);
    digitalWrite(vccPinr, HIGH);

    pinMode(gndPinf, OUTPUT);
    digitalWrite(gndPinf, LOW);

    pinMode(relePinA, OUTPUT);
    pinMode(relePinB, OUTPUT);
    pinMode(boton, INPUT);
    Serial.println(«temperatura «);
    delay(3000);

    }

    void loop() {

    int i = 0;
    for (int i = 0; i 36.00)
    digitalWrite(i = 12, HIGH); // debe apaga quemador 3 veces
    delay(50);
    if (thermocouple.readCelsius() 2500UL) {
    instanteAnterior = millis();
    temprelePinA = thermocouple.readCelsius();

    Serial.println( thermocouple.readCelsius());
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print(» Temperatura «);
    delay(500);

    lcd.setCursor(4, 2);
    lcd.print(«C = » + String(temprelePinA));
    lcd.print((char)223);
    Serial.println();

    if (temprelePinA > ((digitalRead(boton) == HIGH) ? 40.00 : 42.0)) {
    digitalWrite(relePinA, HIGH); apaga el quemador hasta que se reinicia el arduino

    enfriando = true;
    }
    if (enfriando) {
    if ( temprelePinA < 29.00) {
    digitalWrite(relePinB, HIGH); apaga ventilador y giro de tambor fin del ciclo
    }
    }
    }
    }

  2. felipe ruiz juarez

    al pegar el codigo no incluye wire ni LiquidCrystal_I2C.h
    un saludo desde queretaro mx

  3. panfilo

    saludos desde chihuahua awebo uwu

Deja una respuesta