Na lição anterior, vimos o loop While (Enquanto) e o botão, onde podíamos programar acções enquanto não acontecesse nenhum tipo de evento. Se montaste o circuito da lição anterior, não precisas de alterar nada! Se não o tiveres, está aqui o esquema de conexão:
Os módulos do botão e do LED conectam-se aos pinos digitais 5 e 3, respectivamente. Também pode realizar-se com o LED integrado na placa, que está conectado ao pino 13.
O loop Do-While (Fazer-Enquanto)
O loop Do-While (Fazer-Enquanto) é parecido, já que também espera pelo evento, mas tem certas diferenças: o loop While executa-se enquanto se cumprir a condição, enquanto que o loop Do-While executa-se ao menos uma vez e depois confirma se a condição se cumpre. A seguir podes ver as duas representações gráficas do loop While, à esquerda, e do loop Do-While, à direita:
![]() |
![]() |
A sintaxe do loop Do-While pode ver-se aqui:
1 2 3 |
do{ // o teu código fica aqui }while(condição); |
Em primeiro lugar vamos olhar para a parte entre chavetas, onde iremos escrever o código que se executará, e em segundo lugar, a condição. Uma vez que o código tenha sido escrito dentro do do { }, vai ser confirmada se a condição se cumpre ou não. Caso a condição se cumpra, voltará a ser repetido este processo até que a condição deixe de ser cumprida, enquanto que o loop While confirma a condição antes de executar o código, sendo esta a única diferença entre os loops While e Do-While. Continuando com o exemplo do código anterior, vejamos como seria o código Arduino do loop Do-While. Vamos assumir que existe uma variável que é um inteiro e que se actualiza, em alguma outra parte do nosso programa. O loop Do-While seria:
1 2 3 4 5 6 |
do{ digitalWrite(2,HIGH); delay(1000); digitalWrite(2,LOW); delay(1000); }while(a<10); |
Podes ver a referência completa do loop Do-While aqui.
O botão
Para aprender sobre o botão e entradas digitais entra na lição anterior do curso: o loop While (Enquanto) e o botão..
O código
Assumindo que conectaste os elementos como se descreveu no princípio da entrada, ou seja, o módulo do botão no pino 5 e o módulo LED no pino 3, podemos então começar a programar. Em primeiro lugar declaramos as variáveis que vão armazenar o número do pino em que conectámos o hardware. Esta práctica é realmente útil, já que se modificarmos o esquema de conexão, apenas teremos que alterar uma vez o número do pino utilizado. Para isso utilizamos o seguinte código:
1 |
int pinButton = 5, led = 3; |
Desta forma, em vez de utilizar o número do pino, poderemos utilizar o seu nome, tornando a programação mais fácil, especialmente se utilizarmos uma palavra-chave como nome. Uma vez declaradas as variáveis dos pinos, temos que indicar como vai funcionar cada um dos pinos, e para isso:
1 2 3 4 |
void setup(){ pinMode(pinButton, INPUT); pinMode(led, OUTPUT); } |
Este código é equivalente a:
1 2 3 4 5 |
void setup() { pinMode(5,INPUT); // pino do botão pinMode(3,OUTPUT); // pino do LED } |
Uma vez feito, vamos criar um programa que faça piscar o LED com dois padrões distintos: um se não pressionarmos o botão e outro se o botão estiver pressionado. O código ficaria assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
int pinButton = 5, led = 3; //declaração das variáveis void setup() { Serial.begin(9600); // Iniciamos a comunicação em série a 9600 bauds pinMode(pinButton, INPUT); // Estabelecemos o pino que tem conectado o botão, como entrada pinMode(led, OUTPUT); // Estabelecemos o pino que tem conectado o LED, como saída } void loop() { boolean firstTime = false; // Inicializamos a variável firstTime do tipo Boolean com o valor <em>false</em> do { // Inicio do loop Do-While if (firstTime == false) { // Se a variável firstTime for falsa, então entrará aqui firstTime = true; } else { // Se a variável firstTime for verdadeira, então entrará aqui. firstTime = false; } // Serial.println("Inside of do-while"); // Indica através de mensagem, que o loop Do-While está a ser executado if (firstTime) { // <em>if</em> lê o valor armazenado na variável firstTime. Se for <em>true</em><em>(verdadeiro) </em>ou 1, então entra aqui blinky(1, 1000); // A função <em>blinky</em> é chamada com <em>times</em><em> = 1</em> e <em>delay_led = 1000</em> } else { // <em>if</em> lê o valor armazenado na variável. Se for <em>false</em>(falso) ou 0, então entra aqui blinky(20, 50); // A função blinky é chamada com <em>times</em> = 20 e <em>delay_led = 50</em> } } while (digitalRead(pinButton)); // Leitura da condição de repetição do loop Do-While. Se o botão estiver pressionado, voltará // a repetir o código dentro do Do-While. //Serial.println("Fora do Do-While"); // Indica por meio de uma mensagem que já se executou o loop Do-While. } /* Declaração da função do tipo void (não devolve resultado) com o nome <em>blinky</em>. Possui dois parâmetros: times (variável do tipo inteiro) que determina o número de vezes que se produzirá o pisca-pisca. delay_led (variável do tipo inteiro) que determina o tempo que existirá entre os dois estados do LED: Determina a frequência do pisca-pisca. Nota: A função acende ou apaga o LED, por isso a variável <em>times</em> representa o número de ciclos aceso/apagado (<em>times</em> = n acenderá e apagará o LED n vezes) */ void blinky(int times, int delay_led) { for (int i = 0; i < times; i++) { //Loop <em>for</em> e declaração da variável <em>i</em>. O loop executa-se de <em>i</em> até <em>times - 1</em> Serial.print("iteração "); // Imprime informação sobre o número de vezes que <em>for</em> se executa, com a linha seguinte. Serial.println(i); // Imprime o número de vezes que se executa o loop <em>for</em> digitalWrite(led, HIGH); // Activa o pino onde está conectado o LED delay(delay_led); // Tempo de espera indicado ao chamar a função com o parâmetro <em>delay_led</em> digitalWrite(led, LOW); // Desactiva o pino onde está conectado o LED delay(delay_led); // Tempo de espera indicado ao chamar a função com o parâmetro <em>delay_led </em> } } |
Como poderás ver, as linhas 21 e 32 têm à frente “// ” : isto indica ao Arduino que estas linhas são comentários, e por isso não se tomam em conta durante o desenvolvimento do programa. Existem várias formas de realizar comentários: a primeira ” // ” , apenas comenta uma linha. Enquanto que ” /* */ “, utiliza-se para comentar blocos de código ou texto. Podes ver a referência sobre comentários aqui. Na linha de código 23, podes ver começar a estrutura de controlo if-else:
1 2 3 4 5 |
if (firstTime){ blinky(1,1000); }else{ blinky(20,50); } |
Neste código, podemos ver como se utiliza firstTime como condição, sem nenhum outro tipo de operação ou comparação. A estrutura de controlo if espera por qualquer resposta do tipo true ou false ou 1 ou 0, que é precisamente o que lhe estamos a dar, uma vez que firstTime é uma variável do tipo boolean. Se quiseres recordar as variáveis, podes visitar esta lição ou a referência do Arduino. Também utilizamos a mesma função para criar um padrão completamente distinto, no LED, fazendo um código muito mais curto, fácil de entender e de modificar por qualquer pessoa. Se quiseres ver as mensagens que o programa envia para saber se está ou não dentro do loop Do-While, elimina os comentários das linhas 21 e 31 do código.
Como exercício, cria uma cópia do projecto, procura e modifica manualmente todos os campos onde apareça a variável led, pelo número do pino onde conectaste o LED (pino 13, no caso do vídeo). Depois, no projecto original, conecta o LED noutro pino, modifica o valor da variável led no princípio do código. Vês o poder de podermos assignar pinos às variáveis?