Domine o Controle de LEDs WS2812B com Arduino – Guia Passo a Passo
Neste tutorial, aprenderemos a controlar LEDs RGB individualmente endereçáveis ou uma fita de LED WS2812B usando Arduino. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo para mais detalhes.
Visão Geral
Primeiro, explicaremos o princípio de funcionamento através de alguns exemplos básicos e depois veremos um projeto Arduino realmente legal usando estes LEDs: uma mesa de café interativa DIY com LEDs. A mesa de café possui LEDs WS2812B, sensores de proximidade infravermelho para detectar objetos e um módulo Bluetooth HC-05 para controlar as cores via um aplicativo Android personalizado. Este projeto é na verdade uma colaboração entre mim e a Marija do canal Creativity Hero no YouTube.

Como Funcionam os LEDs WS2812B
Vamos começar olhando mais de perto a fita de LED. Ela consiste em LEDs RGB tipo 5050 nos quais o driver IC WS2812B muito compacto é integrado.

Dependendo da intensidade dos três LEDs individuais Vermelho, Verde e Azul, podemos simular qualquer cor que quisermos.

O que é ótimo sobre estes LEDs é que podemos controlar até mesmo a fita de LED inteira com apenas um único pino da nossa placa Arduino. Cada LED tem três conectores em cada extremidade: dois para alimentação e um para dados. A seta indica a direção do fluxo de dados. O pad de saída de dados do LED anterior é conectado ao pad de entrada de dados do próximo LED. Podemos cortar a fita no tamanho que quisermos, bem como distanciar os LEDs usando alguns fios.

Quanto à alimentação, eles funcionam em 5V e cada LED Vermelho, Verde e Azul consome cerca de 20mA, ou seja, total de 60mA para cada LED no brilho máximo. Note que quando o Arduino é alimentado via USB, o pino 5V pode lidar apenas com cerca de 400 mA, e quando alimentado usando o conector de energia (barrel jack), o pino 5V pode lidar com cerca de 900 mA.
Se você estiver usando mais LEDs e a quantidade de corrente que eles consumirem exceder os limites mencionados acima, você deve usar uma fonte de alimentação 5V separada. Nesse caso, você também precisa conectar as duas linhas de Ground uma à outra. Além disso, é recomendado usar um resistor de cerca de 330 Ohms entre o Arduino e o pino de dados da fita de LED para reduzir ruído nessa linha, bem como um capacitor de cerca de 100uF entre 5V e Ground para suavizar a alimentação.
Exemplos Arduino e LEDs WS2812B
Exemplo 1

Agora, como exemplo, usarei uma fita de 20 LEDs, conectada ao Arduino através de um resistor de 330 Ohms e alimentada com uma fonte de alimentação 5V separada, exatamente como explicado acima. Para programar o Arduino, usaremos a biblioteca FastLED. Esta é uma biblioteca excelente e bem documentada que permite controle fácil dos LEDs WS2812B.
Você pode obter os componentes necessários para este exemplo nos links abaixo:
- Fita de LED WS2812B
- Placa Arduino
- Fonte de Alimentação DC 5V 6A
Aqui está o código fonte Arduino para o primeiro exemplo:
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
leds[0] = CRGB(255, 0, 0);
FastLED.show();
delay(500);
leds[1] = CRGB(0, 255, 0);
FastLED.show();
delay(500);
leds[2] = CRGB(0, 0, 255);
FastLED.show();
delay(500);
leds[5] = CRGB(150, 0, 255);
FastLED.show();
delay(500);
leds[9] = CRGB(255, 200, 20);
FastLED.show();
delay(500);
leds[14] = CRGB(85, 60, 180);
FastLED.show();
delay(500);
leds[19] = CRGB(50, 255, 20);
FastLED.show();
delay(500);
}
Descrição: Primeiro precisamos incluir a biblioteca FastLED, definir o pino ao qual os dados da fita de LED estão conectados, definir o número de LEDs, bem como definir um array do tipo CRGB. Este tipo contém os LEDs, com três membros de dados de um byte para cada um dos três canais de cor Vermelho, Verde e Azul.
Na seção setup(), apenas precisamos inicializar o FastLED com os parâmetros definidos acima. Agora no loop() principal, podemos controlar nossos LEDs como quisermos. Usando a função CRGB, podemos definir qualquer LED para qualquer cor usando três parâmetros de Vermelho, Verde e Azul. Para que a mudança aconteça nos LEDs, precisamos chamar a função FastLED.show().
Exemplo 2
Usando alguns loops "for", podemos facilmente fazer algumas animações.

