#include <Adafruit_NeoPixel.h>
// Pin definitions
#define LEFT_PIN 1
#define RIGHT_PIN 2
#define SIGNAL_RIGHT 3
#define SIGNAL_LEFT 4
#define SIGNAL_WHITE 6
#define SIGNAL_RAINBOW 7
#define SIGNAL_SPARKLE 11
// LED strip settings
#define NUM_PIXELS 8
Adafruit_NeoPixel leftStrip = Adafruit_NeoPixel(NUM_PIXELS, LEFT_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel rightStrip = Adafruit_NeoPixel(NUM_PIXELS, RIGHT_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
leftStrip.begin();
rightStrip.begin();
leftStrip.show(); // Initialize all pixels to 'off'
rightStrip.show();
// Welcome effect on power-up
welcomeEffect();
}
void loop() {
if (digitalRead(SIGNAL_RIGHT) == HIGH) {
rightFlowEffect();
}
if (digitalRead(SIGNAL_LEFT) == HIGH) {
leftFlowEffect();
}
if (digitalRead(SIGNAL_RIGHT) == HIGH && digitalRead(SIGNAL_LEFT) == HIGH) {
hazardMode();
}
if (digitalRead(SIGNAL_WHITE) == HIGH) {
whiteEffect();
}
if (digitalRead(SIGNAL_RAINBOW) == HIGH) {
rainbowEffect();
}
if (digitalRead(SIGNAL_SPARKLE) == HIGH) {
hyperSparkle();
}
}
// Welcome effect: 3-time orange flow from center
void welcomeEffect() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < NUM_PIXELS; j++) {
leftStrip.setPixelColor(j, leftStrip.Color(255, 165, 0)); // Orange
rightStrip.setPixelColor(j, rightStrip.Color(255, 165, 0)); // Orange
leftStrip.show();
rightStrip.show();
delay(100);
}
clearStrip(leftStrip);
clearStrip(rightStrip);
delay(200); // Pause between flows
}
}
// Right flow effect with pause
void rightFlowEffect() {
for (int i = 0; i < NUM_PIXELS; i++) {
rightStrip.setPixelColor(i, rightStrip.Color(255, 165, 0)); // Orange
rightStrip.show();
delay(100);
}
clearStrip(rightStrip);
delay(300); // Pause after flow completes
}
// Left flow effect with pause
void leftFlowEffect() {
for (int i = 0; i < NUM_PIXELS; i++) {
leftStrip.setPixelColor(i, leftStrip.Color(255, 165, 0)); // Orange
leftStrip.show();
delay(100);
}
clearStrip(leftStrip);
delay(300); // Pause after flow completes
}
// Hazard mode (both strips together)
void hazardMode() {
for (int i = 0; i < NUM_PIXELS; i++) {
leftStrip.setPixelColor(i, leftStrip.Color(255, 165, 0)); // Orange
rightStrip.setPixelColor(i, rightStrip.Color(255, 165, 0)); // Orange
}
leftStrip.show();
rightStrip.show();
delay(100);
clearStrip(leftStrip);
clearStrip(rightStrip);
delay(300); // Pause after each hazard cycle
}
// White effect
void whiteEffect() {
for (int i = 0; i < NUM_PIXELS; i++) {
leftStrip.setPixelColor(i, leftStrip.Color(255, 255, 255)); // White
rightStrip.setPixelColor(i, rightStrip.Color(255, 255, 255)); // White
}
leftStrip.show();
rightStrip.show();
delay(100);
clearStrip(leftStrip);
clearStrip(rightStrip);
}
// Rainbow effect from center
void rainbowEffect() {
for (int i = 0; i < NUM_PIXELS; i++) {
uint32_t color = Wheel((i * 256 / NUM_PIXELS) & 255);
leftStrip.setPixelColor(i, color);
rightStrip.setPixelColor(i, color);
}
leftStrip.show();
rightStrip.show();
delay(50);
}
// Hyper Sparkle effect
void hyperSparkle() {
for (int i = 0; i < 20; i++) {
int pixel = random(NUM_PIXELS);
leftStrip.setPixelColor(pixel, leftStrip.Color(255, 255, 255)); // Sparkle white
rightStrip.setPixelColor(pixel, rightStrip.Color(255, 255, 255)); // Sparkle white
leftStrip.show();
rightStrip.show();
delay(50);
clearStrip(leftStrip);
clearStrip(rightStrip);
}
}
// Clear strip
void clearStrip(Adafruit_NeoPixel &strip) {
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, 0);
}
strip.show();
}
// Wheel function for rainbow effect
uint32_t Wheel(byte WheelPos) {
if (WheelPos < 85) {
return leftStrip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return leftStrip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return leftStrip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}