Objetivos
- Conocer el bucle para, la instrucción for (para).
- Declaración de las primeras variables.
- Circuito con múltiples LEDs.
Conocimiento previo
- Instalación del IDE.
- Carga de programas en la placa Arduino.
- Ejercicio anterior (led intermitente).
Material requerido
|
|
|
|
|
|
|
|
|
Bucle for
Si quisiéramos montar un circuito que tuviera 8 LEDs, en el que la luz se desplazara de uno a otro led, una posibilidad sería repetir varias veces las mismas secuencias de instrucciones que ya conocemos.
Por ejemplo, si conectamos distintos LEDs a distintos pines digitales de Arduino, podríamos escribir en el setup():
void setup()
{
// inicialización de pines digitales como output
pinMode( 13, OUTPUT) ;
pinMode( 12, OUTPUT) ;
pinMode( 11, OUTPUT) ;
…………………………
pinMode( 6, OUTPUT) ;
}
Y a su vez nuestro loop() deberíamos repetir tantas veces como LEDs tengamos el juego de encender y apagar cada uno de los LEDs en secuencia desde el pin 13 hasta el 6.
Esta solución es la que podríamos describir como de fuerza bruta, pero no es muy elegante, es trabajosa y probablemente cometeríamos más de un error al escribirla.
C++ nos ofrece un medio cómodo de indicarle que debe repetir algo un número definido de veces. Este medio es la instrucción For que podemos usar en combinación con una variable.
Una variable es un contenedor que puede tomar varios valores, en nuestro caso aceptará todos los valores entre 6 y 13.
C++ nos exige declarar el tipo de las variables antes de usarlas. En nuestro caso usaremos el tipo entero que se escribe int para indicar que esta variables es numérica y entera, sin decimales.
Iremos viendo que existen otros tipos de variables.
Así por ejemplo, para inicializar en nuestro setup() los pines desde el 13 hasta al 6 como salidas podríamos usar la instrucción for de la siguiente manera:
void setup()
{
int i = 0 ; // Declaramos la variable i como un entero
for ( i = 6 ; i < 14 ; i++)
pinMode( i , OUTPUT) ;
}
Lo importante es que for necesita 3 instrucciones separadas por un carácter de punto y coma.
Estas instrucciones son y en éste orden:
- Una instrucción para inicializar la variable (en este caso: i = 6), esta instrucción se ejecutará una sola vez al principio del bucle .
- Un expresión que se evalúa justo antes de comenzar cada iteracción del bucle. Mientras se cumpla esta condición el bucle se repetira (en nuestro caso mientras la i sea menor que 14, o sea hasta el 13: i <14)
- Instrucción que cambia la variable en cada iteración. En nuestro caso i++ que es pedirle a C++ que incremente en uno la variable i, esta instrucción se ejecuta siempre al final de cada iteración.
Con el mismo criterio podríamos escribir la función loop() así:
void loop()
{
int i = 0 ; // Inicializamos la variable i como un entero
for ( i = 6 ; i < 14 ; i++)
{
digitalWrite( i , HIGH) ;
delay (100) ;
digitalWrite( i , LOW);
delay (100) ;
}
}
El código es muy similar al visto en el led intermitente, excepto en que escribíamos el valor 13 para el único pin que tenía un LED conectado. Aquí asignamos el pin con una variable i , que va tomando los valores de 6 hasta el 13 para el pin.
Nótese que la instrucción for no lleva un punto y coma al final. Esto es porque se aplica al bloque de instrucciones que le siguen entre llaves, como es el caso del loop(). La iteración realiza las cuatro instrucciones que siguen a la línea del for, porque están dentro de un bloque de instrucciones.
Las instrucciones que se aplican a bloques de código, no llevan punto y coma al final.
En el caso de particular de que el bloque lleve una única línea de código, las llaves pueden ser omitidas, como en el caso de la instrucción for en la función setup() de arriba.
El circuito.
El esquema del circuito es muy similar al del led intermitente, salvo por el hecho de que colocamos en la Protoboard 8 LEDs.
La única novedad es que dado que la función de la resistencia es limitar la intensidad de la corriente que circula por el circuito, y puesto que todos los diodos tienen masa común, basta una única resistencia entre este punto y tierra (GND). Pero si encendiéramos más de un led a la vez, tendríamos que poner una resistencia por cada led. Si no lo hacemos lo que pasará es que los led lucirán con menos intensidad.
Cuando nuestro programa ponga el pin correspondiente a valor a HIGH, se cerrar el circuito iluminándose el LED asociado.
El programa
void setup(){
int i = 0 ; // Declaramos la variable i como un entero
for ( i = 6 ; i < 14 ; i++)
pinMode( i , OUTPUT) ;
}
void loop()
{
int i = 0 ; // Declaramos la variable i como un entero
for ( i = 6 ; i < 14 ; i++){
digitalWrite( i , HIGH) ;
delay (100) ;
digitalWrite( i , LOW);
delay (100) ;
}
}
Este montaje nos permite jugar con las luces y se presta a varios programas diferentes para conseguir distintos efectos.
Así pues, podríamos hacer que la luz de los led volviera en sentido contrario, bastaría con usar dos ciclos for:
void loop()
{
for ( int i = 6 ; i < 14 ; i++) // Declaramos la variable i
{
digitalWrite( i , HIGH) ;
delay (100) ;
digitalWrite( i , LOW);
delay (100) ;
}
for ( int i = 12 ; i >6 ; i–) // Declaramos la variable i
{
digitalWrite( i , HIGH) ;
delay (100) ;
digitalWrite( i , LOW);
delay (100) ;
}
}
El primer ciclo for hace que las luces se encienda en secuencia desde la 6 hasta la 13. El segundo bucle entra a continuación empezando con la luz 12 (para no repetir la 13) y finalizando con la 7(para no repetir la 6), y vuelta a empezar.
En el segundo bucle hemos hecho una cuenta atrás diciéndole a la variable i que se decrementará en uno en cada iteración mediante la instrucción i– .
También nos hemos aprovechado de que C++ nos permite definir variables sobre la marcha dentro de la propia instrucción for, sin necesidad de dedicarle una línea completa a la declaración e inicialización.