Con lo que hemos visto hasta ahora, si queríamos hacer parpadear un LED cinco veces, probablemente escribíamos esto:
// encender apagar el LED
digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200);
// encender apagar el LED
digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200);
// encender apagar el LED
digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200);
// ... y así hasta el cinco
Que funcionar, funciona, sí… Pero es un poco horrible.
- Primero, porque cansa escribirlo (y leerlo).
- Segundo, porque si de repente queréis cambiar la velocidad, tenéis que cambiarla en 20 sitios distintos.
- Y tercero, ¿y si queréis que parpadee 1000 veces? ¿Ponemos mil?
Evidentemente, va a ser que no. Precisamente una de las grandes virtud de los ordenadores (y de Arduino) es que se les da genial repetir tareas.
Para decirle a nuestra placa que repita algo muchas veces, usamos los Bucles. Hoy vamos a ver las dos herramientas fundamentales para repetir cosas: el for y el while.
El Bucle for
El bucle for sirve cuando sabemos exactamente cuántas veces queremos repetir algo.
Repite esto 10 veces Cuenta del 1 al 100 Recorre los pines del 2 al 6
Su estructura de for se compone de tres partes separadas por punto y coma:
for (inicio; condicion; actualizacion) {
// Código a repetir
}
- Inicio: Creamos una variable contador (normalmente llamada
i) y le damos un valor inicial. Ej:int i = 0;(Empezamos en 0). - Condición: Preguntamos si debemos seguir repitiendo. Ej:
i < 5;(¿Es i menor que 5?). - Actualización: Cambiamos el contador al final de cada vuelta. Ej:
i++(Suma 1 a i).
Ejemplo práctico: Contando parpadeos
En el ejemplo anterior, que queríamos parpadear un LED 5 veces, haríamos esto.
for (int i = 0; i < 5; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
El Arduino hará esto. Primero crea i = 0. Y luego empieza a repetir
- ¿0 es menor que 5? SÍ → Parpadea y suma 1 a
i→ies 1 - ¿1 es menor que 5? SÍ → Parpadea y suma 1
- ¿2 es menor que 5? SÍ → Parpadea y suma 1
- ¿3 es menor que 5? SÍ → Parpadea y suma 1
- ¿4 es menor que 5? SÍ → Parpadea y suma 1
- ¿5 es menor que 5? NO. Sale del bucle y continúa con el resto del programa.
El Bucle while
A veces no sabemos cuántas veces tenemos que repetir algo. Solo sabemos que queremos hacerlo mientras se cumpla una condición.
Sigue andando mientras no choques con la pared Espera mientras no pulse el botón
La estructura de whilees más simple:
while (condicion) {
// Código a repetir
}
En el for, la variable se actualiza sola (i++). En el while, vosotros sois responsables de que la condición cambie en algún momento dentro del bucle.
Si la condición siempre es verdadera, el Arduino se quedará ahí atrapado sin hacer nada hasta que lo reinicies (se “cuelga”).
Ejemplo práctico: Esperar a un botón
// Mientras el botón NO esté pulsado... no hagas nada
while (digitalRead(2) == HIGH) {
// Esperamos...
delay(100);
}
// Si llegamos aquí, es que alguien ha pulsado el botón
encenderCohete();
Normalmente siempre ponemos un pequeño delay porque si no tu Arduino se pone a como una moto a repetir el bucle a full velocidad. Es bueno, ya que haces una espera, darle un descansito.
Proyecto práctico: El coche fantástico
Para entender la potencia del for, vamos a hacer el efecto de luces más famoso de los años 80: el escáner frontal de KITT, el coche fantástico.
Tenemos 5 LEDs en fila. Queremos que la luz se mueva de izquierda a derecha y vuelva, creando una estela.
Sin bucles, tendríamos que escribir decenas de digitalWrite. Con bucles, lo haremos en unas pocas líneas.
El montaje
Conectad 5 LEDs (con sus resistencias, ¡siempre!) a los pines digitales consecutivos: 2, 3, 4, 5 y 6. Alineadlos en la protoboard para que queden bonitos.
El código
Vamos a usar la variable del bucle i no solo para contar, sino para elegir el número del pin.
- Cuando
ivalga 2, encenderemos el pin 2. - Cuando
ivalga 3, encenderemos el pin 3.
void setup() {
// Configurar pines del 2 al 6 como SALIDA
// En vez de escribir 5 líneas pinMode, usamos un bucle
for (int i = 2; i <= 6; i++) {
pinMode(i, OUTPUT);
}
}
void loop() {
// --- IDA: De izquierda a derecha (Pines 2 al 6) ---
for (int i = 2; i <= 6; i++) {
digitalWrite(i, HIGH); // Encendemos el LED actual
delay(100); // Esperamos un poquito
digitalWrite(i, LOW); // Apagamos (para dar efecto de movimiento)
}
// --- VUELTA: De derecha a izquierda (Pines 5 al 3) ---
// Nota: No empezamos en el 6 ni acabamos en el 2 para no repetir los extremos
for (int i = 5; i >= 3; i--) {
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
}
}
for (int i = 2; i <= 6; i++)
- Empieza en 2.
- Enciende el LED 2, espera, apaga.
- Siguiente vuelta:
ivale 3. Enciende LED 3… - Así hasta el 6.
for (int i = 5; i >= 3; i--)
- Aquí vamos hacia atrás. Empezamos en 5.
- La condición es “mientras sea mayor o igual a 3”.
- La actualización es
i--(restar 1). - El efecto es que la luz “rebota” y vuelve.
Si queréis que la estela sea más larga (que queden un poco encendidos los anteriores), podéis jugar con los tiempos o no apagar el LED inmediatamente, pero eso complicaría el código. Para empezar, este efecto “punto que se mueve” es perfecto.
