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
Led Difuso 5mm Led 5mm vermelho 10 Utilize leds de qualquer cor
Resistor Resistor 300 mΩ  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  

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.

JSN Epic template designed by JoomlaShine.com