Nesta segunda parte vou evoluir o programa usado para controlar vários LEDs usando um loop baseado na instrução "for" suportada pelo microcontrolador do Arduino.
Os LEDs estão ligados da porta 2 até a porta 7, num total de 6 LEDs. Como ilustra a figura ao lado, foram usados LEDs vermelhos e verdes dispostos de maneira intercalada. Cada um ligado a um resistor de 10k e 1k ohms, respectivamente.
O código a seguir contem as instruções necessárias para configurar as portas digitais como saída e acender/apagar os LEDs ligados a estas portas em sequência.
#define QTD_LEDS 6
int porta[QTD_LEDS] = {2,3,4,5,6,7};
int pausa = 500;
void setup() {
for(int i = 0;i < QTD_LEDS; i++) {
pinMode(porta[i], OUTPUT);
}
}
void loop() {
for(int i = 0;i < QTD_LEDS; i++) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
for(int i = QTD_LEDS - 1;i == 0; i--) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
}
Na linha 3 do código acima é definido um array contendo em cada posição o número de cada porta ocupada por um LED. O uso da estrutura array facilita e simplifica o acesso em sequência ao número de cada porta usada para fazer a respectiva configuração na função "setup()" e o controle de cada LED em loop na função "loop()".
Na função "setup()", implementada a partir da linha 7, cada porta é configurada dentro da instrução "for" que permite a execução da linha 8 num número conhecido de vezes. A cada execução uma das portas indicadas pelo array "porta" é configurada como saída (OUTPUT) através da execução da função "pinMode()".
A função "loop()", que será executada infinitas vezes pelo microcontrolador do Arduino, usa duas vezes a instrução "for" para acender e apagar o LED conectado em cada porta. No primeiro uso, os LEDs acendem e apagam na sequência crescente e no segundo uso, os LEDs acendem e apagam na sequência decrescente.
O video a seguir mostra a execução do programa implementado acima já instalado e rodando dentro do Arduino.
Agora vamos fazer uma pequena evolução neste exemplo para incorporar uma chave que permite mandar um bit para o programa através de porta digital 8. Usando este bit podemos controlar a direção que os LEDs acendem/apagam ao aplicar a instrução "if" sobre as linhas de código que realizam o loop dentro da função "loop()".
O programa ilustrado a seguir configura na linha 11 a porta digital 8 do Arduino como entrada digital. Na linha 15 deste programa o valor fornecido pela chave digital é lido através da chamada à função "digitalRead()". Se o valor retornado por esta função for igual a HIGH, os LEDs acendem/apagam na ordem da porta 2 até 7. Se o valor for LOW, os LEDs acendem/apagam na ordem da porta 7 até 2.
#define QTD_LEDS 6
#define portaChave 8
int porta[QTD_LEDS] = {2,3,4,5,6,7};
int pausa = 500;
void setup() {
for(int i = 0;i < QTD_LEDS; i++) {
pinMode(porta[i],OUTPUT);
}
pinMode(portaChave,INPUT);
}
void loop() {
if (digitalRead(portaChave) == HIGH) {
for(int i = 0;i < QTD_LEDS; i++) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
} else {
for(int i = QTD_LEDS - 1;i >= 0; i--) {
digitalWrite(porta[i], HIGH);
delay(pausa);
digitalWrite(porta[i], LOW);
}
}
}
Na figura ao lado, a chave de duas posições e três pares de pinos é ligada ao aterramento (GND), à porta 8 (pino central) e à porta de 5v (fio laranja). Assim, quando mudamos a chave para uma posição, a porta 8 é ligada ao aterramento e estaremos enviando o bit 0 (LOW). Quando mudamos a chave para a outra posição, a porta 8 passa a ser ligada à tensão de 5v (bit igual a 1 ou HIGH).
O video abaixo apresenta a execução do programa dentro do Arduino após compilar através da IDE na máquina desktop. Este video mostra os LEDs acendendo/apagando num sentido e após a mudança da posição da chave o sentido é invertido.
O próximo exemplo, que será apresentando num novo post, ilustrará uma evolução do código acima para receber um sinal analógico vindo de um potenciômetro para controlar o tempo que cada LED permanece aceso.