Até ao infinito…enquanto não me pressionares
Numa lição anterior, aprendemos a programar o loop for, que basicamente servia para repetir uma série de acções, um determinado número de vezes. contudo, nem sempre queremos que uma acção se repita um determinado número de vezes, mas apenas até acontecer algum evento. Por exemplo, se quiser um programa que acenda e apague um LED 10 vezes, o mais natural seria fazê-lo com o loop for. No entanto, o que acontece se quiser que se acenda e se apague até que pressionemos um botão? Apesar de existirem formas complicadas de fazê-lo com o loop for (consegues pensar em alguma!?) existem modos mais simples para fazê-lo. Uma forma intuitiva de dizê-lo seria: enquanto não pressionares o botão … apaga e acende o LED. Graficamente seria representado assim:
Vejamos como seria o código Arduino do loop while (enquanto). Vamos imaginar que existe uma variável, que é um número inteiro, e que em alguma outra parte do nosso programa, ela é actualizada. O loop while seria:
1 2 3 4 5 6 |
while(a<10){ digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); } |
Este código colocará o pino digital 2 a 5 volts durante 1 segundo, e a 0 volts durante outro segundo (se estiver um LED conectado, piscará) enquanto a seja menor que 10. Podes ver a referência completa do loop while aqui:
E o botão? Vamos aprender.
Em lições anteriores vimos como escrever num pino digital, colocando-o a 5 volts ou a 0 volts, e nesse exemplo usámos um LED. Agora vamos aprender a ler o valor de um pino digital, que será ou 5 volts ou 0 volts. Como exemplo, vamos utilizar um botão. Um botão é claramente um periférico digital, já que pode tomar dois valores: pressionado ou não pressionado. No primeiro caso, colocará uma tensão de 5 volts no pino digital e na segunda, uma tensão de 0 volts. Dependendo do desenho do botão, serão 5 volts quando estiver pressionado ou 0 volts quando não estiver pressionado. Vejamos como funciona então um botão:
Podes ver no diagrama que o botão tem três pinos: um conectado a 5V, outro à terra (GND ou massa) e o terceiro ao pino de sinal (In). Neste diagrama, se estudaste electrónica, confirmarás que quando o botão estiver pressionado, quando se fechar o circuito, estarão 5 volts no pino de sinal . Mas agora, repara neste outro diagrama:
Neste caso, no pino de sinal, estarão 0 volts quando o botão estiver pressionado. Então como o programamos em Arduino? Vamos imaginar a seguinte conexão de componentes:
Em primeiro lugar, declaramos o pino 5, no qual está conectado o botão como entrada, e o pino 3, onde está o LED, como saída
1 2 3 4 5 |
void setup() { pinMode(5,INPUT); //pino do botão pinMode(3,OUTPUT); //pino do LED } |
Uma vez feito isto, vamos fazer um programa que enquanto o botão estiver pressionado, o LED pisque, e em caso contrário, fique apagado. Como sabemos se o botão está pressionado? O nosso botão marca 5V quando se pressiona, por isso, a função que lê os pinos digitais: digitalRead() deve devolver 1. (para mais informação, consultar a referência da função. O código ficaria assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void setup() { pinMode(5,INPUT); //pino do botão pinMode(3,OUTPUT); //pino do LED } void loop() { while( digitalRead(5) == 1 ) //enquanto o botão estiver pressionado { //blink digitalWrite(3,HIGH); delay(1000); digitalWrite(3,LOW); delay(1000); } } |
Este programa poderia ser modificado, usando uma variável. Vejamos como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void setup() { pinMode(5,INPUT); //pino do botão pinMode(3,OUTPUT); //pino do LED } void loop() { int botao = digitalRead(5); while( botao == 1 ) //enquanto o botão estiver pressionado { //blink digitalWrite(3,HIGH); delay(1000); digitalWrite(3,LOW); delay(1000); botao = digitalRead(5); //actualiza o valor da variável } } |
O mais importante a respeito desta modificação, é ter em conta que o valor da variável botao deve ser actualizada em cada iteração, uma vez que de outro modo, o valor nunca seria alterado dentro do loop, independentemente do botão estivesse pressionado ou não, e portanto o programa nunca iria sair do loop.
Lançamos-te um desafio: tenta criar um programa que funcione como cronómetro. Usa o LCD e começa a contar (e a mostrar) cada segundo que passar até que se pressione o botão. Uma vez pressionado, o LCD deve mostrar o último valor e ficar fixo. Vamos ver do que és capaz.