Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 15a - Efeito interativo de iluminação sequencial com barra gráfica
Projeto 15a - Efeito interativo de iluminação sequencial com barra gráfica
Angelo Luis Ferreira | 31/01/2017
Acessos: 6.408
Básico - Projeto 15a
Efeito interativo de iluminação sequencial com Barra Gráfica
Objetivo
Criar um efeito interativo de iluminação sequencial em uma barra gráfica que através de um potenciômetro, permitirá que se altere a velocidade das luzes enquanto o código está em execução.
Aplicação
Para fins didáticos e aplicações em efeitos com barra gráfica.
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 |
|
|
Barra Gráfica (bargraph) |
Barra Gráfica de Leds |
1 |
|
Utilize barra gráfica de qualquer cor |
Resistor |
Resistor 300 Ω |
1 |
|
Se você não possui este resistor, calcule o resistor apropriado para a sua barra gráfica. |
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 com leds no link --> Projeto 15 - simulação online.
Atenção: A montagem abaixo foi realizada em um protoboard com linhas de alimentação contínuas. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas - sabia mais em protoboard
Veja abaixo imagem da montagem do nosso protótipo:
Atenção:
1. A barra gráfica (bargraph) possui polaridade. O lado com chanfro recebe ligação positiva ou negativa dependendo do fabricante. Caso os leds da barra não funcionem, inverta a posição da barra gráfica.
2. Utilizando os dados do "datasheet" da barra gráfica, calculamos o valor do resistor em 200 ohms (barra gráfica azul). Entretanto, por segurança, recomenda-se utilizar um resistor de 300 ohms para barra gráfica de qualquer cor para que o projeto funcione normalmente sem que o componente seja danificado.
3. Veja na figura abaixo como foi montado o potenciômetro do nosso exemplo no circuito. Observe a ligação do cabo positivo (terminal esquerdo do potenciômetro) e negativo (terminal direito do potenciômetro) no potenciômetro. O cabo amarelo (terminal do centro do potenciômetro) 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 da barra gráfica 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 da barra gráfica 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 digital 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 da barra gráfica 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