Aula 03 Efeito de iluminao sequencial com LED

  • Slides: 26
Download presentation
Aula 03: Efeito de iluminação sequencial com LED e Efeito interativo de iluminação com

Aula 03: Efeito de iluminação sequencial com LED e Efeito interativo de iluminação com LED

Aula 03: Efeito de iluminação sequencial com LED e Efeito interativo de iluminação com

Aula 03: Efeito de iluminação sequencial com LED e Efeito interativo de iluminação com LED O que vamos aprender? 1. Utilização de uma sequência de LED’s´ para realização de um Efeito de Iluminação Sequencial. 2. Utilização de uma sequência de LED’s´ para realização de um Efeito Interativo de Iluminação.

1 – Prática 5: Efeito de iluminação sequencial com LED’s Usaremos: • 10 LED’s

1 – Prática 5: Efeito de iluminação sequencial com LED’s Usaremos: • 10 LED’s de 2 V • 10 resistores de 100Ω

 • Verifique o seu circuito e depois digite o código: // Projeto 5

• Verifique o seu circuito e depois digite o código: // Projeto 5 – Efeito de iluminação sequencial com LED’s byte led. Pin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // cria um array para os pinos dos LED’s int led. Delay(65); // intervalo entre as alterações int direction = 1; int current. LED = 0; unsigned long change. Time;

