Luzes LED para árvore de Natal com Arduino: neve e arco-íris com WS2812B
Faça luzes LED para a árvore de Natal com Arduino: fita WS2812B, efeitos de neve, arco-íris e pisca-pisca, troca de modo por botão, cálculo da fonte de 5 V e código.
Usar um Arduino e uma fita LED WS2812B em um projeto de árvore de Natal é o jeito mais divertido de ir além dos poucos modos fixos dos pisca-piscas prontos. Como você controla a cor e o brilho de cada LED individualmente, dá para criar flocos de neve descendo do topo, um arco-íris girando pelos galhos ou estrelas vermelhas, verdes e douradas piscando ao acaso. Para tudo isso, basta um único fio de dados, um botão e uma fonte de 5 V bem escolhida.
Neste guia, vamos começar pela lista de materiais e avançar passo a passo: o cálculo da fonte de alimentação de acordo com o comprimento da fita, a ligação correta entre a fonte, a placa e a fita, um programa completo para Arduino Uno (FastLED) que troca os efeitos com um botão, e as versões do mesmo projeto para ESP32 (Adafruit NeoPixel) e Raspberry Pi Pico (MicroPython). No final, você também vai aprender a enrolar a fita na árvore, com o que tomar cuidado em termos de segurança e como resolver os problemas mais comuns.

