Projeto 15 - Efeito interativo de iluminação sequencial com LEDs
- Detalhes
- angelo
- Acessos: 12285
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 |
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 | ![]() |
Obs.: Utilizar também cabos de ligação.
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.
2) A montagem abaixo foi realizada em um protoboard com linhas de alimentação separadas. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas - sabia mais em protoboard
Montagem do potenciômetro:
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.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.