Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 15 - Efeito interativo de iluminação sequencial com LEDs
Projeto 15 - Efeito interativo de iluminação sequencial com LEDs
Angelo Luis Ferreira | 19/01/2017
Acessos: 20.764
Básico - Projeto 15
Efeito interativo de iluminação sequencial com LEDS
Objetivo
Criar um efeito interativo de iluminação sequencial com 10 LEDs que através de um potenciômetro, permitirá que se altere a velocidade das luzes enquanto o programa está em execução.
Aplicação
Para fins didáticos e aplicações em efeitos com led.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
 |
No mínimo utilizar protoboard com 830 pontos |
Jumpers |
Kit cabos ligação macho / macho |
1 |
 |
|
Led Difuso 5mm |
Led 5mm vermelho |
10 |
 |
Utilize leds de qualquer cor |
Resistor |
Resistor 300 Ω |
10 |
 |
Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado - Calcular Resistor. |
Potenciômetro |
Potenciômetro 10K |
1 |
 |
O valor do potenciômetro aumenta quando giramos o eixo do componente na direção do polo negativo para o polo positivo. |
Arduino UNO R3 |
Arduino UNO |
1 |
 |
|
Montagem do Circuito
Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito. Veja a simulação no link --> Projeto 15 - simulação online.

Atenção:
1. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

1.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).
1.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.
2. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Como calcular o resistor adequado para o led e Leds ligados em série e em paralelo.
Obs.: Resistores iguais ou superiores a 250 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V.
2.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω
3. Montagem do potenciômetro:
3.1. Veja na figura abaixo como foi montado o potenciômetro do nosso exemplo no circuito. Observe a ligação do cabo positivo (vermelho) e negativo (preto) no potenciômetro. O cabo amarelo se conecta com o pino analógico do Arduino. Nesta montagem, quando girarmos o eixo do potenciômetro no sentido horário, o efeito de iluminação dos leds piscará mais rápido.