Por que usar uma fita LED WS2812B na árvore de Natal?
Nos pisca-piscas de Natal clássicos, todas as lâmpadas acendem ao mesmo tempo ou funcionam em sequência, em poucos grupos. Já no WS2812B, cada LED tem um pequeno chip driver dentro. O Arduino envia os dados de cor um após o outro pela linha de dados; o primeiro LED pega a sua parte de 24 bits e repassa o restante para o próximo LED. Assim, você controla uma fita de 100 ou 300 LEDs com um único pino e pode dar a cada LED uma cor própria. É isso que dá aos efeitos com movimento, como a neve caindo, uma vivacidade que as luzes fixas não conseguem igualar. Se quiser entender melhor como os LEDs endereçáveis funcionam, confira o post LED WS2812B NeoPixel.
| Característica | Valor |
|---|---|
| Encapsulamento | 5050 SMD, chip driver dentro do LED |
| Alimentação | 5 V (aproximadamente 3,5–5,3 V) |
| Corrente | Cerca de 20 mA por cor, cerca de 60 mA no branco total |
| Dados | Linha única, 800 kHz, 24 bits por LED (ordem G-R-B) |
| Tempo de dados | 30 µs por LED; 100 LEDs levam cerca de 3 ms |
| Limiar da entrada de dados | No mínimo 0,7 × VDD para o nível lógico 1 (3,5 V com 5 V) |
| Cor | 256 níveis por canal, 16,7 milhões de cores no total |
| Densidade da fita | 30, 60 e 144 LEDs/m |
| Corte | Pode ser cortada no meio das ilhas de cobre entre os LEDs |
Lista de materiais
- Fita LED WS2812B: para uma árvore de 1,5–1,8 m de altura, 2,5 m de fita com 60 LEDs/m ou 5 m de fita com 30 LEDs/m é um bom começo. As versões IP65 com cobertura de silicone resistem melhor a ficar penduradas nos galhos e à poeira.
- Placa de controle: Arduino Uno, Nano, ESP32 ou Raspberry Pi Pico.
- Fonte de 5 V: escolha a corrente pela tabela abaixo; para 100 LEDs, uma fonte de 5 V 4 A é uma escolha confortável.
- Conector DC fêmea (com borne de parafuso): para ligar o plugue da fonte aos fios sem precisar soldar.
- Capacitor eletrolítico de 1000 µF / 10 V: suaviza os picos repentinos de corrente na entrada da fita.
- Resistor de 330 Ω: ligado em série com a linha de dados; amortece as reflexões no sinal e limita a corrente de entrada do primeiro LED.
- Botão: para alternar entre os efeitos.
- Fio grosso: fio com seção de pelo menos 0,75–1,5 mm² para as linhas de 5V e GND.
- 74AHCT125 ou 74HCT245 (opcional): para elevar o sinal de dados de 3,3 V do ESP32 e do Pico para 5 V.
Cálculo da fonte: de quantos ampères você precisa?
Cada um dos chips vermelho, verde e azul dentro de um WS2812B consome cerca de 20 mA no brilho máximo, então um LED gasta cerca de 60 mA no branco total. A corrente no pior caso é dada pela fórmula I = número de LEDs × 60 mA. Uma fita de 100 LEDs consome 6 A quando todos os LEDs estão em branco puro no brilho máximo, o que significa P = 5 V × 6 A = 30 W. Nos efeitos de arco-íris, neve e estrelas, a maioria dos LEDs fica em uma só cor ou com brilho reduzido, então na prática a corrente fica em torno de um terço do pior caso. Para uma escolha segura, multiplique essa corrente típica por 2 e arredonde para o valor de fonte mais próximo acima, e ajuste o limite de corrente no software para cerca de 80% da fonte. Você pode conferir facilmente a relação entre corrente, tensão e potência com a calculadora da lei de Ohm.
| Número de LEDs | Pior caso (branco total) | Corrente típica dos efeitos | Fonte recomendada | Limite no software (MAX_MA) |
|---|---|---|---|---|
| 30 | 1,8 A | cerca de 0,6 A | 5 V 2 A | 1600 mA |
| 60 | 3,6 A | cerca de 1,2 A | 5 V 3 A | 2400 mA |
| 100 | 6 A | cerca de 2 A | 5 V 4 A | 3200 mA |
| 150 | 9 A | cerca de 3 A | 5 V 6 A | 4800 mA |
| 300 (5 m, 60 LEDs/m) | 18 A | cerca de 6 A | 5 V 12 A | 9600 mA |
Em fitas longas, o segundo problema é a queda de tensão. Como as finas trilhas de cobre da fita têm resistência, a tensão no final de uma fita de 5 m pode cair abaixo de 4 V; os chips azul e verde enfraquecem e o branco fica amarelado e apagado. A solução é alimentar o 5V e o GND de novo, não só no início da fita, mas a cada 1–1,5 metro (ou a cada 100–150 LEDs), com fios separados vindos da fonte. Isso se chama injeção de alimentação. Nesses fios, use pelo menos 0,75 mm² para 5 ampères e 1,5 mm² para 10 ampères; ligue a linha de dados apenas no início da fita.
Esquema de ligação: fonte de 5 V, fita e placa
| Ligação | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| DIN da fita (dados) | D6 (através de 330 Ω) | GPIO 13 (através de 330 Ω) | GP0 (através de 330 Ω) |
| 5V da fita | +5 V da fonte | +5 V da fonte | +5 V da fonte |
| GND da fita | GND da fonte + GND do Uno | GND da fonte + GND do ESP32 | GND da fonte + GND do Pico |
| Botão | D2 e GND | GPIO 4 e GND | GP15 e GND |
| Capacitor de 1000 µF | 5V–GND na entrada da fita | 5V–GND na entrada da fita | 5V–GND na entrada da fita |
| Alimentação da placa (versão final) | Pino 5V ou USB | Pino 5V (VIN) ou USB | VSYS (através de um diodo Schottky) ou USB |
- Encontre as setas na fita e solde um fio na ponta de onde a seta parte (DIN). Se você enviar os dados pela ponta oposta, a DOUT, nenhum LED vai acender.
- Ligue a saída +5 V da fonte à ponta 5V da fita (em algumas fitas aparece como +5V ou VCC) e o GND da fonte à ponta GND da fita.
- Ligue o capacitor de 1000 µF entre 5V e GND na entrada da fita; a perna longa (positivo) vai no 5V e a perna do lado da faixa marcada no corpo (negativo) vai no GND.
- Ligue o pino GND da placa ao GND da fonte. Sem um GND comum, o sinal de dados fica sem referência.
- Ligue o pino de dados da placa (D6 no Uno) à ponta DIN da fita através do resistor de 330 Ω; colocar o resistor perto da fita dá melhores resultados.
- Ligue uma perna do botão ao D2 e a outra ao GND; o resistor de pull-up interno será ativado no código.
- Se você usar mais de 150 LEDs, puxe também fios separados de 5V e GND da fonte até o meio e o final da fita.
- Durante o desenvolvimento, alimente a placa pela USB e a fita pela fonte. Quando o projeto estiver pronto, você pode ligar os 5 V da fonte ao pino 5V do Uno; nesse caso, não conecte o cabo USB ao mesmo tempo.
Código para Arduino Uno (FastLED): três efeitos e troca de modo por botão
Abra o Gerenciador de Bibliotecas na Arduino IDE e instale a biblioteca buscando por FastLED; para um passo a passo detalhado, veja Como instalar biblioteca no Arduino. O programa abaixo inclui os efeitos de arco-íris, neve caindo e pisca-pisca de estrelas; cada toque no botão passa para o próximo efeito. Como o código usa millis() em vez de delay(), o botão é detectado a qualquer momento enquanto um efeito está rodando. A lógica desse método está no post millis vs delay.
1#include <FastLED.h>
2
3#define LED_PIN 6 // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN 2 // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS 100 // şeritteki LED sayısı / number of LEDs on the strip
6#define BRIGHTNESS 120 // genel parlaklık 0-255 / global brightness 0-255
7#define MAX_MA 3200 // 4 A adaptörün %80'i / 80% of a 4 A supply
8
9CRGB leds[NUM_LEDS];
10
11const uint8_t MODE_COUNT = 3; // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
12const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30}; // kare süreleri (ms) / frame times (ms)
13const CRGB XMAS[4] = {CRGB::Red, CRGB::Green, CRGB::Gold, CRGB::White};
14
15uint8_t mode = 0;
16uint8_t hue = 0;
17
18void setup() {
19 pinMode(BUTTON_PIN, INPUT_PULLUP);
20 FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
21 FastLED.setMaxPowerInVoltsAndMilliamps(5, MAX_MA); // akım sınırı / current limit
22 FastLED.setBrightness(BRIGHTNESS);
23 FastLED.clear(true); // açılışta hepsini söndür / all off at start
24}
25
26void checkButton() {
27 static bool lastState = HIGH;
28 static unsigned long lastChange = 0;
29 bool state = digitalRead(BUTTON_PIN);
30 if (state != lastState && millis() - lastChange > 50) { // 50 ms zıplama filtresi / 50 ms debounce
31 lastChange = millis();
32 lastState = state;
33 if (state == LOW) { // basıldı / pressed
34 mode = (mode + 1) % MODE_COUNT;
35 FastLED.clear();
36 }
37 }
38}
39
40void rainbow() {
41 fill_rainbow(leds, NUM_LEDS, hue, 3); // her LED'de ton 3 artar / hue +3 per LED
42 hue += 2; // renkler döner / colours rotate
43}
44
45void snowfall() {
46 for (int i = 0; i < NUM_LEDS - 1; i++) {
47 leds[i] = leds[i + 1]; // bir LED aşağı kaydır / shift one LED down
48 }
49 if (random8() < 38) {
50 leds[NUM_LEDS - 1] = CRGB::White; // tepede yeni kar tanesi / new flake at the top
51 } else {
52 leds[NUM_LEDS - 1] = CRGB(0, 0, 24); // koyu mavi gece / dark blue night
53 }
54}
55
56void twinkle() {
57 fadeToBlackBy(leds, NUM_LEDS, 20); // hepsini biraz kıs / dim everything a little
58 if (random8() < 80) {
59 leds[random16(NUM_LEDS)] = XMAS[random8(4)]; // rastgele yıldız / random star
60 }
61}
62
63void loop() {
64 checkButton();
65 static unsigned long lastFrame = 0;
66 if (millis() - lastFrame >= FRAME_MS[mode]) {
67 lastFrame = millis();
68 if (mode == 0) rainbow();
69 else if (mode == 1) snowfall();
70 else twinkle();
71 FastLED.show(); // renkleri şeride gönder / push colours to the strip
72 }
73}| Linha / configuração | Para que serve |
|---|---|
| NUM_LEDS (número de LEDs) | O número de LEDs da fita; se estiver errado, parte da fita fica apagada ou os efeitos ficam deslocados. |
| BRIGHTNESS (brilho) | Brilho geral (0–255). Por volta de 120 já é brilhante o suficiente para uma árvore e seguro em termos de corrente e calor. |
| setMaxPowerInVoltsAndMilliamps(5, MAX_MA) (limite de corrente) | A FastLED estima a corrente consumida em cada quadro e reduz o brilho automaticamente se o limite for ultrapassado. |
| addLeds<WS2812B, LED_PIN, GRB> (configuração da fita) | Define o tipo de fita, o pino de dados e a ordem das cores; no WS2812B, a ordem é GRB. |
| FRAME_MS (tempo de quadro) | O tempo de quadro de cada efeito (ms); um valor menor significa uma animação mais rápida. |
| checkButton() (leitura do botão) | Lê o botão com um filtro de debounce de 50 ms e avança o modo a cada toque. |
| FastLED.show() (envio para a fita) | Envia as cores da memória para a fita; se não for chamada, nenhuma mudança aparece. |
Como os efeitos funcionam?
Arco-íris: a função fill_rainbow começa pela matiz dada ao primeiro LED e aumenta a matiz em 3 passos a cada LED. Na FastLED, a matiz vai de 0 a 255; com 100 LEDs, a matiz avança 300 passos no total, então você vê um pouco mais de um círculo de cores completo ao longo da fita. Como aumentamos a variável hue em 2 a cada quadro, as cores giram devagar em volta da árvore. Se quiser faixas de cor mais largas, use 1 ou 2 em vez de 3.
Neve caindo: quando a fita é enrolada na árvore de baixo para cima, o primeiro LED fica embaixo e o último LED fica no topo. A cada quadro, deslocamos todas as cores um LED para baixo e adicionamos no topo um floco de neve branco ou um pixel azul-escuro de noite. Como random8() gera um número de 0 a 255, a chance de sair menor que 38 é de cerca de 15%; aumente esse número e a neve fica mais densa. Com um tempo de quadro de 60 ms, um floco leva 6 segundos para descer 100 LEDs. Pisca-pisca (estrelas): fadeToBlackBy reduz o brilho de todos os LEDs em cerca de 8% a cada quadro; ao mesmo tempo, um LED escolhido ao acaso acende no brilho máximo em vermelho, verde, dourado ou branco. O resultado é um brilho que lembra os pisca-piscas de Natal antigos, mas muito mais vivo.
Árvore de Natal com ESP32 (Adafruit NeoPixel)
A FastLED também funciona no ESP32, mas aqui escrevemos o mesmo projeto com a biblioteca Adafruit NeoPixel, para você conhecer as duas bibliotecas populares. A versão atual da biblioteca compila com o mesmo código nas versões 2.x e 3.x do core do Arduino para ESP32 e gera o sinal com a unidade de hardware RMT. Como na Adafruit NeoPixel as cores reduzidas com setBrightness podem ficar distorcidas ao serem lidas de volta, calculamos os efeitos no nosso próprio array de brilho (level) e os reescrevemos na fita do zero a cada quadro. O pino de dados é o GPIO 13 e o botão é o GPIO 4. Se mais tarde você quiser controlar a árvore pelo celular, o post sobre instalação do WLED oferece uma interface pronta.
1#include <Adafruit_NeoPixel.h>
2
3#define LED_PIN 13 // şeridin DIN girişi (330 ohm üzerinden) / strip DIN input (via 330 ohm)
4#define BUTTON_PIN 4 // buton, diğer bacak GND / button, other leg to GND
5#define NUM_LEDS 100 // şeritteki LED sayısı / number of LEDs on the strip
6
7Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
8
9const uint8_t MODE_COUNT = 3; // 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
10const uint16_t FRAME_MS[MODE_COUNT] = {20, 60, 30}; // kare süreleri (ms) / frame times (ms)
11const uint8_t PALETTE[4][3] = {{255, 0, 0}, {0, 255, 0}, {255, 160, 0}, {255, 255, 255}};
12
13uint8_t level[NUM_LEDS]; // LED başına parlaklık / per-LED level
14uint8_t colorIdx[NUM_LEDS]; // yıldız rengi / star colour index
15uint8_t mode = 0;
16uint16_t hue = 0;
17
18void setup() {
19 pinMode(BUTTON_PIN, INPUT_PULLUP);
20 strip.begin();
21 strip.setBrightness(110); // genel parlaklık / global brightness
22 strip.clear();
23 strip.show();
24}
25
26void checkButton() {
27 static bool lastState = HIGH;
28 static unsigned long lastChange = 0;
29 bool state = digitalRead(BUTTON_PIN);
30 if (state != lastState && millis() - lastChange > 50) { // 50 ms zıplama filtresi / 50 ms debounce
31 lastChange = millis();
32 lastState = state;
33 if (state == LOW) { // basıldı / pressed
34 mode = (mode + 1) % MODE_COUNT;
35 memset(level, 0, sizeof(level)); // efekt belleğini sıfırla / reset effect buffer
36 strip.clear();
37 }
38 }
39}
40
41void rainbow() {
42 for (int i = 0; i < NUM_LEDS; i++) {
43 uint16_t h = hue + (uint32_t)i * 65536UL / NUM_LEDS; // LED'e göre ton / hue per LED
44 strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(h)));
45 }
46 hue += 256; // renkler döner / colours rotate
47}
48
49void snowfall() {
50 for (int i = 0; i < NUM_LEDS - 1; i++) level[i] = level[i + 1]; // bir LED aşağı kaydır / shift one LED down
51 level[NUM_LEDS - 1] = (random(100) < 15) ? 255 : 0; // tepede yeni kar / new flake on top
52 for (int i = 0; i < NUM_LEDS; i++) {
53 if (level[i]) strip.setPixelColor(i, 255, 255, 255); // kar tanesi / snowflake
54 else strip.setPixelColor(i, 0, 0, 24); // koyu mavi gece / dark blue night
55 }
56}
57
58void twinkle() {
59 for (int i = 0; i < NUM_LEDS; i++) {
60 level[i] = (level[i] > 12) ? level[i] - 12 : 0; // yavaşça sön / fade out
61 }
62 if (random(100) < 30) {
63 int p = random(NUM_LEDS);
64 level[p] = 255; // yeni yıldız / new star
65 colorIdx[p] = random(4);
66 }
67 for (int i = 0; i < NUM_LEDS; i++) {
68 const uint8_t *c = PALETTE[colorIdx[i]];
69 strip.setPixelColor(i, c[0] * level[i] / 255, c[1] * level[i] / 255, c[2] * level[i] / 255);
70 }
71}
72
73void loop() {
74 checkButton();
75 static unsigned long lastFrame = 0;
76 if (millis() - lastFrame >= FRAME_MS[mode]) {
77 lastFrame = millis();
78 if (mode == 0) rainbow();
79 else if (mode == 1) snowfall();
80 else twinkle();
81 strip.show(); // renkleri şeride gönder / push colours to the strip
82 }
83}Árvore de Natal com Raspberry Pi Pico e MicroPython
O módulo neopixel já vem embutido no MicroPython do Raspberry Pi Pico; você não precisa instalar nada a mais. Como o módulo cuida sozinho da temporização precisa do WS2812B, você pode usar qualquer pino GP; abaixo, os dados vão no GP0 e o botão no GP15. Como o MicroPython não tem uma configuração de brilho geral, nós mesmos reduzimos as cores com o fator BRIGHT. Como o Python roda mais devagar que o C++, os efeitos ficam fluidos com 100 LEDs; acima de 300 LEDs, os tempos de quadro podem aumentar. Se você está começando no MicroPython, pode começar pelo post fundamentos do MicroPython.
1from machine import Pin
2import neopixel, time, random
3
4NUM_LEDS = 100
5BRIGHT = 0.4 # 0-1 parlaklık / brightness
6np = neopixel.NeoPixel(Pin(0), NUM_LEDS) # veri GP0 / data on GP0
7button = Pin(15, Pin.IN, Pin.PULL_UP) # buton GP15-GND / button GP15-GND
8
9mode = 0
10MODE_COUNT = 3 # 0 gökkuşağı, 1 kar, 2 yıldız / 0 rainbow, 1 snow, 2 twinkle
11FRAME_MS = (20, 60, 30) # kare süreleri / frame times
12level = [0] * NUM_LEDS # LED başına parlaklık / per-LED level
13color_idx = [0] * NUM_LEDS # yıldız rengi / star colour index
14PALETTE = ((255, 0, 0), (0, 255, 0), (255, 160, 0), (255, 255, 255))
15hue = 0
16
17def scale(r, g, b):
18 return (int(r * BRIGHT), int(g * BRIGHT), int(b * BRIGHT))
19
20def wheel(pos):
21 # 0-255 -> gökkuşağı rengi / rainbow colour
22 pos = pos & 255
23 if pos < 85:
24 return (255 - pos * 3, pos * 3, 0)
25 if pos < 170:
26 pos -= 85
27 return (0, 255 - pos * 3, pos * 3)
28 pos -= 170
29 return (pos * 3, 0, 255 - pos * 3)
30
31def rainbow():
32 global hue
33 for i in range(NUM_LEDS):
34 np[i] = scale(*wheel(hue + i * 256 // NUM_LEDS))
35 hue = (hue + 2) & 255 # renkler döner / colours rotate
36
37def snowfall():
38 for i in range(NUM_LEDS - 1):
39 level[i] = level[i + 1] # bir LED aşağı kaydır / shift one LED down
40 level[-1] = 255 if random.randint(0, 99) < 15 else 0
41 for i in range(NUM_LEDS):
42 np[i] = scale(255, 255, 255) if level[i] else scale(0, 0, 24)
43
44def twinkle():
45 for i in range(NUM_LEDS):
46 level[i] = level[i] - 12 if level[i] > 12 else 0 # yavaşça sön / fade out
47 if random.randint(0, 99) < 30:
48 p = random.randint(0, NUM_LEDS - 1)
49 level[p] = 255 # yeni yıldız / new star
50 color_idx[p] = random.randint(0, 3)
51 for i in range(NUM_LEDS):
52 r, g, b = PALETTE[color_idx[i]]
53 k = level[i] * BRIGHT / 255
54 np[i] = (int(r * k), int(g * k), int(b * k))
55
56effects = (rainbow, snowfall, twinkle)
57last_btn = 1
58last_change = time.ticks_ms()
59last_frame = time.ticks_ms()
60
61while True:
62 now = time.ticks_ms()
63 state = button.value()
64 if state != last_btn and time.ticks_diff(now, last_change) > 50: # zıplama filtresi / debounce
65 last_change = now
66 last_btn = state
67 if state == 0: # basıldı / pressed
68 mode = (mode + 1) % MODE_COUNT
69 for i in range(NUM_LEDS):
70 level[i] = 0
71 if time.ticks_diff(now, last_frame) >= FRAME_MS[mode]:
72 last_frame = now
73 effects[mode]()
74 np.write() # şeride gönder / push to the stripComo instalar a fita na árvore e segurança
- Comece por baixo: deixe a ponta DIN da fita na base da árvore, ao lado da caixa de controle, e enrole a fita para cima em espiral. Assim o efeito de neve flui de cima para baixo e o fio de dados fica curto.
- Espaçamento da espiral: em uma árvore de 1,8 m, enrolar com espaçamento de 20–25 cm distribui uma fita de 5 m de forma equilibrada pelos galhos; como o diâmetro das voltas diminui em direção ao topo, você pode reduzir um pouco o espaçamento.
- Fitas verticais: você também pode dispor a fita em zigue-zague, de cima para baixo e de baixo para cima. Nesse arranjo, a direção do efeito de neve se inverte a cada segunda fita, então é preciso fazer um pequeno ajuste que calcule a ordem dos LEDs a partir do número da fita.
- Calor: a fita WS2812B esquenta com brilho alto; não a pressione com força contra enfeites de papel ou galhos secos. Manter o brilho em torno de 100–150 reduz tanto o calor quanto a corrente.
- Segurança da fonte: não monte seu próprio circuito no lado de 220 V; use uma fonte de 5 V pronta, com gabinete fechado e selo CE. Mantenha a caixa de controle longe da água e da rega de vasos, e desligue a árvore quando sair de casa.
- Fusível: em sistemas acima de 5 A, adicionar um fusível de lâmina de valor adequado na saída da fonte é uma boa precaução contra um possível curto-circuito.
Ideias de projetos para a árvore de Natal
- Árvore que reage à música: acenda as luzes no ritmo da música com um microfone; os detalhes estão no post LED que reage à música.
- Contagem regressiva de Ano-Novo: mostre em um display o tempo que falta até a meia-noite e inicie um efeito de fogos de artifício na árvore às 00:00; confira o post contador regressivo de Ano-Novo.
- Árvore que liga sozinha: acenda as luzes automaticamente quando escurecer com um sensor de luz LDR.
- Árvore que brilha quando você chega perto: aumente o brilho com um sensor de movimento PIR quando alguém entrar na sala e reduza quando a sala estiver vazia.
- Controle pelo celular: crie uma página web com o ESP32 e escolha efeitos e cores pelo celular; o post sobre servidor web com ESP32 é um bom ponto de partida.
- Display de estrela no topo: coloque uma pequena matriz de LED WS2812B no topo da árvore e rode uma animação de estrela ou floco de neve.
Erros comuns e como corrigir
| Sintoma | Causa provável | Solução |
|---|---|---|
| Nenhum LED acende | Dados ligados na ponta DOUT ou GND não comum | Confira a direção da seta e ligue na ponta DIN, una os GNDs da placa e da fonte |
| Primeiros LEDs piscam, cores aleatórias | Sinal de dados fraco, nível de 3,3 V, fio de dados longo | Aproxime o resistor de 330 Ω da fita, encurte o fio de dados, use um 74AHCT125 |
| Cores erradas (verde no lugar de vermelho) | Ordem de cores errada | Use GRB na FastLED e NEO_GRB na NeoPixel; algumas fitas usam a ordem RGB |
| Final da fita amarelado e apagado | Queda de tensão | Faça injeção de alimentação no meio e no final, use fio mais grosso |
| Placa reinicia quando passa para o branco | Fonte insuficiente, consumo repentino de corrente | Use uma fonte maior, reduza o limite MAX_MA, adicione o capacitor de 1000 µF |
| Botão pula dois modos em um toque | Repique do botão | Aumente o tempo de debounce de 50 ms para 80 ms, mantenha os fios do botão curtos |
| Efeitos lentos no Pico | LEDs demais e cálculos em Python | Reduza NUM_LEDS, aumente o tempo de quadro ou passe para C++ na Arduino IDE |
Com alguns metros de fita LED, um único botão e uma fonte de 5 V bem dimensionada, sua árvore de Natal vira um show de luzes programável, que pode ganhar novos efeitos todo ano. Você pode criar seus próprios efeitos brincando com paletas de cores e tempos de quadro e, para qualquer dúvida sobre alimentação e ligações, voltar ao guia de alimentação do Arduino. No app BlueGrays, você encontra projetos de LED sequencial com WS2812B, efeito Knight Rider, luzes de polícia e animações, além do controle de fita NeoPixel com ESP32, com esquemas do circuito e código passo a passo.
Perguntas frequentes
Quantos LEDs preciso para uma árvore de Natal?
Para uma árvore de 1,5–1,8 m de altura, 150–300 LEDs, ou seja, 5 m de fita com 30 LEDs/m ou 2,5–5 m de fita com 60 LEDs/m, dão um visual cheio e vivo. Funciona com menos LEDs também, mas os efeitos ficam espaçados. À medida que o número de LEDs aumenta, você também precisa considerar a corrente da fonte e a RAM da placa (3 bytes por LED).
De quantos ampères deve ser a fonte para uma fita LED WS2812B?
Cada LED consome cerca de 60 mA no branco total; para 100 LEDs, o pior caso é 6 A. Nos efeitos coloridos, a corrente real fica em torno de um terço disso, então uma fonte de 5 V 4 A basta para 100 LEDs, desde que você limite a corrente a 3200 mA com a função setMaxPowerInVoltsAndMilliamps da FastLED. Se for usar branco total por longos períodos, escolha a fonte pelo pior caso.
A fita WS2812B funciona com 12 V?
Não, o WS2812B é uma fita de 5 V e ligar 12 V queima os LEDs na hora. Se você quer uma fita endereçável que funcione com 12 V, escolha o tipo WS2811 ou WS2815. Se quiser usar uma fonte de 12 V que já tem para uma fita pequena, dá para obter 5 V com um conversor abaixador como o LM2596, mas esses módulos são limitados a cerca de 2–3 A.
Devo usar FastLED ou Adafruit NeoPixel?
As duas controlam o WS2812B sem problemas. A FastLED facilita a criação de efeitos com funções prontas de arco-íris, paleta de cores, redução de brilho e limitação de corrente, e costuma ser mais rápida. A Adafruit NeoPixel oferece uma API mais simples; se você está começando, um bom caminho é começar por uma e depois experimentar a outra.
Quantos LEDs WS2812B um Arduino Uno consegue controlar no máximo?
A RAM e a velocidade definem o limite. Como cada LED ocupa 3 bytes dos 2 KB de RAM do Uno, na prática há um limite de cerca de 500 LEDs, contando as outras variáveis. Além disso, como enviar dados para cada LED leva 30 µs, um único quadro com 1.000 LEDs chega a 30 ms. No ESP32 e no Pico, com bastante RAM, milhares de LEDs são possíveis; o limite real passa a ser a fonte de alimentação.
Por que o final da minha fita LED fica amarelado ou fraco?
Isso é sinal de queda de tensão. As finas trilhas de cobre da fita perdem tensão à medida que a corrente aumenta; abaixo de 4 V, os LEDs do final produzem azul e verde fracos, e o branco puxa para o amarelo. Você resolve puxando fios separados de 5V e GND da fonte até o meio e o final da fita e reduzindo um pouco o brilho.
Projetos para montar depois desta leitura
Ver todos os projetos
Uso da fita LED WS2812B
Conheça uma fita LED inteligente em que você pode definir a cor de cada luz individualmente. O Arduino primeiro acende os cinco primeiros LEDs em vermelho, um segundo depois acende os outros cinco em

Luzes de polícia com WS2812B
Traga as luzes vermelhas e azuis do teto de uma viatura para a sua mesa. Metade de uma fita WS2812B de dez LEDs pisca em vermelho três vezes seguidas rapidamente, depois a outra metade pisca em azul t

LED sequencial com WS2812B
Em uma fita de dez LEDs, um ponto de luz verde avança do início ao fim, um LED por vez, e depois volta ao começo; ele permanece em cada LED por um terço de segundo. Na fita WS2812B, você controla cada

LED sequencial com WS2812B (efeito de preenchimento)
Uma fita de luz que enche e esvazia como um copo de água. O Arduino acende dez LEDs coloridos em laranja, um por vez, e os mantém acesos; quando a fita está cheia, apaga um por vez na mesma ordem, e o

Efeito Super Máquina com WS2812B
Um ponto de luz vermelho desliza de uma ponta à outra de uma fita LED inteligente e volta, indo e vindo sem parar. A cada passo, o Arduino acende apenas um LED, espera um décimo de segundo e passa ao

Animação 1 com WS2812B
Em uma fita de 56 LEDs, todas as cores do arco-íris ficam lado a lado e fluem sem parar, como se um rio de luz deslizasse pela fita. Cada LED brilha em uma cor um pouco diferente da do anterior, e o m

Animação 2 com WS2812B
Monte no seu quarto um espetáculo de luzes que muda de cor sozinho. O Arduino mantém as cores em movimento em uma fita de 30 LEDs e troca o conjunto de cores a cada poucos segundos: arco-íris, faixas

Controle de fita WS2812B NeoPixel com ESP32
Os LEDs endereçáveis WS2812B (NeoPixel) são LEDs RGB inteligentes que podem ser controlados em cadeia por um único pino de dados. Neste projeto, vamos controlar uma fita WS2812B de 8 LEDs com a biblioteca Adafruit_NeoPixel para criar uma animação suave de arco-íris. Embora o nível lógico de 3,3V do ESP32 funcione sem problemas na maioria dos lotes de WS2812B, vamos mostrar uma solução com um resistor de 470Ω em série e um capacitor de 1.000µF para casos de instabilidade.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

