loop-arduino

Nesta lição vamos aprender duas coisas novas:

  • Como realizar uma sequência de ações repetidamente
  • Como iterar com um loop for (por) utilizando periféricos distintos

Vamos necessitar do seguinte:

  • Uma placa controladora da família Arduino
  • Quatro LEDs

Controlo de fluxo

A programação sequencial consiste em executar uma série de ordens ou comandos, uns atrás dos outros. Estes comandos podem ler informação (através dos sensores), executar ações (por exemplo, mover um servo), ou simplesmente realizar uma operação interna (como por exemplo, realizar uma soma). Na lição anterior, vimos um exemplo em que se alterava a ordem de execução de um programa com a frase if-else (se-senão). Estas instruções chamam-se instruções de controlo de fluxo. Vejamos um exemplo: imaginemos um programa onde, se a leitura da quantidade de luz for menor de 300, acende um LED, e se não for, apaga-o. Em função de uma variável realizamos a acção de acender o LED ou a acção apagar o LED. Pode ver-se mais claramente na imagem seguinte:

 

Realizar tarefas repetidamente com o loop for (por)

O loop for (por) é outro modo de modificar o fluxo em que se executa um programa fazendo com que uma série de instruções se repitam, um determinado número de vezes. Por exemplo, poderíamos querer que um LED piscasse 10 vezes. O fluxo desse programa seria algo assim:

Vamos criar este último programa, explicando-o passo a passo:

 

Vamos analisar por blocos:

 

Neste bloco usamos variáveis globais para indicar o número do PINO em que está conectado o LED. Vamos também criar uma variável booleana (admite os valores verdadeiro e falso). Utilizaremos esta variável para saber se é a primeira vez que se executa o programa. É um recurso habitual em programação, ao executar uma função loop() uma e outra vez. Se quisermos que um programa apenas se execute uma vez, é necessário fazer isto ou algo parecido.

 

Na primeira vez que for executada a função loop(), a variável primeiraVez terá o valor true (verdadeiro). Por isso entramos no if, e executamos o que vem a seguir. A primeira instrução é atribuir à variável primeiraVez o valor false (falso). Na próxima vez que for executada a função loop(), a condição não será cumprida e será executado digitalWrite(led_pin, LOW) deixando o LED apagado indefinidamente. Agora vamos a entrar e analisar o loop for (por):

 

Em primeiro lugar

 

O loop for tem três partes:

  • A variável sobre a qual se itera, e o valor inicial, que neste caso int i=0. Iteramos com uma variável chamada i que é um inteiro e cujo valor inicial será 0.
  • Condição de controlo, que significa que o loop for vai repetir-se enquanto esta condição continuar a ser verdadeira: i < 10 . Esta confirmação realizar-se-á no princípio de cada iteração, ou seja, se a condição for falsa a primeira vez, não se realiza nenhuma iteração.
  • Acção a executar no final da iteração, neste caso i=i+1. Significa que, depois de cada iteração, i incrementa-se uma unidade (poderia ser qualquer outra operação). É importante relembrar que este procedimento realiza-se ao finalizar a iteração, e por isso, na primeira iteração, i vale 0.

Deste modo, a sequência de execução seria:

  • i=0 … i < 10 ? … Sim … Pisco uma vez … Incremento i … Então i=1
  • i=1 … i < 10 ? …  Sim … Pisco uma vez … Incremento i … Então i=2
  • i=2 … i < 10 ? … Sim … Pisco uma vez … Incremento i … Então i=3
  • i=9 …  i < 10 ? … Sim … Pisco uma vez … Incremento i …Então i=10
  • i=10 …  i < 10 ? … Não … Saio do loop for.

Iterando com o loop for

Outro uso dos loops for é utilizar a variável de controlo, como por exemplo, no exemplo anterior, i realizar algum cálculo. Lembras-te das luzes do carro fantástico? Vamos fazer com que 5 LEDs se acendam em sequência, de modo a que em cada vez, fique aceso o primeiro, depois também o segundo depois o terceiro … até ao fim, onde se apaguem todos. Suponhamos que os LEDs estão conectados desde os pinos 2 até ao 6, a sequência seria:

  1. Todos apagados
  2. LED pino 2 aceso
  3. LEDs pino2 e pino3 acesos
  4. LEDs pino2 e pino3 e pino4 acesos
  5. LEDs pino2 e pino3 e pino4 e pino5 acesos
  6. LEDs pino2 e pino3 e pino4 e pino5 e pino6 acesos

… e isto repete-se continuamente. Como seria o código para este programa?

 

Na função setup(), colocamos todos os pinos onde os LEDs estão conectados, no modo OUTPUT. Em vez de o fazermos um a um, vamos fazê-lo com um loop for, poupando no código. Isto seria equivalente a fazer:

 

Na função loop(), primeiro apagamos todos os LEDs (do mesmo modo) e logo a seguir, pausamos 100 milissegundos. Posteriormente vamos acendendo, um a um com uma cadência de 200 milissegundos, conseguindo o efeito desejado. Uma vez que estejam todos acesos, voltamos a começar com o loop(), ou seja, voltamos a apagar e a acender um a seguir ao outro, indefinidamente.

Como seria um programa que em vez de apagá-los todos de uma só vez, os vá apagando sequencialmente, ou seja, acende-se um a um com uma cadência de 200 milissegundos e depois vai apagando-os pela ordem inversa?
Para obter mais informação sobre o programa for, consulta a referência do Arduino.

Exercício

Lembras-te do exercício proposto no final da entrada sobre as frases condicionais if-else (se-senão)? A seguir podes ver a solução. Não existe em contactar-nos se não entenderes algo.