Hasta el infinito … mientras no me pulses
En una lección anterior aprendimos a programar el bucle for, básicamente servía para repetir un número de veces una serie de acciones. Sin embargo no siempre queremos que una acción se repita un número determinado de veces sino más bien hasta que suceda algún evento.
Por ejemplo, si quiero un programa que encienda y apague un LED 10 veces, lo más natural sería hacerlo como ya hemos visto con el bucle for, sin embargo, ¿qué pasa si quiero que se encienda y se apague hasta que pulse un botón?, aunque habría modos rebuscados de hacerlo con el bucle for (a ver si se te ocurre alguno) hay modos más sencillo de hacerlo, un modo intuitivo de decirlo sería: mientras no pulses el botón, apague y enciende el LED. Gráficamente se representaría así.
Veamos como sería el código arduino del bucle while. Asumimos que existe una variable a que es un entero y que en alguna otra parte de nuestro programa se actualiza, el bucle while sería
1 2 3 4 5 6 |
while(a<10){ digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); } |
Este código pondrá el pin digital 2 a 5 voltios durante 1 segundo, y a 0 voltios durante otro segundo (si hay un LED conectado parpadeará) mientras a sea menor que 10. Puedes ver la referencia completa del bucle while aquí
Vamos con el pulsador
En lecciones anteriores vimos como escribir en un pin digital, poniéndolo a 5 voltios o a 0 voltios, y como ejemplo usamos un LED. Ahora vamos a aprender a leer el valor que hay en pin digital, que será, del mismo modo de 5 voltios, o de 0 voltios. Como ejemplo vamos a usar un pulsador. Un pulsador es claramente un periférico digital, ya que puede tomar dos valores: pulsado, no pulsado. Pues bien, en un caso pondrá una tensión de 5 voltios en el pin digital y en el otro de 0. Dependiendo del diseño del pulsador serán 5 voltios cuando esté pulsado o cuando esté no pulsado. Veamos cómo funciona un pulsador
Puedes ver en el diagrama que el pulsador tiene tres pines. Uno conectado a 5V, otro a tierra (GND) y el tercero al pin de señal (In). En este diagrama, si has estudiado electrónica, comprobarás que cuando el pulsador está presionado, el cerrarse el circuito, en el pin de señal habrá 5 Voltios. Sin embargo, mira este otro diagrama
En este caso, en el pin de señal habrá 0 voltios cuando el pulsador esté pulsado. Ahora bien, ¿cómo lo programamos en Arduino?
Asumamos la siguiente conexión de componentes
Lo primero, declaramos el pin 5, al que está conectado el pulsador como entrada, y el pin 3, donde está el LED, como salida
1 2 3 4 5 |
void setup() { pinMode(5,INPUT); //push button pin pinMode(3,OUTPUT); // LED pin } |
Una vez hecho esto vamos a hacer un programa que mientras el pulsador esté pulsado el LED parpadee, y de lo contrario esté apagado. ¿Cómo sabemos si el pulsador está pulsado? Nuestro pulsador marca 5V cuando se pulsa, por lo tanto la función que lee los pines digitales: digitalRead() debe devolver 1. (para más información consultar la referencia de la función. El código quedaría por lo tanto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void setup() { pinMode(5,INPUT); //push button pin pinMode(3,OUTPUT); // LED pin } void loop() { while( digitalRead(5) == 1 ) //while the button is pressed { //blink digitalWrite(3,HIGH); delay(1000); digitalWrite(3,LOW); delay(1000); } } |
Este programa se podría modificar usando una variable, veamos cómo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { pinMode(5,INPUT); //push button pin pinMode(3,OUTPUT); // LED pin } void loop() { int pulsador = digitalRead(5); while( pulsador == 1 ) //while the button is pressed { //blink digitalWrite(3,HIGH); delay(1000); digitalWrite(3,LOW); delay(1000); pulsador = digitalRead(5); //refresh value of variable } } |
Lo más importante respecto a esta modificación es tener en cuenta que el valor de la variable pulsador se debe actualizar en cada iteración, ya que de otro modo el valor nunca cambiaría dentro del bucle independientemente de que esté el botón pulsado o no, y por lo tanto el programa nunca saldría del bucle.
![]() |
OBSERVA: ¿Te has preguntado alguna vez como funcionan los finales de carrera? Resulta que los finales de carrera a pesar de tener una estructura diferente, funcionan de la misma manera y se programan de una forma muy parecida. En particular los finales de carrera incluidos en el BQ Zum Extension Kit dan un ‘0’ cuando están pulsados y un ‘1’ cuando están sin pulsar. ¡Te sugerimos que pruebes a intentar programarlo, y descubrir su funcionamiento por ti mismo! |
Te lanzo un reto. Intenta hacer un programa que funcione como cronómetro. Usa el LCD y empieza a contar (y mostrar) cada segundo que pasa hasta que se pulse el pulsador, una vez pulsado el LCD debe mostrar el último valor y quedarse fijo. A ver si eres capaz.