void setup() { for (int x=0; x<10; x++) { // define todos os pinos

void setup() { for (int x=0; x<10; x++) { // define todos os pinos como saída pin. Mode(led. Pin[x], OUTPUT); } change. Time = millis(); } void loop() { if ((millis() - change. Time) > led. Delay) { // verifica se já transcorreram “led. Delay” ms desde // a última alteração

change. LED(); change. Time = millis(); } } void change. LED() { for (int

change. LED(); change. Time = millis(); } } void change. LED() { for (int x=0; x<10; x++) { // apaga todos os LED’s digital. Write(led. Pin[x], LOW); } digital. Write(led. Pin[current. LED], HIGH); // acende o LED atual current. LED += direction; // incrementa de acordo com o valor de “direction” // altera a direção se tivermos atingido o fim

if (current. LED == 9) {direction = -1; } if (current. LED == 0)

if (current. LED == 9) {direction = -1; } if (current. LED == 0) {direction = 1; } } • Analisando o código: A primeira linha nesse sketch: byte led. Pin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; É uma declaração de variável do tipo array. Um array é um conjunto de variáveis, acessadas utilizando um número de índice. Em seu sketch, você declara um array com o tipo de dado byte, dando ao array o nome led. Pin. Então, você inicializa-o com dez valores (os pinos digitais 4 a 13).

Para acessar um elemento do array, você simplesmente se refere ao número de índice

Para acessar um elemento do array, você simplesmente se refere ao número de índice desse elemento. Arrays são indexados a partir de zero, o que significa que o primeiro índice é 0, e não 1. Assim, em seu array de dez elementos, os números de índice vão de 0 a 9. Nesse caso, o elemento 3, (led. Pin[2]), tem o valor 6, é o elemento 7, (led. Pin[6]), tem o valor 10. Você deve declarar o tamanho do array, se não for inicializá-lo com dados. Em seu sketch, você não escolheu explicitamente um tamanho, pois o compilador é capaz de contar os valores que você atribuiu ao array e descobrir que seu tamanho é de dez elementos.

Caso você tivesse declarado o array, mas não inicializado os valores ao mesmo tempo,

Caso você tivesse declarado o array, mas não inicializado os valores ao mesmo tempo, teria de declarar um tamanho. Por exemplo, você poderia ter feito o seguinte: byte led. Pin[10]; e, então, carregado dados nos elementos posteriormente. Para recuperar um valor do array, você faria algo como: x = ledpin[5]; Nesse exemplo, x agora armazenaria um valor de 9. Retornando ao programa, você começou declarando e inicializando um array que armazena dez valores: os pinos digitais utilizados para as saídas de seus dez LED’s.

Em seu loop principal, você verifica se transcorreram ao menos led. Delay milissegundos desde

Em seu loop principal, você verifica se transcorreram ao menos led. Delay milissegundos desde a última alteração nos LED’s; em caso afirmativo, o código passa o controle para sua função. O motivo de você passar o controle para a função change. LED() dessa maneira, em vez de utilizar comandos delay(), é para permitir que, se necessário, outro código seja executado no loop principal do programa (desde que esse código demore menos que “led. Delay” milisegundos para ser executado). A função que você cria é: void change. LED() { // apaga todos os LED’s for (int x=0; x<10; x++) { digital. Write(led. Pin[x], LOW); }

// acende o LED atual digital. Write(led. Pin[current. LED], HIGH); // incrementa de acordo

// acende o LED atual digital. Write(led. Pin[current. LED], HIGH); // incrementa de acordo com o valor de direction current. LED += direction; // altera a direção se tivermos atingido o fim if (current. LED == 9) {direction = -1; } if (current. LED == 0) {direction = 1; } } O trabalho dessa função é apagar todos os LED’s e, então, acender o LED atual (isso é feito tão rápido que você não verá acontecer), que está armazenado na variável current. LED. Depois, adicionamos direction à essa variável. Como direction pode ser apenas 1 ou -1, o número incrementará (current. LED +1) ou decrementará em um (current. LED+(-1)).

Em seguida, temos uma instrução if para verificar se atingimos o fim da linha

Em seguida, temos uma instrução if para verificar se atingimos o fim da linha de LED’s; se afirmativo, você reverte a variável direction. Alterando o valor de led. Delay você pode fazer com que os LED’s acendam e apaguem sequencialmente em velocidades diferentes. Experimente outros valores para ver os resultados.

2 – Prática 6: Efeito interativo de iluminação sequencial com LEDs Usaremos: • 10

2 – Prática 6: Efeito interativo de iluminação sequencial com LEDs Usaremos: • 10 LED’s de 2 V • 10 resistores de 100Ω • 1 potenciômetro giratório de 4, 7Ω

Ø Potenciômetro O único componente adicional de hardware utilizado neste projeto é o potenciômetro

Ø Potenciômetro O único componente adicional de hardware utilizado neste projeto é o potenciômetro de 4 K 7 (4700 Ω). Você sabe como resistores funcionam. O potenciômetro é apenas um resistor ajustável, com um alcance de zero a um valor definido (escrito em sua lateral). Neste projeto, você está utilizando um potenciômetro de 4 K 7 (4700 Ω), o que significa que seu alcance é de 0 Ω a 4700 Ω. O potenciômetro tem três terminais. Conectando apenas dois, ele se torna um resistor variável. Conectando os três e aplicando uma voltagem, o potenciômetro se torna um divisor de tensão. É dessa forma que ele será utilizado em seu circuito. Um lado é conectado ao terra, outro aos 5 V, e o terminal central ao seu pino analógico.

Ajustando o botão, uma voltagem entre 0 V e 5 V será aplicada ao

Ajustando o botão, uma voltagem entre 0 V e 5 V será aplicada ao pino central; você pode ler o valor dessa voltagem no pino analógico 2 e utilizá-lo para alterar a taxa de intervalo empregada no efeito das luzes. O potenciômetro pode ser muito útil, pois fornece uma forma de ajustar um valor entre zero e um limite definido, por exemplo, para regular o volume de um rádio ou o brilho de uma lâmpada. De fato, reostatos que regulam a luminosidade das lâmpadas de sua casa são um tipo de potenciômetro.

Figura 1: Esquema de um potenciômetro

Figura 1: Esquema de um potenciômetro

Figura 2: Potenciômetro

Figura 2: Potenciômetro

Verifique seu circuito e digite o código: // Projeto 6 – Efeito interativo de

Verifique seu circuito e digite o código: // Projeto 6 – Efeito interativo de iluminação sequencial com LEDs byte led. Pin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Cria um array para os pinos dos LED’s int led. Delay; // intervalo entre as alterações int direction = 1; int current. LED = 0; unsigned long change. Time; int pot. Pin = 2; // seleciona o pino de entrada para o potenciômetro void setup() { for (int x=0; x<10; x++) { // define todos os pinos como saída pin. Mode(led. Pin[x], OUTPUT); } change. Time = millis(); }

void loop() { led. Delay = analog. Read(pot. Pin); // lê o valor do

void loop() { led. Delay = analog. Read(pot. Pin); // lê o valor do potenciômetro if ((millis() - change. Time) > led. Delay) { // verifica se transcorreram led. Delay ms desde a última alteração change. LED(); change. Time = millis(); } } void change. LED() { for (int x=0; x<10; x++) { // apaga todos os LED’s digital. Write(led. Pin[x], LOW); } digital. Write(led. Pin[current. LED], HIGH); // acende o LED atual

current. LED += direction; // incrementa de acordo com o valor de direction //

current. LED += direction; // incrementa de acordo com o valor de direction // altera a direção se tivermos atingido o fim if (current. LED == 9) {direction = -1; } if (current. LED == 0) {direction = 1; } }

Depois de verificar e fazer o upload de seu código, você deverá ver os

Depois de verificar e fazer o upload de seu código, você deverá ver os LED’s acenderem, indo e voltando de uma ponta a outra da sequência de luzes, como antes. Entretanto, virando o botão do potenciômetro, você pode alterar o valor de led. Delay, acelerando ou desacelerando o efeito. Explicação do código: O código deste projeto é praticamente idêntico ao do projeto anterior. Você simplesmente adicionou um potenciômetro ao seu hardware, e acrescentou o código necessário para permitir a leitura de valores do potenciômetro, e o uso desses valores, para ajustar a velocidade do efeito de iluminação sequencial dos LED’s. Primeiramente, você declara uma variável para o pino do potenciômetro, int pot. Pin = 2;

Isso é feito dessa forma, pois seu potenciômetro está conectado ao pino analógico 2.

Isso é feito dessa forma, pois seu potenciômetro está conectado ao pino analógico 2. Para ler o valor de um pino analógico, você utiliza o comando analog. Read. O Arduino tem seis entradas/saídas analógicas com um conversor analógico-para-digital de 10. Isso significa que o pino analógico pode ler voltagens, entre 0 e 5 volts, usando valores inteiros entre 0 (0 V) e 1. 023 (5 V). Isso representa uma resolução de 5 V / 1024 unidades, ou 0, 0049 V (4, 9 m. V) por unidade. Defina seu intervalo de espera utilizando o potenciômetro, para que você possa usar os valores lidos diretamente do pino, ajustando o intervalo entre 0 e 1. 023 milissegundos (ou pouco mais de um segundo). Isso é feito armazenando diretamente o valor do pino do potenciômetro em led. Delay. Note que você não tem de definir um pino analógico como entrada ou saída (diferentemente de um pino digital): led. Delay = analog. Read(pot. Pin);

Isso ocorre durante seu loop principal e, portanto, é um valor que está constantemente

Isso ocorre durante seu loop principal e, portanto, é um valor que está constantemente sendo lido e ajustado. Virando o botão, você pode ajustar o valor do intervalo entre 0 e 1. 023 milissegundos (ou pouco mais de um segundo), com controle total sobre a velocidade do efeito.

Ø Fontes bibliográficas: Mc. Roberts, Michael Arduino básico / Michael Mc. Roberts ; [tradução

Ø Fontes bibliográficas: Mc. Roberts, Michael Arduino básico / Michael Mc. Roberts ; [tradução Rafael Zanolli]. -- São Paulo : Novatec Editora, 2011.