Estruturas de controle são blocos de instruções que alteram o fluxo de execução do código de um programa. Com elas é possível fazer coisas como executar comandos diferentes de acordo com uma condição ou repetir uma série de comandos várias vezes, por exemplo.
A seguir nós veremos algumas das estruturas de controle mais comuns usadas nas linguagens de programação em geral. Vamos também modificar o nosso programa de teste para exemplificar melhor como essas estruturas funcionam.
While
O while é uma estrutura que executa um conjunto de comandos repetidas vezes enquanto uma determinada condição for verdadeira. While em inglês quer dizer "enquanto", e pronuncia-se "uái-ou". Ele segue o seguinte formato:
Em seguida nós inserimos o comando
Entre os caracteres
Rode o programa modificado com as instruções acima no seu Arduino e tente variar o número de "piscadas" e o número
while(condição) {
...
}
Vamos então fazer uma modificação no nosso programa para exemplificar melhor como o while
funciona. O nosso objetivo agora é fazer o LED piscar três vezes,
depois esperar cinco segundos, piscar mais três vezes e assim por
diante. Nós vamos mudar o conteúdo da função loop()
para o seguinte:// Variável para contar o número de vezes que o LED piscou int i = 0; // Pisca o LED três vezes while(i < 3) { digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o delay(1000); // Espera 1000 milissegundos (um segundo) digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o delay(1000); // Espera 1000 milissegundos (um segundo) i = i + 1; // Aumenta o número de vezes que o LED piscou } delay(5000); // Espera 5 segundos para piscar o LED de novoPrimeiro nós declaramos uma variável
i
. Essa
variável vai contar quantas vezes o LED já piscou desde o início do
programa ou desde a última pausa de cinco segundos. Nós vamos
inicializar essa variável com zero porque no início da função loop()
o LED ainda não piscou nenhuma vez sob essas condições.Em seguida nós inserimos o comando
while
, que deve ser seguido de uma condição definida entre parênteses. Enquanto essa condição for verdadeira, todo o bloco de comandos entre os caracteres {
e }
é executado repetidamente. No caso do nosso programa, enquanto o número de "piscadas" do LED (representado pela variável i
) for menor do que três, nós continuamos a executar os comandos que fazem o LED piscar. Isso é representado pela expressão i < 3
dentro dos parênteses.Entre os caracteres
{
e }
nós colocamos o código que faz o LED piscar, como anteriormente, mas não podemos nos esquecer de somar 1
à variável que conta o número de "piscadas". Isso é feito na seguinte linha de código: i = i + 1; // Aumenta o número de vezes que o LED piscou
Veja que após executar todos os comandos entre {
e }
, sempre teremos na variável i
o número de vezes que o LED piscou desde o início da função loop()
. Vamos percorrer a sequência de passos executada cada vez que a função loop()
é chamada:- Atribuímos
0
à variáveli
: o LED ainda não piscou nenhuma vez. - Comparamos se
i < 3
: como0
é menor do que3
, executamos os comandos entre{
e}
:- Executamos os comandos para acender e apagar o LED.
- Somamos
1
à variáveli
, tornando-a1
: sabemos que o LED piscou uma vez.
- Voltamos ao início do
while
e comparamos sei < 3
: como1
é menor do que3
, executamos os comandos entre{
e}
novamente:- Executamos os comandos para acender e apagar o LED.
- Somamos
1
à variáveli
, tornando-a2
: sabemos que o LED piscou duas vezes.
- Voltamos ao início do
while
e comparamos sei < 3
: como2
é menor do que3
, executamos os comandos entre{
e}
novamente:- Executamos os comandos para acender e apagar o LED.
- Somamos
1
à variáveli
, tornando-a3
: sabemos que o LED piscou três vezes.
- Voltamos ao início do
while
e comparamos sei < 3
: como3
não é menor do que3
, não executamos mais os comandos entre{
e}
e prosseguimos à próxima instrução. - Esperamos cinco segundos por meio da chamada
delay(5000)
.
loop()
,
e como já sabemos, ela é chamada novamente pelo sistema do Arduino.
Isso reinicia o ciclo, executando os passos acima indefinidamente.Rode o programa modificado com as instruções acima no seu Arduino e tente variar o número de "piscadas" e o número
For
Agora que nós já aprendemos o comando while, fica muito fácil aprender o comando for, pois ele é quase a mesma coisa. Vamos modificar o conteúdo da função
loop()
como fizemos acima, porém usando o for
no lugar do while
:// Variável para contar o número de vezes que o LED piscou int i; // Pisca o LED três vezes for(i = 0; i < 3; i++) { digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o delay(1000); // Espera 1000 milissegundos (um segundo) digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o delay(1000); // Espera 1000 milissegundos (um segundo) } delay(5000); // Espera 5 segundos para piscar o LED de novoA primeira modificação que fizemos foi declarar a variável
i
sem inicializá-la com o valor 0
. Nós podemos fazer isso porque o comando for
fará isso para a gente. Ele segue o seguinte formato:for(inicialização; condição; finalização) {
...
}
Vamos descrever cada item separadamente:- Condição: é uma expressão verificada repetidamente, de forma idêntica à condição entre parênteses do
while
. Enquanto ela for verdadeira, os comandos entre{
e}
continuam sendo executados. - Inicialização: é um comando executado apenas uma vez no início do comando
for
. - Finalização: é um comando executado repetidas vezes ao final de cada execução dos comandos entre
{
e}
.
for
nada mais é do que um while
acrescido de um comando de inicialização e um comando de finalização.
Para o nosso programa de teste, esses comandos são, respectivamente:i = 0
: inicializa a contagem do número de "piscadas".i++
: soma1
à variáveli
ao final da execução dos comandos entre{
e}
; nesse caso ele é equivalente ao comandoi = i + 1
. O operador++
é chamado de operador de incremento, e é muito usado na linguagem C++.
while
.
If
O if é uma das estruturas mais básicas de programação em geral. If significa "se" em inglês, e é exatamente isso que ele faz: ele verifica uma expressão e, apenas se ela for verdadeira, executa um conjunto de comandos. Em linguagem natural, ele executa uma lógica do tipo: "se isso for verdadeiro, então faça aquilo"
Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faça a mesma coisa que fizemos com o while e o for acima, porém vamos fazer isso usando um
Nós usaremos então essa variável global
Para ilustrar, vamos modificar o nosso programa de exemplo para que ele faça a mesma coisa que fizemos com o while e o for acima, porém vamos fazer isso usando um
if
, que segue o seguinte formato:if(condição) {
...
}
A lógica é muito simples: sempre que a condição vor verdadeira, os comandos entre {
e }
são executados, caso contrário o programa prossegue sem executá-los. Vamos ver então como fica a função loop()
:// Variável para contar o número de vezes que o LED piscou int i = 0; void loop() { digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o delay(1000); // Espera 1000 milissegundos (um segundo) digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o delay(1000); // Espera 1000 milissegundos (um segundo) i++; // Incrementa o número de "piscadas" if(i == 3) { delay(5000); // Espera 5 segundos para piscar o LED de novo i = 0; // Reinicia o contador de número de "piscadas" } }Aqui a lógica é um pouco diferente: nós vamos manter a função
loop()
piscando o LED como no programa original, porém vamos inserir uma
espera adicional de 5 segundos após cada 3 piscadas. Para isso, criamos
uma variável i
fora da função loop()
; ela precisa ser declarada de fora da função para poder reter o seu valor entre cada execução da função loop()
. Chamamos isso de variável global.
Quando a variável é declarada dentro do corpo da função, ela não retém o
valor etnre cada execução, sendo reiniciada a cada vez que a função é
re-executada. Chamamos isso de variável local.Nós usaremos então essa variável global
i
para contar, novamente, o número de vezes que o LED acendeu e apagou.
Na declaração da variável, nós a inicializamos com o valor 0
para indicar que o LED não acendeu nenhuma vez ainda. A função loop()
então começa a ser executada, acendendo e apagando o LED. Para contar o
número de vezes que o LED piscou, nós adicionamos a seguinte linha de
código: i++; // Incrementa o número de "piscadas"
Em seguida utilizamos o if
para verificar se acabamos de acender o LED pela terceira vez. Para isso, usamos a expressão i == 3
na condição do ìf
.
Se essa expressão for verdadeira, isso que dizer que o LED já acendeu 3
vezes, então inserimos uma pausa adicional de 5 segundos com a chamada delay(5000)
e reiniciamos a contagem do número de "piscadas" novamente com o seguinte comando: i = 0; // Reinicia o contador de número de "piscadas"
A partir daí a função loop()
continua sendo chamada e o ciclo se inicia novamente.
If-Else
O if-else, também conhecido como if-then-else, pode ser visto como uma extensão do comando
Mas e se essa não for a terceira vez que o LED está sendo acionado? É aí que entra o
Fonte: www.circuitar.com.br/tutoriais/programacao-para-arduino-primeiros-passos/#estruturas-de-controle
if
. Else em inglês significa "caso contrário", e ele faz exatamente o que o nome diz: "se isso for verdadeiro, então faça aquilo, caso contrário, faça outra coisa". Ele segue o seguinte formato:if(condição) {
...
} else {
...
}
Para exemplificar, vamos usar o programa do for
que mostramos acima, mas vamos dessa vez fazer o LED acender e apagar
quatro vezes antes de dar uma pausa de cinco segundos. Depois vamos
fazer com que na terceira de cada uma dessas quatro "piscadas", o LED
acenda por um período mais curto. Dentro da função loop()
, teremos o seguinte:// Variável para contar o número de vezes que o LED piscou int i; // Pisca o LED três vezes for(i = 0; i < 3; i++) { if(i == 2) { digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o delay(200); // Espera 200 milissegundos (um segundo) digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o delay(1800); // Espera 1800 milissegundos (um segundo) } else { digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acendendo-o delay(1000); // Espera 1000 milissegundos (um segundo) digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apagando-o delay(1000); // Espera 1000 milissegundos (um segundo) } } delay(5000); // Espera 5 segundos para piscar o LED de novoAqui o que fazemos é, toda vez que vamos acender o LED, verificar se é a terceira vez que isso acontece, por meio do comando
if
com a condição i == 2
.
Se essa expressão for verdadeira, isso quer dizer que já acendemos o
LED duas vezes e estamos prestes a acendê-lo pela terceira vez; nesse
caso mudamos o tempo que o LED fica acaso para um valor menor, de 0,2
segundo (uma redução de 0,8 segundo) e o tempo que ele fica apagado para
um valor maior, de 1,8 segundos (aumento de 0,8 segundo).Mas e se essa não for a terceira vez que o LED está sendo acionado? É aí que entra o
else
: se a condição do if
for verdadeira, o bloco de comandos entre {
e }
logo após o if
é executado, caso contrário, o bloco entre {
e }
após o else
é executado. Isso quer dizer que para a primeira, segunda e quarta "piscadas" será usado o tempo padrão de um segundo.Fonte: www.circuitar.com.br/tutoriais/programacao-para-arduino-primeiros-passos/#estruturas-de-controle
Nenhum comentário:
Postar um comentário