Contactos

Operadores Arduino. Ciclos de Arduino. Múltiples condiciones relacionadas

Bucles usando declaraciones para Y mientras son una de las construcciones más importantes del lenguaje C++ subyacente a Arduino. Aparecen en absolutamente todos los bocetos, aunque no lo sepas. En este artículo, analizaremos más de cerca los bucles, descubriremos cuál es la diferencia entre for y while, cómo simplificar la escritura de un programa con su ayuda y qué errores se deben evitar.

Si todavía eres un programador novato y quieres entender qué es un ciclo y por qué es necesario, consulta la siguiente sección de este artículo con una descripción detallada.

El operador WHILE se utiliza en C++ y Arduino para repetir los mismos comandos un número arbitrario de veces. En comparación con FOR, el bucle WHILE parece más simple; generalmente se usa cuando no necesitamos contar el número de iteraciones en una variable, sino que simplemente necesitamos repetir el código hasta que algo cambie, ocurra algún evento.

Sintaxis MIENTRAS

mientras(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

Cualquier construcción de lenguaje que devuelva un valor booleano se puede utilizar como condición. Las condiciones pueden ser operaciones de comparación, funciones, constantes, variables. Al igual que con cualquier otra operación lógica en Arduino, cualquier valor distinto de cero se percibirá como verdadero (verdadero) y cero como falso (falso).

// Bucle infinito while(true)( Serial.println("Waiting…"); ) // Bucle que se ejecuta hasta que el valor de la función checkSignal() cambia while(!checkSignal())( Serial.println("Waiting… "); )

Tenga en cuenta que la instrucción while se puede utilizar sin llaves alrededor del bloque, en cuyo caso se repetirá el primer comando encontrado después del bucle. Se desaconseja su uso sin llaves, porque en este caso es muy fácil cometer un error. Ejemplo:

Mientras(verdadero) Serial.print("Esperando interrupción"); retraso(1000);

En este caso, la inscripción se mostrará en un bucle infinito sin pausas, porque el comando delay(1000) no se repetirá. Puede dedicar mucho tiempo a detectar este tipo de errores; es mucho más fácil utilizar una llave.

Un ejemplo de uso de un bucle while

La mayoría de las veces, while se utiliza para esperar algún evento. Por ejemplo, la preparación del objeto Serial para funcionar.

Serie.begin(9600); while (!Serial) ( ; // Algunas placas Arduino requieren que esperes hasta que el puerto serie esté libre)

Un ejemplo de espera a que llegue un personaje desde dispositivos externos vía UART:

Mientras(Serial.available())( int byteInput = Seria.read(); // Hacer algo más)

En este caso, leeremos valores hasta que Serial.available() devuelva un valor no nulo. Tan pronto como se acaben todos los datos del búfer, el ciclo se detendrá.

Bucle FOR en Arduino

En el bucle FOR, tenemos la oportunidad no solo de establecer las condiciones de contorno, sino también definir inmediatamente una variable para el contador e indicar cómo cambiará su valor en cada iteración.

PARA la sintaxis del bucle

Aquí la construcción será un poco más complicada:
para (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

El ejemplo más simple:

Para(int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

Inmediatamente creamos una variable, la inicializamos, indicamos que al final de cada ciclo, el valor del contador debe aumentarse en uno. Y eso es todo: ahora puedes usar la variable dentro del bucle.

El paso variable puede ser diferente. Aquí hay unos ejemplos:

  • para(int i=0; i<10; i=i+2) // Шаг 2
  • para(int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // Regresar - de 10 a 1

hacer mientras bucle

En algunos casos, necesitamos organizar el bucle de tal manera que las instrucciones del bloque se ejecuten al menos una vez y luego la verificación ya esté realizada. Para tales algoritmos, puede utilizar la construcción do while. Ejemplo:

Hacer ( Serial.println("Trabajando"); ) while (checkSomething());

Esta versión del bucle no presenta ninguna dificultad: simplemente movimos el bloque con las condiciones hacia abajo, por lo que todo lo que esté dentro de las llaves después de la instrucción do se ejecutará antes de la primera verificación.

continuar y romper declaraciones

Hay situaciones en las que es necesario interrumpir urgentemente la ejecución del bucle dentro del bloque de bucle, sin esperar a saltar al bloque de prueba de condición. Para hacer esto, puedes usar el operador. romper:

Mientras (verdadero) ( ​​if (checkSomething()) ( break; ) )

Si solo queremos detener el progreso de la iteración actual, pero no salir del ciclo, sino ir al bloque de verificación de condición, entonces debemos usar el operador continuar:

Mientras (verdadero) ( ​​if (checkSomething()) ( continuar; ) )

Las declaraciones de continuación y interrupción se pueden utilizar con todos los bucles FOR y WHILE.

Bucles anidados en Arduino

Cualquier variante de los ciclos se puede combinar fácilmente entre sí, creando construcciones anidadas. Las variables definidas en el bloque del bucle "superpuesto" estarán disponibles en el bloque interno. El ejemplo más común de este tipo de bucle es el recorrido de matrices bidimensionales. En el siguiente ejemplo utilizamos un bucle doble: el primero iterará sobre las filas (variable i), el segundo, anidado, las columnas (variable j) del array que definimos en la variable arr.

entrada interna; configuración vacía() (para (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

Más sobre ciclos

Si nunca ha trabajado con bucles, profundicemos un poco en el mundo de la teoría y descubramos qué son los bucles y por qué necesitamos estas misteriosas construcciones del lenguaje.

¿Por qué necesitamos un ciclo?

De hecho, la tarea principal del bucle es repetir varias veces las mismas construcciones del lenguaje. Esta necesidad surge en casi todos los programas, y ciertamente ni un solo boceto de Arduino puede funcionar sin un ciclo; la función loop () también se llama en un bucle infinito.

Veamos el siguiente ejemplo. Debe suministrar energía simultáneamente a 5 LED conectados a la placa Arduino desde los pines 5 al 9. La opción más obvia para esto sería colocar cinco instrucciones seguidas:

escritura digital (5, ALTA);

escritura digital (6, ALTA);

escritura digital (7, ALTA);

escritura digital (8, ALTA);

escritura digital (9, ALTA);

Por ahora, omitamos la cuestión del riesgo de tal acción, porque el encendido simultáneo de tal cantidad de LED crea una mayor carga en el circuito de alimentación de la placa. Lo principal para nosotros ahora es que hemos creado cinco líneas de código, cada una de las cuales se diferencia de las demás en solo un dígito. Este enfoque tiene las siguientes desventajas:

  • Ante cualquier cambio, tendrás que realizar cambios en muchas líneas al mismo tiempo. Por ejemplo, si necesitamos cambiar los LED a los pines 2 a 6 o no encenderlos, pero apagar el voltaje, entonces tendremos que realizar 5 cambios en el código. ¿Y si hay más instrucciones y cambios?
  • El código voluminoso con una gran cantidad de instrucciones del mismo tipo es incómodo y desagradable de leer. Cinco líneas idénticas no dan mucho miedo. Pero el hábito del código sucio eventualmente conducirá a decenas y cientos de páginas adicionales en la lista, lo que lo desanimará a usted y a sus colegas.
  • En el proceso de “copiar y pegar” instrucciones casi idénticas, es fácil cometer un error, por ejemplo, olvidarse de cambiar el número de pines: digitalWrite(5, HIGH); escritura digital (5, ALTA);
  • Puede fallar fácilmente en una entrevista en cualquier empresa de software normal mostrándole al entrevistador dicho código.

De todo esto podemos concluir que casi siempre se debe evitar el uso repetido de las mismas cuerdas y sustituirlas por bucles. Además, en muchas situaciones, en principio no se puede prescindir de los ciclos; nada puede reemplazarlos. No puede cambiar el número de repeticiones de código mientras el programa se está ejecutando. Por ejemplo, necesitas procesar cada elemento. matriz de datos recibidos de dispositivos externos. Nunca podrá predecir cuántos datos habrá, cuántas veces repetir el procesamiento y, por lo tanto, no podrá insertar la cantidad requerida de instrucciones al momento de escribir el artículo.

Aquí es donde las bicicletas vienen al rescate.

Reglas de sintaxis

Ciclo en Arduino- Este es un bloque de programa especial que se llamará un cierto número de veces durante la ejecución del programa. Dentro de este bloque, describimos los comandos en sí que se llamarán y las reglas mediante las cuales el controlador determinará cuántas veces deben llamarse.

En nuestro ejemplo anterior, podríamos decirle lo siguiente al controlador:

repetir comando digitalEscribe 5 veces

En un mundo ideal con robots programadores, esto probablemente sería suficiente, pero como estamos hablando con una computadora en C++, necesitamos traducir esta frase a este lenguaje:

repetir comando - necesitas usar instrucciones especiales que le digan al controlador que algo interesante está a punto de comenzar con bucles while o for

escritura digital - déjelo como está, pero escríbalo una vez y enciérrelo entre llaves. Cómo lidiar con los números PIN, justo debajo.

5 veces - Utilice un contador para esto, que aumentará con cada repetición. Al principio (o al final) del bloque, puede comparar el valor de este contador con el valor límite (5 en este caso) mediante una operación de comparación.

Veamos un ejemplo de un comando de bucle "traducido" con una declaración while:

contador int = 0; // Variable para almacenar el valor del contador // Le pedimos al procesador que repita la construcción entre llaves hasta que la condición entre paréntesis devuelva verdadera. // En nuestro caso, el contador es nuestro contador, 5 es el valor límite, la condición es que el valor del contador sea menor que 5. // Pero podemos especificar operadores lógicos completamente diferentes while (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

Para aquellos que notaron un error en el código anterior, ponemos cinco y escribimos el bloque de bucle de otra manera:

mientras (contra< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

Se puede lograr el mismo resultado usando un bucle FOR:

Para(int contador =0; contador<5; counter ++){ digitalWrite(counter+5, HIGH); }

Como puede ver, en este caso, agrupamos inmediatamente todas las operaciones necesarias con el contador en una sola instrucción FOR; esto es mucho más conveniente si necesita contar el número requerido.

Puede obtener información detallada sobre las reglas para el uso de bicicletas en las secciones correspondientes de este artículo.

Conclusión

En este artículo, analizamos construcciones muy importantes del lenguaje Arduino: bucles FOR y WHILE. Estos operadores se pueden encontrar en casi cualquier esquema más o menos complejo, porque sin bucles muchas operaciones con datos serían imposibles. No hay nada complicado en la sintaxis de los ciclos: puede acostumbrarse fácilmente a ellos y utilizarlos activamente en sus proyectos.

Cada lenguaje de programación tiene un conjunto de instrucciones de control que proporcionan ejecución múltiple del mismo código (bucle), selección del fragmento de código apropiado (condiciones) e instrucciones para salir del fragmento de código actual.

El IDE de Arduino tomó prestados la mayoría de los controles necesarios de C/C++. Su sintaxis es idéntica a la de C. A continuación describimos brevemente su sintaxis.

si declaración

La declaración if le permite ejecutar un determinado fragmento de programa dependiendo del resultado de verificar una determinada condición. Si se cumple la condición, entonces se ejecutará el código del programa; si no se cumple la condición, entonces se omitirá el código del programa. La sintaxis del comando if es la siguiente:

Si(condición) ( declaración1; declaración2; )

Una condición puede ser cualquier comparación de una variable o valor devuelto por una función. El criterio principal para la condición if es que la respuesta siempre debe ser verdadera (verdadero) o falso (falso). Ejemplos de condiciones para una declaración if:

Si(a!=2) ( ) si(x<10) { } if(znak==’B’) { }

Dentro de los corchetes que están escritos dentro de la condición, puede ejecutar el código.

Las personas que empiezan a aprender programación suelen cometer el error de equiparar el valor de una variable determinada con un solo signo "=". Tal registro indica inequívocamente la asignación de un valor a una variable y, por lo tanto, la condición siempre será "verdadera", es decir, se cumplirá. La comprobación de que una variable es igual a un determinado valor siempre se indica con un doble signo igual (==).

Puedes utilizar el estado de una función como condición, por ejemplo:

Si(init()) ( Serial.print("ok"); )

El ejemplo anterior se ejecutaría de la siguiente manera: el primer paso es llamar a la función init(). Esta función devuelve un valor que será interpretado como "verdadero" o "falso". Dependiendo del resultado de la comparación, se enviará el texto "ok" o no se enviará nada.

si...si no declaración

La declaración if extendida es la declaración if….else. Garantiza que se ejecute un fragmento de código cuando la condición es verdadera (verdadero) y que el segundo fragmento de código se ejecute si la condición no es verdadera (falso). La sintaxis de la declaración if….else es la siguiente:

Si (condición) ( // comando A ) else ( // comando B )

Los comandos "A" solo se ejecutarán si se cumple la condición, el comando "B" se ejecutará cuando no se cumpla la condición. No es posible ejecutar simultáneamente los comandos "A" y "B". El siguiente ejemplo muestra cómo utilizar la sintaxis if...else:

If (init()) ( Serial.print("ok"); ) else ( Serial.print("error"); )

De esta forma se puede comprobar la correcta ejecución de la función e informar al usuario sobre ello.

La práctica habitual es negar la condición. Esto se debe a que una función que se ejecuta correctamente devuelve 0, mientras que una función que falla por algún motivo devuelve un valor distinto de cero.

La explicación de esta “complicación de la vida” es sencilla. Si la función se ejecuta correctamente, entonces esta es la única información que necesitamos. En caso de error, a veces conviene comprender qué salió mal y por qué la función no se ejecutó correctamente. Y aquí vienen al rescate los números que difieren de cero, es decir, con la ayuda de códigos digitales podemos determinar el tipo de error. Por ejemplo, 1 - un problema al leer algún valor, 2 - no hay espacio en la memoria o en el disco, etc.

El último ejemplo modificado muestra cómo llamar a una función que devuelve cero cuando se ejecuta correctamente:

If (!init()) ( Serial.print("ok"); ) else ( Serial.print("error"); )

declaración de cambio de caso

La declaración if le permite verificar solo una condición. A veces es necesario realizar una de las acciones dependiendo del valor devuelto o leído. La declaración de opción múltiple de cambio es ideal para esto. La sintaxis del comando de cambio se muestra a continuación:

Switch (var) ( caso 1: // instrucción para var=1 break; caso 2: // instrucción para var=2 break; default: // instrucción por defecto (si var es diferente de 1 y 2) )

Dependiendo del valor de la variable var, las instrucciones se ejecutan en determinados bloques. La etiqueta de caso significa el comienzo del bloque para el valor especificado. Por ejemplo, caso 1: significa que el bloque dado se ejecutará para el valor de la variable var igual a uno.

Cada bloque debe terminar con el comando break. Interrumpe la ejecución adicional de la declaración de cambio. Si se omite el comando break, las instrucciones se ejecutarán en bloques posteriores hasta el comando break. La etiqueta predeterminada es opcional, al igual que el resto de la declaración if. Las instrucciones en el bloque predeterminado solo se ejecutan cuando el valor de var no coincide con ningún patrón.

A menudo sucede que se deben ejecutar las mismas instrucciones para uno de varios valores. Esto se puede lograr así:

Switch (x) ( caso 1: // declaración para x=1 ruptura; caso 2: caso 3: caso 5: // declaración para x=2 o 3 o 4 ruptura; caso 4: // declaración para x=4 ruptura ; caso 6: // instrucción para x=6 break; default: // instrucción predeterminada (si x es diferente de 1,2,3,4,5,6) )

Dependiendo del valor de la variable x se ejecutará el bloque de instrucciones correspondiente. La repetición del caso 2: caso 3: caso 5: informa al compilador que si la variable x tiene el valor 2 o 3 o 5, entonces se ejecutará el mismo fragmento de código.

para declaración

La declaración for se utiliza para ejecutar repetidamente el mismo código. Muchas veces es necesario ejecutar las mismas instrucciones, cambiando sólo el valor de alguna variable. El bucle for es perfecto para esto. La sintaxis del comando es la siguiente:

ent yo; para(i=0;yo<10;i++) { // инструкции для выполнения в цикле }

El primer parámetro dado en la declaración for es el valor inicial de la variable. Otro elemento es comprobar la condición para continuar la ejecución del bucle. El bucle se ejecuta siempre que se cumpla la condición. El último elemento es el cambio en el valor de la variable. La mayoría de las veces, aumentamos o disminuimos su valor (según sea necesario). En este ejemplo, las instrucciones contenidas en el bucle se ejecutarán en i=0…9.

A menudo, una variable utilizada en un bucle se declara en el mismo lugar:

Para(int i=0;i<10;i++) { // инструкции для выполнения в цикле }

Una variable que se usa para contar los pasos de bucle posteriores se puede usar dentro de ella para llamar a una función con los parámetros apropiados.

For(int i=10;i>0;i—) ( Serial.print(i); // se enviarán los números 10,9,8,7,6,5,4,3,2,1)

mientras declaración

El bucle for es perfecto para donde queremos contar. En una situación en la que es necesario realizar determinadas acciones como resultado de algún evento que no es necesariamente predecible (por ejemplo, estamos esperando que se presione un botón), entonces podemos utilizar la instrucción while, que ejecuta el bloque de instrucciones. siempre y cuando se cumpla la condición. La sintaxis de la declaración while es la siguiente:

Mientras(condición) ( // bloque de sentencias a ejecutar )

Es importante que la verificación de condición se realice al comienzo del ciclo. Puede suceder que las declaraciones dentro del bucle while nunca se ejecuten. También es posible crear un bucle infinito. Veamos dos ejemplos:

intx=2; while(x>5) ( Serial.print(x); ) —————————————- int y=5; mientras(y>0) ( Serial.print(y); )

El primer bloque de declaraciones dentro del while nunca se ejecutará. La variable x tiene un valor de dos y no será mayor que 5. En el segundo ejemplo, estamos ante un bucle infinito. La variable "y" tiene un valor de 5, es decir mayor que cero. Dentro del bucle, no hay ningún cambio en la variable 'y', por lo que el bucle nunca terminará.

Este es un error común cuando nos olvidamos de cambiar el parámetro que hace que finalice el ciclo. Los siguientes son dos ejemplos válidos del uso de un bucle while:

intx=0; mientras(x<10) { //блок инструкций x++; } —————————————- while(true) { if(условие) break; // блок инструкций }

En el primer ejemplo, nos encargamos de cambiar el valor de la variable que está marcada en la condición. Como resultado, el ciclo eventualmente terminará. En el segundo ejemplo, se creó deliberadamente un bucle infinito. Este bucle es equivalente a la función loop() en el IDE de Arduino. Además, se introduce una verificación de condición dentro del bucle, después de lo cual el bucle finaliza con el comando break.

hacer... mientras declaración

Una variación del bucle while es el bucle do... while. Además de la sintaxis, se diferencia en el lugar donde se verifica la condición. En el caso de do... while, la condición se verifica después de ejecutar el bloque de declaración. Esto significa que el bloque de instrucciones en el cuerpo del bucle se ejecutará al menos una vez. La siguiente es la sintaxis del comando do... while:

Do (//bloque de declaración) while(condición)

Todo lo escrito sobre la declaración while se aplica a do... while también. El siguiente es un ejemplo del uso de un bucle do... while:

intx=10; do ( // bloque de instrucciones x—; ) while(x>0); —————————————- do ( // bloque de instrucciones if(condición) break; ) while(true);

declaración de ruptura

La instrucción break le permite salir del bucle (do... while, for, while) y salir de la opción de cambio. En el siguiente ejemplo, considere la ejecución del comando break:

Para(yo=0;yo<10;i++) { if(i==5) break; Serial.print(i); }

El bucle debe ejecutarse para los números del 0 al 9, pero para el número 5, se cumple la condición, lo que activa la declaración de interrupción. Esto saldrá del bucle. Como resultado, sólo se enviarán los números 0,1,2,3,4 al puerto serie (Serial.print).

continuar declaración

El operador continuar hace que las instrucciones del bucle (do... while, for, while) dejen de ejecutarse para el valor actual y pasen al siguiente paso del bucle. El siguiente ejemplo muestra cómo funciona la declaración continuar:

Para(yo=0;yo<10;i++) { if(i==5) continue; Serial.print(i); }

Como puede ver, el bucle se ejecutará para un valor de 0 a 9. Para un valor de 5, se ejecutará el comando continuar, como resultado de lo cual las instrucciones posteriores a este comando no se ejecutarán. Como resultado, los números 0,1,2,3,4,6,7,8,9 se enviarán al puerto serie (Serial.print).

declaración de devolución

La declaración de retorno finaliza la ejecución de la función llamada y devuelve un valor de un tipo particular. Como parámetro de comando, puede especificar un número, carácter o una variable de un tipo específico. Es importante que el valor de retorno coincida con el tipo de función declarada. El siguiente ejemplo muestra cómo utilizar la declaración de devolución:

int checkSensor()( if (analogRead(0) > 400) ( // leyendo la entrada analógica return 1; // Para valores mayores a 400, se devuelve 1 else( return 0; // para otros, se devuelve 0) )

Como puede ver, puede usar varias declaraciones de devolución en una sola función, pero solo una de ellas funcionará siempre. Está permitido utilizar la declaración de devolución sin parámetros. Esto le permite finalizar prematuramente una función que no devuelve ningún valor.

void nombre_función() ( declaración1; if(x==0) retorno; declaración2; declaración3; )

En el ejemplo anterior, la instrucción1 se ejecutará cada vez que se llame a la función. La ejecución de la instrucción 2 y la instrucción 3 depende del resultado del comando if. Si se cumple la condición (verdadero), se ejecutará el comando de retorno y la función saldrá.

En el caso de que no se cumpla la condición, el comando de retorno tampoco se ejecuta, pero se ejecutan las instrucciones instrucción2 e instrucción3, y luego la función finaliza su trabajo.

ir a declaración

Por razones ideológicas, esta descripción debe omitirse... La declaración goto es un comando que no debe usarse en la programación normal. Provoca complejidad en el código y es un mal hábito de programación. Le recomendamos encarecidamente que no utilice este comando en sus programas. Debido a que goto se encuentra en la documentación oficial del sitio web arduino.cc, daremos una breve descripción del mismo. La sintaxis del comando goto es:

…. ir a etiqueta; // salta a la línea etiquetada 'metka' ….. …. …. metka://etiqueta donde el programa seguirá funcionando...

El comando permite saltar a la etiqueta designada, es decir, a la ubicación en el programa.

Hoy estudiaremos una parte igualmente importante del lenguaje de programación como son los bucles. ¿Para qué se necesitan? Pongámonos una meta. Es necesario encender seis LED alternativamente con un período de 50 ms y luego apagarlos alternativamente con el mismo intervalo. Bueno, ¿qué podría ser más fácil? Escribimos el siguiente código:
configuración vacía() ( pinMode(2, SALIDA); pinMode(3, SALIDA); pinMode(4, SALIDA); pinMode(5, SALIDA); pinMode(6, SALIDA); pinMode(7, SALIDA); ) bucle vacío () ( escritura digital(2, ALTO); retraso(50); escritura digital(3, ALTO); retraso(50); escritura digital(4, ALTO); retraso(50); escritura digital(5, ALTO); retraso(50) ; digitalWrite(6, ALTO); retraso(50); digitalWrite(7, ALTO); retraso(50); digitalWrite(2, BAJO); retraso(50); digitalWrite(3, BAJO); retraso(50); digitalWrite (4, BAJO); retraso(50); escritura digital(5, BAJO); retraso(50); escritura digital(6, BAJO); retraso(50); escritura digital(7, BAJO); retraso(50); ) Primero aproximadamente inicializaron seis pines digitales del segundo al séptimo como salidas, y en el programa principal escribieron alternativamente encender el LED, retrasar, etc., seis veces. Después de lo mismo pero cada vez que se apagaba el LED. Ahora completamos el Arduino y disfrutamos del trabajo. Pero aún así, algo anda mal aquí. Si observa detenidamente el código del programa, notará que hay partes del código que se repiten a lo largo del programa. Por ejemplo, la repetición de una pausa debería llamar tu atención inmediatamente. Y cuando se inicializan los pines, solo cambia su número. Cuando lo enciendes y apagas, solo cambia también el número. Para un programa tan pequeño, por supuesto, puede dejarlo así, el controlador lo devorará y no se ahogará, pero si necesita ejecutar un código repetido, por ejemplo, 1000 veces. Creo que habrá suficiente paciencia para rellenarlo, pero ¿tendrá MK suficiente memoria? Por supuesto, puedes preguntar, ¿por qué diablos necesitamos 1000 operaciones idénticas? Bueno, sí, es difícil de imaginar). Pero eso no es un problema, pero si tenemos una matriz de 1000 celdas. Esto sucede a menudo, por ejemplo, varios sensores escriben parámetros en una matriz y cómo se dice para entender este lío. Sería necesario desmontarlo de alguna manera según algunos parámetros. Para estos incidentes se inventaron las bicicletas. Un bucle es un fragmento de código que se ejecuta un determinado número de veces. Una parte ejecutada del programa en un bucle se llama iteración. El número de iteraciones puede ser de 0 a infinito. Para ejecutar ciclos en el lenguaje de programación, ya existen tres variantes del ciclo. Créame, esto es suficiente para la vista para cualquier codificación sofisticada. Echemos un vistazo a todo esto con más detalle.
  • mientras (condición) ()
  • hacer () mientras (condición);
  • para(contar variable; condición; aumentar contar variable) ()
Primer ciclo mientras (condición) (). ¿Cómo trabaja? después de la palabra mientras debería haber una condición entre paréntesis. La condición puede ser cualquier cosa, siempre que sea cierta. Tan pronto como la condición se vuelva falsa, el ciclo se detendrá y el programa continuará trabajando desde la siguiente línea después del ciclo. Tomemos un ejemplo.
carbón i = 0; mientras yo En realidad lo que hemos escrito aquí. Primero inicializamos la variable de conteo. i y restablecerlo. A continuación, entramos en el bucle y comenzamos a comprobar la condición entre paréntesis. si el valor i menos de 10, luego ejecute el cuerpo del bucle. En el cuerpo del bucle, simplemente aumentamos el valor de la variable de conteo en uno y verificamos la condición nuevamente. En nuestro caso, el bucle se ejecutará 10 veces. Es decir, primero el valor. i es igual a cero. Cero es menor que diez. A continuación, aumentamos la variable en uno y comparamos, uno es menor que diez, y así sucesivamente. Tan pronto como la variable de conteo sea igual a diez, ¿comprobamos si diez es menor que diez? Por supuesto que no, y después de comprobarlo, el bucle dejará de funcionar. Así es como funciona el ciclo. ¿Y si necesita ejecutar el código en el cuerpo del bucle en cualquier momento, incluso si no se ajusta a la condición? Hay otro ciclo para esto llamado hacer () mientras (condición). Funciona exactamente igual que el ciclo anterior, a excepción de un pero. En este bucle, el cuerpo del bucle se ejecuta primero y luego se realiza la prueba. Veamos cómo se ve en el código.
carbón i = 0; hacer (i++;) mientras((i > 0) & (i Mira que interesante. Primero, como antes, inicializamos la variable de conteo con cero, pero en la condición escribimos que i era mayor que cero y menor que diez. Es decir, el valor de la variable debe estar en el rango de uno a nueve. Si hubiéramos escrito de esta manera usando el bucle anterior, nunca se habría ejecutado. Pero tenemos la palabra mágica. hacer. Eso es lo que sucederá. Primero, en el cuerpo del ciclo, el valor de la variable de conteo aumentará y se convertirá en uno, y si es mayor que cero, la condición se volverá verdadera. en consecuencia, el bucle continuará ejecutándose hasta que la variable de conteo sea igual a diez. Y por último, la tercera versión del ciclo. ¿Cómo trabaja?
charí; para(yo = 0; yo Cómo funciona. Primero, iniciamos nuevamente la variable de conteo, pero sin un valor específico. A continuación escribimos la palabra para, pero entre paréntesis primero escribimos nuestra variable de conteo y le asignamos el valor inicial. Luego verificamos la condición y, si es verdadera, ejecutamos el cuerpo del bucle y aumentamos el valor de la variable de conteo. En esencia, esto es lo mismo que mientras()() entonces, qué bucle usar depende de usted. Algunas palabras sobre algunos puntos. Por ejemplo, si escribes mientras(1);, entonces el bucle se ejecutará para siempre. o si con para, entonces se verá así para(;;);. Ten cuidado. A veces, al ejecutar un bucle, realmente desea dejar todo y salir, pero la condición no lo permite. ¿Cómo ser? Hay otro comando para esto. romper;. Tan pronto como el MK encuentra este comando en el cuerpo del bucle, inmediatamente sale del bucle y continúa la ejecución del programa desde la siguiente línea después del bucle. Pero, ¿qué pasa si durante la ejecución del ciclo surge una condición que no satisface la condición, o, por ejemplo, un momento en el que no necesitamos continuar ejecutando el final del cuerpo del ciclo? Aquí el equipo nos ayudará. continuar;. Tan pronto como el MK tropieza con este comando, lo deja todo y procede a la ejecución de la siguiente iteración del bucle. Espero haber explicado todo claramente. Ahora, habiendo recibido este conocimiento, reescribamos nuestro programa, pero usando bucles.
configuración vacía() ( byte i = 2; // contar variables while(i // Si i es menor que 8, ejecuta el cuerpo del bucle ( pinMode(i, OUTPUT); // Inicializa pines comenzando en 2 yo ++; // Incrementar la variable de recuento en uno) ) bucle vacío() ( byte i = 2; mientras(i Miremos más de cerca. Primero inicializamos la variable de conteo. i y le asignó un valor de dos. ¿Por qué dos? Y porque elegí específicamente los pines del segundo al séptimo, para asegurarme de que el valor inicial no importe. Resultó una especie de juego de palabras) Bueno, por supuesto que sí. A continuación, escribimos la condición del ciclo. Necesitamos hacer seis iteraciones ya que tenemos seis LED. Genial, contar dos más seis es ocho. Sí, entonces necesitamos verificar la variable de conteo hasta que sea menos de ocho. Entonces escribieron while (i . Ahora nuestro bucle funcionará seis veces. Lo que debemos hacer dentro del cuerpo del bucle. Sí, nada complicado, simplemente ingrese la función para inicializar la salida en la salida, simplemente sustituya la variable de conteo en lugar de la salida número. ¿Cuál es el enfoque? Tan pronto como el MK ingresa al ciclo del cuerpo, antes de realizar la función de inicialización de salida, veamos los argumentos pasados. Uno de ellos debe llevar el número de salida, y tenemos una variable de conteo allí. ¿Qué? ¿Qué hacer? Número. Y tenemos un dos allí. Bueno, genial, inicialicemos la segunda salida. Después de eso, aumentamos el valor de la variable de conteo en uno más y verificamos la condición. Sí, tres es menor que ocho, vamos Hagamos todo de nuevo y para siempre, solo que ahora hay tres en la variable, así que inicializaremos la salida para la tercera y luego aumentaremos la variable de conteo en 1. De esta manera, siguiendo el ciclo, configuraremos todas los resultados que necesitamos. Además, aumentar la variable de conteo en uno no es una condición difícil. Nadie se molesta en escribir, por ejemplo, así: yo = ((127*i)/31) & 0xF4; Y esto también funcionará si la condición es verdadera después de la ejecución. Para el bucle, no importa lo que suceda en el cuerpo, le interesa si la condición es verdadera o no. Eso es todo. En la próxima lección, analizaremos las funciones, por qué son necesarias e intentaremos escribir las nuestras.

/ /

Para declaración

Diseño para Se utiliza para repetir un bloque de declaraciones encerradas entre llaves. El contador de incrementos se utiliza normalmente para incrementar y finalizar un bucle. Operador para adecuado para cualquier actividad repetitiva y a menudo se utiliza junto con conjuntos de colecciones de datos/salidas.

encabezado del ciclo para consta de tres partes:

para (inicialización; condición; incremento) (declaraciones que se ejecutan en un bucle)

La inicialización se realiza primero y sólo una vez. Cada vez que se realiza el ciclo, se verifica la condición, si es verdadera, se ejecuta el bloque de declaraciones y el incremento, luego se verifica nuevamente la condición. Cuando el valor booleano de la condición se vuelve falso, el ciclo termina.

Ejemplo

// Atenuar el LED usando el pin PWM int PWMpin = 10; // LED en serie con una resistencia de 470 ohmios de 10 pines void setup() ( // no se necesita configuración ) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Ciclo para en C es mucho más flexible que los bucles para en otros lenguajes de programación, como BASIC. Se pueden omitir cualquiera o los tres elementos del encabezado, aunque se requieren puntos y comas. Además, las declaraciones para inicialización, condiciones e incrementos de bucle pueden ser cualquier declaración C válida con variables independientes y utilizar cualquier tipo de datos C, incluidos datos de punto flotante (flotantes). Estos inusuales para el ciclo. para Los tipos de operadores le permiten proporcionar una solución programática a algunos problemas no estándar.

Por ejemplo, usar la multiplicación en una instrucción de contador de bucle le permite crear una progresión logarítmica:

Para(int x = 2; x< 100; x = x * 1.5){ println(x); }

Generado: 2,3,4,6,9,13,19,28,42,63,94

Otro ejemplo es disminuir o aumentar suavemente el nivel de la señal al LED con un ciclo. para:

Bucle vacío()( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; // control de conmutación con retardo máximo(10); ) )

Diseño para Se utiliza para repetir un bloque de declaraciones encerradas entre llaves. El contador de incrementos se utiliza normalmente para incrementar y finalizar un bucle. Operador para adecuado para cualquier actividad repetitiva y a menudo se utiliza junto con conjuntos de colecciones de datos/salidas.

encabezado del ciclo para consta de tres partes:

para (inicialización ; condición ; incremento) (declaraciones que se ejecutan en un bucle)

La inicialización se realiza primero y sólo una vez. Cada vez que se realiza el ciclo, se verifica la condición, si es verdadera, se ejecuta el bloque de declaraciones y el incremento, luego se verifica nuevamente la condición. Cuando el valor booleano de la condición se vuelve falso, el ciclo termina.

Ejemplo
// Atenuar el LED usando el pin PWM int PWMpin = 10; // LED en serie con una resistencia de 470 ohmios de 10 pines void setup() ( // no se necesita configuración ) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

Ciclo para en C es mucho más flexible que los bucles para en otros lenguajes de programación, como BASIC. Se pueden omitir cualquiera o los tres elementos del encabezado, aunque se requieren puntos y comas. Además, las declaraciones para inicialización, condiciones e incrementos de bucle pueden ser cualquier declaración C válida con variables independientes y utilizar cualquier tipo de datos C, incluidos datos de punto flotante (flotantes). Estos inusuales para el ciclo. para Los tipos de operadores le permiten proporcionar una solución programática a algunos problemas no estándar.

Por ejemplo, usar la multiplicación en una instrucción de contador de bucle le permite crear una progresión logarítmica:

Para(int x = 2; x< 100; x = x * 1.5){ println(x); }

Generado: 2,3,4,6,9,13,19,28,42,63,94

Otro ejemplo es disminuir o aumentar suavemente el nivel de la señal al LED con un ciclo. para:

Bucle vacío() ( int x = 1; for (int i = 0; i > -1; i = i + x)( analogWrite(PWMpin, i); if (i == 255) x = -1; // control de conmutación con retardo máximo(10); ) )



¿Te gustó el artículo? Compártelo