Projeto 15 - Efeito interativo de iluminação sequencial com LEDs

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 Resultado de imagem para protoboard 830v 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 Resultado de imagem para potenciômetro 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

×

Infomações do site / SEO








×

Adicionar Marcadores