Ola garagistas no tutorial de hoje iremos demonstrar como controlar através do Arduíno UNO uma fita de LED de 1 metro com 60 LEDs endereçados.
Material utilizados:
1x Protoboard
1. Fita de LED Endereçada
Imagem 1 - Fita de LED Endereçada
Características:
Esta fita de LED mede 1 metro e vem com 60 LEDs endereçados. Como está fita não é selada, ela não tem proteção contra água, porém, você tem acesso a eles, então poderá fazer modificações facilmente. Você conseguirá controlar cada LED RGB individualmente podendo assim criar vários efeitos bacanas, para seu carro, seu quarto, ou outro lugar que sua imaginação permitir.
Obs: Está fita tem 1M e vem em um rolo, estes LEDs são determinados com um espaço de 0.25 cm entre eles, conectores de 3 pinos e um conector de alimentação de 2 fios.
2. Endereço Hexa da cores utilizadas
Figura 1 - Tabela de cores em Hexadecimal
A tabela acima foi utilizada como base em nosso tutorial, temos mais de 16 milhões de cores que podem ser implementadas em cada LED (256³), podemos enviar esses códigos em Hexa e os LEDs iram apresentar exatamente a mesma cor.
3. Opção de fonte externa
Imagem 2 - Fonte universal
Cada LED consome 60mA, logo 60 LEDs no nosso caso 60mA x 60 = 3,6A. Nesse tutorial não foi utilizado fonte, quando acionamos cada LED individualmente o brilho manteve no máximo, já quando acionamos todos de uma vez seu brilho diminuiu devido a falta de corrente o que não é recomendado manter por muito tempo pois pode danificar o seu computador.
4. Montagem
Figura 2 - Montagem
O resistor utilizado em série com o pino de dados deve estar no valor entre 220R e 470R e o capacitor utilizado em paralelo com a fonte de alimentação deve estar entre 10uF/16v e 100uF/16v.
Para fazer o download da biblioteca clique aqui.
Para fazer o download do WS2812_Definitions.h.
5. Sketch 1
/* SparkFun WS2812 Breakout Board Example
SparkFun Electronics
date: July 25, 2013
license: GNU GENERAL PUBLIC LICENSE
Requires the Adafruit NeoPixel library. It's awesome, go get it.
https://github.com/adafruit/Adafruit_NeoPixel
This simple example code runs three sets of animations on a group of WS2812
breakout boards. The more boards you link up, the better these animations
will look.
For help linking WS2812 breakouts, checkout our hookup guide:
https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide
Before uploading the code, make sure you adjust the two defines at the
top of this sketch: PIN and LED_COUNT. Pin should be the Arduino pin
you've got connected to the first pixel's DIN pin. By default it's
set to Arduino pin 4. LED_COUNT should be the number of breakout boards
you have linked up.
*/
#include <Adafruit_NeoPixel.h>
#define P 0x000000//PRETO
#define Z 0x0000FF//AZUL
#define E 0x008000//VERDE
#define R 0x800080//ROXO
#define V 0xFF0000//VERMELLHO
#define L 0xFFA500//LARANJA
#define R 0xFFC0CB//ROSE
#define A 0xFFFF00//AMARELO
#define B 0xFFFFFF//BRANCO
#define PIN 4// Pino de controle
#define LED_COUNT 60// Quantidade de LED's
//Cria uma instância da Classe Adafruit NeoPixel chamado "leds"
Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);
unsigned long time;//Contará o tempo
unsigned long timeout;//Estouro
int brilho[3];//Recebe os valores da serial
int i=0;//Quantidade de caracteres recebida pela serial
int posicao=0;
int flag=0;//Indica que foi recebida informação pela serial
char temp,cor;//Armazena dados recebidos pela serial
void setup()
{
Serial.begin(9600);//Inicia a serial com baud rate
leds.begin(); // Inicia a fita de LED
clearLEDs(); // Apaga todos os LEDs
leds.show(); // Atualiza o estados dos LEDs
}
void loop()
{
//------------------------------------------------------------------------------------------
// Retorna o tempo em milisegundos desde que o Arduíno começou a rodar,
time = millis()%2;//Divide por 2 e salva o resto
if(time==1||time==0)//Compara se o resto é igual a 0 ou 1 e sempre vai ser
{
timeout++;// Cronômetro
if (timeout>500)// Compara se houve estouro do tempo
{
i=0;// Zera o quantidades de caracteres recebidos
flag=0;// Zera o aviso de que foi recebido algum dado na serial
}
}
//-------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------
if (Serial.available()>0)// Verifica se houve recepção
{
flag=1;//Sinaliza que houve recepção
timeout=0;// Zera o o tempo de reset
//------------------------------------------------------------------------------------------
temp = Serial.read();// Armazena o que foi recebido pela serial
brilho[i]=temp-48;// Decrementa 48 na tabela ascii para converter de decimal para char
i++;// Contabiliza um recebimento
}
//---------------------------------------------------------------------------
if (timeout>200&&flag==1)// Compara se houve estouro do timeout(se ficou um tempo sem recepção) e se houve recepção
{
flag=0;// Sera aviso de recepção
// Envia para serial informações em % e resolução de disparo
posicao=brilho[0];
cor= brilho[1]+ 48;
switch (cor)
{
case 'Z'://AZUL
leds.setPixelColor(posicao,Z);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
case 'E'://VERDE
leds.setPixelColor(posicao,E);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
case 'V'://VERMELHO
leds.setPixelColor(posicao,V);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
case 'A'://AMARELO
leds.setPixelColor(posicao,A);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
case 'B'://BRANCO
leds.setPixelColor(posicao,B);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
case 'P'://APAGA
leds.setPixelColor(posicao,0);//Aciona o LED requerido
leds.show();//Atualiza o LED
break;
}
}
}
//Função liga led individual
void ligaLED(int g, unsigned long fita)//Recebe a posição e tempo de Delay
{
leds.setPixelColor(g, fita);//Aciona o LED requerido
leds.show();//Atualiza o LED
}
//Função apaga LED individual
void apagaLED(int g, unsigned long fita)//Recebe a posição e tempo de Delay
{
leds.setPixelColor(g, 0);//Desaciona o LED requerido
leds.show();//Atualiza o LED
}
//Função apaga LEDs geral
void clearLEDs()
{
for (int p=0; p<LED_COUNT; p++)
{
leds.setPixelColor(p, 0);
leds.show();
}
}
6. Sketch 2
/* SparkFun WS2812 Breakout Board Example
SparkFun Electronics
date: July 25, 2013
license: GNU GENERAL PUBLIC LICENSE
Requires the Adafruit NeoPixel library. It's awesome, go get it.
https://github.com/adafruit/Adafruit_NeoPixel
This simple example code runs three sets of animations on a group of WS2812
breakout boards. The more boards you link up, the better these animations
will look.
For help linking WS2812 breakouts, checkout our hookup guide:
https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide
Before uploading the code, make sure you adjust the two defines at the
top of this sketch: PIN and LED_COUNT. Pin should be the Arduino pin
you've got connected to the first pixel's DIN pin. By default it's
set to Arduino pin 4. LED_COUNT should be the number of breakout boards
you have linked up.
*/
#include <Adafruit_NeoPixel.h>
#include "WS2812_Definitions.h"
#define PIN 4// Pino de controle
#define LED_COUNT 60// Quantidade de LED's
unsigned long fita=0x000000;// recebe valores em hexa referente as cores
unsigned long pri=0x000033;
unsigned long seg=0x003201;
unsigned long ter=0x320001;
//Cria uma instância da Classe Adafruit NeoPixel chamado "leds"
Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
leds.begin(); // Inicia a fita de LED
clearLEDs(); // Apaga todos os LEDs
leds.show(); // Atualiza o estados dos LEDs
}
void loop()
{
int l=0;//conta a posição dos LEDs
int DD=50;//Variavel de envio do valor do delay
for(int k=0; k<6;k++)//1º laço
{
for(int j=0;j<6;j++)//2º laço
{
for(int i=0;i<5;i++)//3º laço
{
if( l>= LED_COUNT) l=0;//Verifica se ultrapassou o limite da fita
fita=fita+pri;//Coforme a tabela inseri o valor na constante e incrementa
ligaLED(l,DD);//Envia a posição na fita e envia o tempo ligado
//apagaLED(l,DD);//Envia a posição na fita e envia o tempo desligad//// Tirar comentario caso queira utilizar um unico LED
l++;//Incrementa posição na fita
}
if(j<5)//Compara se não ultrapassou o limite pois foram feitas duas somas seguidas e uma tera que ser ignorada
{
if(l>= LED_COUNT)l=0;
fita=fita+seg;
ligaLED(l,DD);
// apagaLED(l,DD);// Tirar comentario caso queira utilizar um unico LED
l++;//Incrementa posição na fita
}
}
if(k<5)//Compara se não ultrapassou o limite pois foram feitas duas somas seguidas e uma tera que ser ignorada
{
if(l>= LED_COUNT)l=0;
fita=fita+ter;
ligaLED(l,DD);
//apagaLED(l,DD);// Tirar comentario caso queira utilizar um unico LED
l++;//Incrementa posição na fita
}
}
}
//Função liga led individual
void ligaLED(int g, int d)//Recebe a posição e tempo de Delay
{
delay(d); //Seta o tempo
leds.setPixelColor(g, fita);//Aciona o LED requerido
leds.show();//Atualiza o LED
}
//Função apaga LED individual
void apagaLED(int g, int d)//Recebe a posição e tempo de Delay
{
delay(d); //Seta o tempo
leds.setPixelColor(g, 0);//Desaciona o LED requerido
leds.show();//Atualiza o LED
}
//Função apaga LEDs geral
void clearLEDs()
{
for (int p=0; p<LED_COUNT; p++)
{
leds.setPixelColor(p, 0);
leds.show();
}
}
Referências:
https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide
http://www.labdegaragem.org/loja/fita-de-led-enderecada.html
Jefferson Santiago
Seu usar uma fonte de 6V 5Amperes no arduino, posso ligar os a fita led no vin do arduino? estes 5Amperes podem ser aproveitados pela fita ligada no vin sem "perda" de amperes?
28 Out, 2014
Danilo Assis
Bom dia
Como eu faria para cortar essa fita e criar linhas de 1m e ainda integrar com arduino?
25 Jan, 2016
paulo varella
e possivel cortar a fita e fazer 2 linhas?
14 Maio, 2018