#include <Adafruit_NeoPixel.h>
#define PIN 25
#define NUM_PIXELS 16
#define BOTAO_LIGAR 19 // Pino do botão para ligar o carrossel
#define BOTAO_DESLIGAR 18 // Pino do botão para desligar o carrossel
// Parâmetro 1 = número de pixels no strip
// Parâmetro 2 = número do pino do Arduino (a maioria é válida)
// Parâmetro 3 = flags do tipo de pixel, somar conforme necessário:
// NEO_KHZ800 800 KHz bitstream (a maioria dos produtos NeoPixel com LEDs WS2812)
// NEO_KHZ400 400 KHz (pixels clássicos 'v1' (não v2) FLORA, drivers WS2811)
// NEO_GRB Pixels são conectados para bitstream GRB (a maioria dos produtos NeoPixel)
// NEO_RGB Pixels são conectados para bitstream RGB (pixels v1 FLORA, não v2)
// NEO_RGBW Pixels são conectados para bitstream RGBW (produtos NeoPixel RGBW)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800);
// IMPORTANTE: Para reduzir o risco de queima do NeoPixel, adicione um capacitor de 1000 uF nos
// terminais de alimentação dos pixels, adicione um resistor de 300 - 500 Ohm na entrada de dados do primeiro pixel
// e minimize a distância entre o Arduino e o primeiro pixel. Evite conectar
// em um circuito ativo... se necessário, conecte o GND primeiro.
unsigned long ultimoTempo = 0;
int ciclo = 0;
int deslocamento = 0;
bool estadoPixel = true;
uint16_t pixelAtual = 0;
bool estadoBotaoLigar = false;
bool estadoBotaoDesligar = false;
bool botaoLigarTransicao = false; // Variável booleana para a transição do botão ligar
bool botaoDesligarTransicao = false; // Variável booleana para a transição do botão desligar
uint32_t corAtual = strip.Color(0, 0, 0); // Inicialmente desligado
void setup()
{
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(500);
pinMode(BOTAO_LIGAR, INPUT_PULLUP);
pinMode(BOTAO_DESLIGAR, INPUT_PULLUP);
strip.begin();
strip.setBrightness(255); // Configura o brilho máximo
strip.show(); // Inicializa todos os pixels como 'desligado'
}
void loop()
{
// Verifica o estado dos botões
bool botaoLigarPressionado = (digitalRead(BOTAO_LIGAR) == LOW);
bool botaoDesligarPressionado = (digitalRead(BOTAO_DESLIGAR) == LOW);
// Variáveis de alto nível para a transição dos botões
bool apertandoBotaoLigar = botaoLigarPressionado && !estadoBotaoLigar;
bool soltandoBotaoLigar = !botaoLigarPressionado && estadoBotaoLigar;
bool apertandoBotaoDesligar = botaoDesligarPressionado && !estadoBotaoDesligar;
bool soltandoBotaoDesligar = !botaoDesligarPressionado && estadoBotaoDesligar;
// Atualiza a transição do botão de ligar
if (apertandoBotaoLigar) {
botaoLigarTransicao = true; // Botão foi pressionado recentemente
estadoBotaoLigar = true;
corAtual = strip.Color(255, 215, 0); // Cor de ouro para ligar
reiniciarCarrossel();
} else if (soltandoBotaoLigar) {
estadoBotaoLigar = false;
}
// Atualiza a transição do botão de desligar
if (apertandoBotaoDesligar) {
botaoDesligarTransicao = true; // Botão foi pressionado recentemente
estadoBotaoDesligar = true;
corAtual = strip.Color(0, 0, 0); // Preto para desligar
} else if (soltandoBotaoDesligar) {
estadoBotaoDesligar = false;
}
// Reseta a transição após o estado ser processado
if (!botaoLigarPressionado) {
botaoLigarTransicao = false;
}
if (!botaoDesligarPressionado) {
botaoDesligarTransicao = false;
}
// Temporização fora da função executarCarrossel
unsigned long tempoAtual = millis();
if (tempoAtual - ultimoTempo >= 50) { // 50ms como exemplo de temporização
ultimoTempo = tempoAtual;
executarCarrossel(corAtual);
}
}
void executarCarrossel(uint32_t cor) {
if (estadoPixel) {
for (pixelAtual = 0; pixelAtual < strip.numPixels(); pixelAtual = pixelAtual + 3) {
strip.setPixelColor(pixelAtual + deslocamento, cor); // Liga a cada terceiro pixel
}
} else {
for (pixelAtual = 0; pixelAtual < strip.numPixels(); pixelAtual = pixelAtual + 3) {
strip.setPixelColor(pixelAtual + deslocamento, 0); // Desliga a cada terceiro pixel
}
deslocamento++;
if (deslocamento >= 3) {
deslocamento = 0;
ciclo++;
if (ciclo >= 10) {
ciclo = 0;
}
}
}
strip.show();
estadoPixel = !estadoPixel;
}
void reiniciarCarrossel() {
ciclo = 0;
deslocamento = 0;
estadoPixel = true;
pixelAtual = 0;
ultimoTempo = millis();
}