|
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.
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". Ele segue o seguinte formato:
No código abaixo, um LED pisca três vezes, depois espera cinco segundos, piscar mais três vezes e assim por diante.
// Programa: Pisca o LED três vezes
int i = 0; // Variável para contar o número de vezes que o LED piscou
while (i < 3) {
digitalWrite(led, HIGH); // Atribui nível lógico alto ao pino do LED, acende
delay(1000); // Espera 1000 milissegundos (um segundo)
digitalWrite(led, LOW); // Atribui nível lógico baixo ao pino do LED, apaga
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 novo |
Primeiro 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ável i: o LED ainda não piscou nenhuma vez.
- Comparamos se i < 3: como 0 é menor do que 3, executamos os comandos entre { e }:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 1: sabemos que o LED piscou uma vez.
- Voltamos ao início do while e comparamos se i < 3: como 1 é menor do que 3, executamos os comandos entre { e } novamente:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 2: sabemos que o LED piscou duas vezes.
- Voltamos ao início do while e comparamos se i < 3: como 2 é menor do que 3, executamos os comandos entre { e } novamente:
- Executamos os comandos para acender e apagar o LED.
- Somamos 1 à variável i, tornando-a 3: sabemos que o LED piscou três vezes.
- Voltamos ao início do while e comparamos se i < 3: como 3 não é menor do que 3, não executamos mais os comandos entre { e } e prosseguimos à próxima instrução.
- Esperamos cinco segundos por meio da chamada delay(5000).
Após esses passos, chegamos ao final da função 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
Do / While
O do / while é uma estrutura que executa um conjunto de comandos repetidas vezes enquanto uma determinada condição for verdadeira. É quase o mesmo funcionamento que o while, a diferença é que com o uso dele teremos os comandos executados ao menos uma única vez. Ele segue o seguinte formato:
do {
// comandos;
} while (condicao);
|
No código abaixo, é feita uma verificação dos valores aumentados e a cada “passada” do loop, é incrementado em 50 o valor do aumento.
decimal aumento = 250;
do {
Serial.print("O valor atual do aumento é de: ");
Serial.println(aumento);
aumento = aumento + 50;
} while (aumento < 500);
|
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 novo
|
A 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 }.
Podemos então verificar que o 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++: soma 1 à variável i ao final da execução dos comandos entre { e }; nesse caso ele é equivalente ao comando i = i + 1. O operador ++ é chamado de operador de incremento, e é muito usado na linguagem C++.
Se executarmos o programa acima no Arduino, veremos que o resultado é o mesmo que obtivemos com o programa que fizamos anteriormente utilizando o 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 if, que segue o seguinte formato:
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 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 novo |
Aqui 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 iffor 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.
Switch...case
A instrução switch compara o valor de uma variável com os valores especificados em instruções case. Quando uma instrução case é encontrada, cujo valor corresponde ao da variável, o código nessa instrução case é executado.
A palavra-chave break sai da instrução switch e é normalmente usada no final de cada caso. Sem uma instrução break, a instrução switch continuará executando as expressões abaixo dela.
switch (LED) {
case label1:
// statements
break;
case label2:
// statements
break;
default:
// statements
break;
} |
Para exemplificar, vamos declarar 3 LEDs. Depois vamos fazer com que eles acendam em sequencia:
// Variável para controlar a sequencia de acionamento dos LEDs
int i=0;
// soma 1 a variável
i++;
switch (i) {
case 1:
digitalWrite(led1, HIGH); // Atribui nível lógico alto ao pino do LED, acende
digitalWrite(led2, LOW); // Atribui nível lógico baixo ao pino do LED, acende
digitalWrite(led3, LOW); // Atribui nível lógico baixo ao pino do LED, acende
break;
case 2:
digitalWrite(led1, LOW); // Atribui nível lógico baixo ao pino do LED, acende
digitalWrite(led2, HIGH); // Atribui nível lógico alto ao pino do LED, acende
digitalWrite(led3, LOW); // Atribui nível lógico baixo ao pino do LED, acende
break;
default:
digitalWrite(led1, LOW); // Atribui nível lógico baixo ao pino do LED, acende
digitalWrite(led2, LOW); // Atribui nível lógico baixo ao pino do LED, acende
digitalWrite(led3, HIGH); // Atribui nível lógico alto ao pino do LED, acende
i=0; // Inicializa a variável em 0;
break;
}
delay(1000); |
Saiba mais em: https://www.arduino.cc/reference/en/#structure
|