Você já sabe como usar leds endereçáveis com o Arduino, certo? Vimos isso no post Semáforo com Arduino e Led Endereçável WS2812B. Vamos continuar esse assunto, mostrando como você pode ligar ao Arduino mais dois componentes: o Painel de Led RGB WS2812 e o Anel de Led RGB WS2812.

Ao contrário dos leds endereçáveis que vimos no post anterior, que precisavam ser conectados um a um, tanto o painel de led como o anel já tem todos os leds interligados, tornando mais fácil e rápida a adaptação ao seu projeto.
Como os leds endereçáveis individuais, você ainda pode conectar vários módulos como esses em cascata. Veja como fazer isso nos procedimentos à seguir.
Painel de led RGB WS2812 endereçável
O painel de led RGB tem 64 leds que podem ser ativados individualmente ou em grupo de acordo com o seu programa. A ligação com o microcontrolador e alimentação é feita por meio de um conector de 3 pinos: um pino de sinal (DIN), Vcc (5V) e GND.
Como os outros sistemas de leds endereçáveis, temos também um conector de saída (DOUT, 5V e GND) para ligar outra matriz em cascata. Com isso, você pode criar efeitos visuais incríveis para o seu projeto.
Anel de led RGB WS2812 – 16 leds
O anel de led RGB segue o mesmo princípio do painel, mas os leds são dispostos em formato circular. Os anéis são apresentados em várias versões, como o anel com 12 leds, 16 leds e 24 leds, entre outras.
Com o anel de led você também consegue efeitos muito interessantes para o seu projeto. Nos testes deste post, vou usar interligar dois anéis de 16 leds.
Ligação do Painel de de led WS2812
Vamos mostrar a ligação desses componentes ao Arduino, começando pelo Painel de Leds. A ligação é bem simples, usando o pino 7 como controle da matriz:
Perceba que estamos utilizando a alimentação do próprio Arduino, apenas para efeito de testes. Se você for utilizar o circuito por um tempo mais prolongado ou os leds com brilho máximo, escolha uma fonte de alimentação externa, assim você não corre o risco de danificar a sua placa.
Outra recomendação é ligar um capacitor de 1000µF entre os pinos de alimentação, para evitar picos de tensão que podem queimar os leds.
Para testar o circuito, utilize o programa abaixo, instalando primeiro a biblioteca Neopixel da Adafruit, disponível neste link.
//Programa: Arduino Painel de led WS2812
//Alteracoes e adaptacoes: Arduino e Cia
//Baseado no programa exemplo da biblioeca Neopixel
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
//Pino de dados da matriz de led
#define PIN 7
//Parametros: numero de leds, pino de ligacao
Adafruit_NeoPixel strip=Adafruit_NeoPixel(64,PIN,NEO_GRB + NEO_KHZ800);
void setup()
{
strip.begin();
strip.show();
//Define o brilho dos leds
strip.setBrightness(50);
}
void loop()
{
//Acende os leds na cor vermelha
colorWipe(strip.Color(255, 0, 0), 20);
//Acende os leds na cor verde
colorWipe(strip.Color(0, 255, 0), 20);
//Acende os leds na cor azul
colorWipe(strip.Color(0, 0, 255), 20);
//Pisca os leds alternadamente
theaterChase(strip.Color(127, 127, 127), 50); // White
theaterChase(strip.Color(127, 0, 0), 50); // Red
theaterChase(strip.Color(0, 0, 127), 50); // Blue
//Efeito arco-iris
rainbow(20);
}
void colorWipe(uint32_t c, uint8_t wait)
{
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
void rainbow(uint8_t wait)
{
uint16_t i, j;
for (j = 0; j < 256; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
delay(wait);
}
}
void theaterChase(uint32_t c, uint8_t wait)
{
for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, c); //turn every third pixel on
}
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0); //turn every third pixel off
}
}
}
}
uint32_t Wheel(byte WheelPos)
{
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
O programa é baseado no programa exemplo da própria biblioteca, e utiliza vários efeitos como acender os leds em sequência, piscar, arco-íris, etc. Você pode utilizar este programa com praticamente qualquer tipo de led endereçável, mudando o valor referente à quantidade de leds na linha 14 do programa (no caso, está configurado para acender 64 leds, que é o tamanho da nossa matriz 8×8).
Ligação do Anel de Led WS2812
Para a ligação do anel de leds ao Arduino, vamos usar o mesmo pino 7, mas agora com 2 anéis de leds ligados em cascata. Vamos também adicionar um potenciômetro ao circuito (usei um de 10K).
Para ligação em cascata, conecte o pino DOUT do primeiro anel ao pino DIN do segundo. Ligue também os pinos Vcc e GND. Use o mesmo procedimento de acordo com a quantidade de componentes que você tiver.
Carregue o programa abaixo:
//Programa: Arduino Anel de Leds Enderecaveis WS2812
//Autor: Arduino e Cia
#include <Adafruit_NeoPixel.h>
//Pino Leds Enderecaveis
#define PIN 7
//Pino Potenciometro
#define PINPOT A1
//Define a quantidade de leds e o pino de ligacao
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(32, PIN);
uint8_t offset = 0;
//Cor dos leds
uint32_t color = 0x00ff22;
int valor = 0;
void setup()
{
Serial.begin(9600);
pinMode(PINPOT, INPUT);
pixels.begin();
//Brilho dos leds
pixels.setBrightness(50);
}
void loop()
{
//Le o valor do potenciometro
valor = analogRead(PINPOT);
//Verifica se o potenciometro esta na posicao central
while (analogRead(PINPOT) >= 490 && analogRead(PINPOT) <= 520)
{
delay(10);
}
//Define o sentido de rotacao como horario e
//ajusta a velocidade
if (valor >= 512)
{
offset++;
valor = map(valor, 0, 1023, 150, 38);
}
//Define o sentido de rotacao como anti-horario e
//ajusta a velocidade
else
{
offset--;
valor = map(valor, 0, 1023, 38, 150);
}
uint8_t i;
for (i = 0; i < 32; i++)
{
uint32_t c = 0;
if (((offset + i) & 7) < 2) c = color; // 4 pixels on...
{
//Primeiro anel
pixels.setPixelColor( i, c);
//Segundo anel
pixels.setPixelColor(16 + i, c + 40);
}
}
pixels.show();
delay(valor);
}
O programa lê o valor do potenciômetro e determina não só a velocidade com que os leds serão acesos, mas também o sentido em que os anéis vão “girar”. Confira no vídeo abaixo:
Gostou? Confira outros posts usando displays aqui mesmo no Arduino e Cia!