Aqui está o código fonte Arduino para o segundo exemplo:
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 19; i++) {
leds[i] = CRGB ( 0, 0, 255);
FastLED.show();
delay(40);
}
for (int i = 19; i >= 0; i--) {
leds[i] = CRGB ( 255, 0, 0);
FastLED.show();
delay(40);
}
}
Aqui, o primeiro loop "for" acende todos os 20 LEDs em azul, do primeiro ao último LED com delay de 40 milissegundos. O próximo loop "for" acende novamente todos os 20 LEDs, mas desta vez na cor vermelha e em ordem reversa, do último para o primeiro LED.
A biblioteca FastLED possui muitas outras funções que podem ser usadas para fazer animações e shows de luz realmente interessantes, então é só sua imaginação para fazer seu próximo projeto de LED brilhar.
Mesa de Café Interativa com LEDs WS2812B
Agora vamos ver o projeto DIY de mesa de café interativa com LEDs que mencionei no início. Esta foi uma colaboração entre mim e a Marija do Creativity Hero.

Você pode conferir o artigo do site dela onde ela explica todo o processo de fabricação da mesa, desde o corte e montagem da construção de madeira, até a soldagem e conexão de todas as partes eletrônicas. Aqui explicarei como a parte eletrônica funciona, como construir o aplicativo Android personalizado e programar a placa Arduino.
Aqui está o esquemático completo do circuito deste projeto.

A mesa consiste em 45 LEDs endereçáveis, 45 sensores de proximidade infravermelho e um módulo Bluetooth HC-05, todos conectados a uma placa Arduino Mega. O circuito é alimentado com uma fonte de 5V 6A.
Você pode obter os componentes necessários para este exemplo nos links abaixo:
- Fita de LED WS2812B
- Sensor de Proximidade IR
- Módulo Bluetooth HC-05
- Placa Arduino
- Fonte de Alimentação DC 5V 6A
Relacionado: Como usar um LED RGB com Arduino | Tutorial
Códigos Fonte
Aqui está o código Arduino para este projeto e, se excluírmos a funcionalidade de controle de cor via Bluetooth, podemos notar que o código é na verdade muito simples.
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
// Define os 45 pinos dos sensores de proximidade como entradas, do pino digital 3 ao pino 48
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB( 0, 255, 0); // Define todos os 45 LEDs para cor verde
// Se um objeto é detectado no topo do sensor particular, acende o LED particular
if ( digitalRead(pinNo + 3) == LOW ) {
leds[pinNo] = CRGB( 0, 0, 255); // Define o LED reativo para azul
}
}
FastLED.show(); // Atualiza os LEDs
delay(20);
}
Descrição: Primeiro precisamos definir os parâmetros básicos como explicado anteriormente e definir os 45 pinos dos sensores de proximidade como entradas.
No loop() principal, usando um único loop "for", definimos todos os LEDs para uma cor particular e também verificamos se o sensor de proximidade detectou um objeto. Se for verdade, ou um estado lógico LOW neste caso, a cor reativa particular será definida para o LED particular. No final, usando a função FastLED.show(), atualizamos as cores dos LEDs.
Para incluir a funcionalidade de controle de cor via Bluetooth, precisamos adicionar mais algumas linhas de código, bem como fazer o aplicativo Android. Já tenho tutoriais separados sobre como usar o módulo Bluetooth HC-05 com Arduino e como fazer seu próprio aplicativo Android usando o MIT App Inventor online, então você sempre pode conferi-los para mais detalhes.
Aqui está como o aplicativo Android funciona. Ele consiste em uma imagem de paleta de cores de onde podemos escolher cores, dois botões de verificação de onde podemos selecionar se a cor escolhida será aplicada aos LEDs reativos ou de fundo e um slider para ajustar o brilho.

