Semáforo com Arduino e Led Endereçável WS2812B RGB
Projetos de semáforo com Arduino são bastante comuns. A maioria usa leds convencionais para a montagem do projeto. Hoje eu vou mostrar um semáforo um pouco diferente, e que utiliza led endereçável WS2812B RGB.

Mas o que são leds endereçáveis?
O led endereçável WS2812B RGB
Os leds enderecáveis são dispositivos que reúnem em um mesmo componente um led RGB e o controlador WS2812B (datasheet), permitindo que cada led seja acessado individualmente. Cada led endereçável tem 6 pinos, sendo 3 de entrada e 3 de saída.
Abaixo uma ligação básica de um led endereçável utilizando os 3 pinos de entrada: Vcc, GND e dados (Din):

Repare que no lado esquerdo temos o pino Din (entrada), e no lado direito o pino Dout (saída). Esse esquema de ligação é o que permite que você ligue vários leds endereçáveis em um mesmo barramento: o pino Dout de um led vai ligado no Din do led seguinte, formando uma ligação em cascata:

Dessa forma podemos ligar inúmeros leds ao microcontrolador utilizando apenas um fio, respeitando é claro as limitações de tensão e corrente para a quantidade de leds que formos utilizar. Cada led endereçável consome por volta de 60mA em brilho máximo, e recomenda-se o uso de uma fonte de alimentação externa no circuito.
Circuito Arduino e led endereçável WS2812
O nosso sistema de semáforo utilizando leds endereçáveis usa 5 deles: 3 para o semáforo de carros e 2 para o semáforo de pedestres, além de um botão que o pedestre vai pressionar quando quiser atravessar a rua:

O pino de dados dos leds será o pino 6 do Arduino, e para o botão vamos utilizar o pino 2. Lembre-se que o pino Dout de um led vai ligado ao pino Din do led seguinte. Um capacitor de 1000 µF entre os pinos GND e 5V serve como proteção contra variações de tensão que podem danificar os leds.
Programa semáforo com Arduino
Antes de copiar o programa, baixe a biblioteca Neopixel, da Adafruit (download). Descompacte a biblioteca e coloque-a dentro da pasta LIBRARIES da IDE do Arduino.
No inicio do programa definimos o pino de dados dos leds endereçáveis (linha 10), e também o número de leds que estão interligados (linha 15).
Para setar a cor de cada led, utilizamos o comando setPixelColor(), com a informação de qual led será aceso (o número do primeiro led é 0 (zero)), e também as informações RGB que irão acender o led na cor desejada, na seguinte sintaxe:
No inicio do programa definimos o pino de dados dos leds endereçáveis (linha 10), e também o número de leds que estão interligados (linha 15).
Para setar a cor de cada led, utilizamos o comando setPixelColor(), com a informação de qual led será aceso (o número do primeiro led é 0 (zero)), e também as informações RGB que irão acender o led na cor desejada, na seguinte sintaxe:
pixels.setPixelColor(<numero_led>, pixels.Color(R, G, B));
De uma forma bem simplificada, os valores de R, G e B definem a quantidade de luz vermelha, verde e azul serão utilizadas nos leds, formando a cor que desejamos. O vermelho, por exemplo, tem o valor 255 para o R (RED – vermelho), 0 para o verde e 0 para o azul. Usamos a mesma lógica para as outras cores, e você pode encontrar facilmente na internet uma tabela básica com a relação de cores e valor RGB.
//Programa: Semaforo com Arduino e led RGB WS2812B
//Autor: Arduino e Cia
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
//Pino de dados do Neopixel
#define PIN 6
#define PINO_BOTAO 2
//Numero de leds
#define NUMPIXELS 5
Adafruit_NeoPixel pixels=Adafruit_NeoPixel(NUMPIXELS,PIN,NEO_GRB+NEO_KHZ800);
int tempo_pedestre = 5000;
void setup()
{
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(PINO_BOTAO), pedestre, RISING);
pixels.begin();
//Utilize a linha abaixo para modificar o brilho dos leds
pixels.setBrightness(50);
}
void loop()
{
//*** Farol vermelho ***
apaga();
//Acende vermelho carros
pixels.setPixelColor(4, pixels.Color(255, 0, 0));
//Acende verde pedestre
pixels.setPixelColor(0, pixels.Color(0, 255, 0));
pixels.show();
delay(tempo_pedestre);
//Caso o botao tenha sido pressionado, volta ao
//estado anterior (delay de 5000)
if (tempo_pedestre == 10000)
{
tempo_pedestre = 5000;
}
//*** Farol amarelo ***
apaga();
//Acende vermelho pedestres
pixels.setPixelColor(1, pixels.Color(255, 0, 0));
//Acende amarelo pedestre
pixels.setPixelColor(3, pixels.Color(255, 227, 17));
pixels.show();
delay(2000);
//*** Farol verde ***
apaga();
//Acende vermelho pedestres
pixels.setPixelColor(1, pixels.Color(255, 0, 0));
//Acende verde carros
pixels.setPixelColor(2, pixels.Color(0, 255, 0));
pixels.show();
delay(5000);
}
void apaga()
{
//Apaga todos os leds
for (int i = 0; i <= 5 ; i++)
{
pixels.setPixelColor(i, pixels.Color(0, 0, 0));
pixels.show();
}
}
void pedestre()
{
//Aumenta o tempo do farol vermelho
for (int x = 0; x <= 5 ; x++)
{
Serial.println("Travessia de pedestre acionada");
tempo_pedestre = 10000;
}
}
O programa usa a interrupção 0, acionada por meio da porta 2 do Arduino, onde está ligado o botão. Ao ser pressionado, o botão gera uma interrupção, que chama a rotina pedestre(). Essa rotina aumenta o valor da variável tempo_pedestre para 10000, aumentando o tempo que o semáforo fica vermelho.
Gostou? Confira outros posts usando leds endereçáveis aqui mesmo no Arduino e Cia!