Código do Projeto (sketch)
Digite o código abaixo no ambiente de desenvolvimento do Arduino. Faça a verificação e o upload.
/*******************************************************************************
*
* Projeto 15 – Efeito interativo de iluminação sequencial através de um potênciometro
*
*******************************************************************************/
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array para os pinos digitais dos LEDs
int ledDelay; // intervalo entre as alterações
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2; // seleciona o pino analógico de entrada para o potenciômetro
void setup() {
for (int x=0; x<10; x++) { // define todos os pinos dos LEDs como saída
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin); // lê o valor do potenciômetro convertido de analógico para digital
if ((millis() - changeTime) > ledDelay) { // verifica se já transcorreram ledDelay ms desde a última alteração
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x=0; x<10; x++) { // apaga todos os LEDs
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
currentLED += direction; // incrementa de acordo com o valor de direction
// altera a direção se tivermos atingido o fim
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
}
Vídeo
Como o projeto deve funcionar
1. Quando você rodar o programa, os leds começarão a piscar de maneira sequencial e na velocidade de acordo com o valor do parâmetro do potenciômetro lido.
2. Girando o eixo do potenciômetro no sentido horário ou anti-horário, o efeito sequencial se dará de forma mais rápida ou mais lenta.
3. O sentido do eixo do potenciômetro será definido pela polaridade. Para conhecer mais, acesse: Potenciômetro
Explicando o Código do Projeto
1. Primeiro declaramos as variáveis ledPin[ ], ledDelay, direction, currentLED, changeTime e potPin.
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array para os pinos digitais dos LEDs
int ledDelay; // intervalo entre as alterações
int direction = 1;
int currentLED = 0;
unsigned long changeTime;
int potPin = 2; // seleciona o pino analógico de entrada para o potenciômetro
1.1. Observe que utilizamos variáveis tipo "byte", "int" e "unsigned long". Veja na tabela abaixo as diferenças nos tipos de constantes e variáveis:
Tipo |
Valores Válidos para Variáveis e Constantes
|
byte |
de 0 a 255 (valores de 8 bits não sinalizados) |
unsigned long |
de 0 a 429967295 (valores de 32 bits(4 bytes) não sinalizados) |
char |
letras e símbolos: 'a', 'b', 'H', '^', '*','1','0' |
int |
de -32767 até 32767 (apenas números inteiros) |
float |
de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão (2 casas depois da vírgula) |
double |
de -1.7 x 10308 até +1.7 x 10+308com até 10 dígitos de precisão |
1.2. A variável ledPin[ ] se refere à uma Array. Isto significa que no nosso exemplo, a variável ledPin será declarada com valores de 4 a 13, ou seja, os LEDs deverão estar conectados do pino digital 4 até ao pino digital 13 sucessivamente, como mostra o esquema de montagem do circuito acima.
1.2.1. Leia Como declarar e utilizar arrays no Arduino - Vetores e Matrizes
1.3. Declaramos a variável ledDelay como tipo inteiro, que deverá ler o valor do potenciômetro convertido de analógico para digital.
1.4. A variável direction e currentLED são responsáveis para definir a direção da iluminação sequencial. Ambas começam valendo 1 e 0 respectivamente.
1.5. A variável changeTime é declarada como tipo "usigned long" ( de 0 a 429967295). Esta variável verifica se ocorreu o tempo em ms (milissegundos) desde a última alteração.
1.6. A variável potPin se refere ao potenciômetro que deverá estar conectado no pino analógico do Arduino A2, mostrado na montagem do circuito.
2. Através da strutura void setup(), definimos:
void setup() {
for (int x=0; x<10; x++) { // define todos os pinos dos LEDs como saída
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
2.1. Através a estrutura for loop, de o a 9 (10 repetições), definimos os índices da variável array ledPin, sendo: ledPin[0] até ledPin[9] conectados na saída (OUTPUT) do controlador. Portanto no nosso exemplo, a constante ledPin[0] ficará definida como saída do pino digital 4, ledPin[1] como saída do pino digital 5, e sucessivamente até ledPin[9] definido como saída do pino digital 13. Observe a montagem do circuito onde conectamos os leds aos pinos digitais do Arduino.
2.2. A variável changeTime será definida pela função de tempo millis(). A função millis() retorna o numero de milissegundos contado desde que a placa começou a executar o programa. Este número retorna a zero após aproximadamente 50 dias, ou seja, funciona como um relógio em milissegundos com um ciclo de aproximadamente 50 dias.
3. Através da estrutura voip loop(), criamos o loop definido como:
void loop() {
ledDelay = analogRead(potPin); // lê o valor do potenciômetro convertido de analógico para digital
if ((millis() - changeTime) > ledDelay) { // verifica se já transcorreram ledDelay ms desde a última alteração
changeLED();
changeTime = millis();
}
}
3.1. A variável ledDelay lê o valor do potenciômetro e faz a conversão de analógico para digitar através da função analogRead(). Esta leitura é feita pelo ADC (Analog to Digital Converter - conversor analógico para digital) sem tratamento nenhum. A variável definida como inteiro (int) vai de 0 a 1023, em função à resolução de 10 bits do ADC para controladores Arduino Uno, Mega e Leonardo, ou seja possui 210 = 1024 valores inteiros. Assim, quando o eixo do potenciômetro estiver totalmente posicionado do lado do polo negativo, o valor lido será zero, e quando o eixo for deslocado totalmente para o lado do polo positivo, o valor será de 1023, variando proporcionalmente conforme a posição do eixo do componente entre estes dois extremos.
3.2. A condicional "if ((millis() - changeTime) > ledDelay)" verifica se o valor do intervalo de tempo é maior que o valor da variável ledDelay definido pelo potenciômetro. Se sim, o programa chama a função changeLED() e atualiza o valor da variável changeTime.
4. Através da estrutura void changeLED() criamos a função changeLED(), definida como:
void changeLED() {
for (int x=0; x<10; x++) { // apaga todos os LEDs
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); // acende o LED atual
currentLED += direction; // incrementa de acordo com o valor de direction
// altera a direção se tivermos atingido o fim
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
}
4.1. O objetivo desta função é apagar todos os leds e acender apenas o led que está armazenado na variável currentLED (que inicia valendo 0).
4.2. Depois acrescentaremos direction em currentLED. Como direction pode ser apenas 1 ou -1, a variável currentLED poderá incrementar (currentLED +1) ou decrementar (currentLED+(-1)).
4.3. Através da instrução if, verificamos se atingimos o fim da linha de LEDs em 0 ou 9, revertendo a variável entre 1 e -1. Desta forma os leds se acenderam da esquerda para a direita (de 0 até 9) e depois da direita para a esquerda (de 9 até 0).
4.4. Vale a pena lembrar, que quando se altera o valor de ledDelay, girando-se o eixo do potenciômetro no sentido horário ou no sentido anti-horário, você irá fazer com que os LEDs acendam e apaguem sequencialmente em velocidades diferentes.
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários