Boomerang LED (Vai e Vem)
Este projeto implementa o clássico efeito de Scanner de LED (frequentemente associado ao carro K.I.T.T. da série Supermáquina/Knight Rider ou aos Cylons de Battlestar Galactica). O feixe de luz vai de uma ponta à outra da fita de LEDs e retorna, deixando um rastro de brilho suave (cauda) atrás dele.
É um efeito altamente visual e simples de implementar em fitas de LED endereçáveis WS2812B (NeoPixels) utilizando microcontroladores como Arduino.
🛠️ Como Funciona?
O projeto utiliza a biblioteca EasyNeoPixels.h para abstrair a comunicação com a fita.
A suavidade do movimento e o comprimento da cauda de luz são controlados por parâmetros lógicos no início do código. O decaimento de brilho é calculado usando deslocamento de bits (brightness >> t) para obter excelente performance mesmo em microcontroladores de 8 bits.
📐 Configurações e Parâmetros
#define PIN 6 // Pino de dados conectado à fita de LEDs
#define LEN 10 // Quantidade total de LEDs na fita
#define TAIL 3 // Comprimento da cauda de rastro do LED
#define DELAY 50 // Velocidade da transição (em milissegundos)
💻 Implementação do Algoritmo
Abaixo está o código completo em C++ para carregar no seu Arduino:
#include <EasyNeoPixels.h>
#define PIN 6
#define LEN 10
#define TAIL 3
#define DELAY 50
void setup() {
setupEasyNeoPixels(PIN, LEN);
}
void loop() {
// Movimento de Ida (Forward)
for (int i = 0; i < LEN; i++) {
writeEasyNeoPixel(i, 255, 0, 0); // Liga o LED atual com brilho máximo (Vermelho)
// Gera a cauda esmaecendo os LEDs anteriores
for (int t = 1; t <= TAIL; t++) {
if (i - t >= 0) {
writeEasyNeoPixel(i - t, 255 >> t, 0, 0); // Reduz o brilho (shift right)
}
}
// Desliga o LED que saiu do alcance da cauda
if (i - TAIL - 1 >= 0) {
writeEasyNeoPixel(i - TAIL - 1, 0, 0, 0);
}
delay(DELAY);
}
// Movimento de Volta (Backward)
for (int i = LEN - 1; i >= 0; i--) {
writeEasyNeoPixel(i, 255, 0, 0);
for (int t = 1; t <= TAIL; t++) {
if (i + t < LEN) {
writeEasyNeoPixel(i + t, 255 >> t, 0, 0);
}
}
if (i + TAIL + 1 < LEN) {
writeEasyNeoPixel(i + TAIL + 1, 0, 0, 0);
}
delay(DELAY);
}
}