Se olharmos os blocos do app, podemos ver o que acontece quando tocamos o canvas onde a imagem da paleta de cores está colocada. Usando os blocos .GetPixelColor, obtemos os valores Vermelho, Verde e Azul para a cor escolhida e, usando o bloco Bluetooth SendText, enviamos esta informação para o Arduino em forma de texto.

Dependendo da checkbox selecionada, enviamos um primeiro caractere diferente ou marcador que ajuda ao receber o texto no Arduino. O mesmo acontece quando mudamos a posição do slider: um valor de 10 a 100 é enviado para o Arduino em forma de texto, com o marcador "3" na frente.
Você pode baixar o aplicativo Android abaixo, bem como o arquivo de projeto do MIT App Inventor:
DIY_Reactive_LED_Table_Control
1 arquivo(s) 0.00 KB Download
DIY_Reactive_LED_Table_Control MIT App Inventor Project File
1 arquivo(s) 208.06 KB DownloadAqui está o código Arduino:
#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino(RX, TX) - Bluetooth (TX, RX)
// Cor de fundo inicial
int backR = 100;
int backG = 50;
int backB = 10;
// Cor reativa inicial
int reactiveR = 10;
int reactiveG = 50;
int reactiveB = 100;
int brightness = 50; // Brilho inicial
String dataIn = "";
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(38400);
Bluetooth.begin(38400); // Baud rate padrão do módulo Bluetooth
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString();
delay(20);
if (dataIn.startsWith("1")) {
delay(10);
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
reactiveR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
reactiveG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
reactiveB = stringB.toInt();
} else if (dataIn.startsWith("2")) {
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
backR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
backG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
backB = stringB.toInt();
} else if (dataIn.startsWith("3")) {
String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length());
brightness = stringBrightness.toInt();
FastLED.setBrightness(brightness);
}
}
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB( backR, backG, backB);
if ( digitalRead(pinNo + 3) == LOW ) {
leds[pinNo] = CRGB( reactiveR, reactiveG, reactiveB);
}
}
FastLED.show();
delay(20);
}
Descrição: Primeiro precisamos definir a comunicação serial entre o Arduino e o módulo Bluetooth HC-05, ou os pinos aos quais o módulo está conectado. Na seção setup(), precisamos definir o baud rate no qual este módulo funciona. Então no loop() principal, usando a função Bluetooth.available(), verificamos se há dados de entrada do Smartphone. Se verdadeiro, usando a função Bluetooth.readString(), recebemos os dados como string. Então, usando a função .startsWith(), verificamos o primeiro caractere ou marcador e assim sabemos se queremos mudar a cor reativa, a de fundo ou o brilho.
Usando a função .substring(), extraímos os valores Vermelho, Verde e Azul do texto recebido e os convertemos em inteiros. Estes valores são então usados no loop "for" abaixo que define a cor e acende os LEDs como explicado anteriormente. Da mesma forma, ajustamos o brilho dos LEDs.
É isso para este tutorial. Sinta-se à vontade para fazer qualquer pergunta na seção de comentários abaixo.
Processo de manufatura
- Construa um Controle Remoto IR Universal com Arduino: Guia Passo a Passo
- Controle Remoto Universal Android com Arduino, 1Sheeld e IR
- Central de Controle de Potência Arduino: N-FET, P-FET, Relé e Kit RTC
- Controle IoT Remoto de Braço Robótico Personalizado
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Controle um Rover Arduino com Firmata e Gamepad Xbox One
- Medir a Massa da Terra com Arduino: Guia DIY Passo a Passo
- Construa um Robô Quadrúpede Inteligente com Arduino: Guia Passo a Passo
- Controle Suave de Brilho de LED com Bolt IoT e Arduino UNO
- Construa uma Bússola Digital em Tempo Real com Arduino e Processing