#include <Adafruit_NeoPixel.h>
#define PIN_WS2812 2 // WS2812B data pin
#define NUM_PIXELS 16 // Number of pixels in the strip
#define PIN_RIGHT 3 // Pin for right indicator (high priority)
#define PIN_LEFT 4 // Pin for left indicator (high priority)
#define PIN_WHITE 7 // Pin for dynamic white effect
#define PIN_RAINBOW 8 // Pin for rainbow effect with white sparkle
#define PIN_RED 10 // Pin for red light with low brightness
#define PIN_SPARKLE 11 // Pin for Hyper Sparkle effect
#define PIN_AIRPLANE 9 // Pin for airplane light effect
#define PIN_RELAY 12 // Pin for relay signal
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, PIN_WS2812, NEO_GRB + NEO_KHZ800);
// Customizable colors
uint32_t COLOR_ORANGE = strip.Color(255, 100, 0); // Orange
uint32_t COLOR_WHITE = strip.Color(255, 255, 255); // White
uint32_t COLOR_RED = strip.Color(20, 0, 0); // Low brightness red
uint32_t COLOR_GREEN = strip.Color(0, 255, 0); // Green
// Function to send relay signals
void triggerRelay() {
for (int i = 0; i < 2; i++) {
digitalWrite(PIN_RELAY, HIGH);
delay(100); // Signal ON duration
digitalWrite(PIN_RELAY, LOW);
delay(400); // Signal OFF duration
}
}
// Function to turn off all pixels
void clearStrip() {
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, 0);
}
strip.show();
}
// Welcome effect: 2-time orange flow from the middle
void welcomeEffect() {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < NUM_PIXELS / 2; j++) {
strip.setPixelColor((NUM_PIXELS / 2) - j - 1, COLOR_ORANGE); // Left side
strip.setPixelColor((NUM_PIXELS / 2) + j, COLOR_ORANGE); // Right side
strip.show();
delay(50);
}
clearStrip();
delay(300);
}
}
// Right and Left flow effects
void rightFlowEffect(uint32_t color, int delayTime) {
for (int i = 0; i < NUM_PIXELS / 2; i++) {
strip.setPixelColor((NUM_PIXELS / 2) + i, color);
strip.show();
delay(60);
}
clearStrip();
delay(300);
}
void leftFlowEffect(uint32_t color, int delayTime) {
for (int i = 0; i < NUM_PIXELS / 2; i++) {
strip.setPixelColor((NUM_PIXELS / 2) - i - 1, color);
strip.show();
delay(60);
}
clearStrip();
delay(300);
}
// Hazard effect: Orange flow from center
void hazardFlowEffect(uint32_t color, int delayTime) {
for (int i = 0; i < NUM_PIXELS / 2; i++) {
strip.setPixelColor((NUM_PIXELS / 2) - i - 1, color);
strip.setPixelColor((NUM_PIXELS / 2) + i, color);
strip.show();
delay(60);
}
clearStrip();
delay(300);
}
// Red light with low brightness
void redLightLowBrightness() {
for (int i = 0; i < NUM_PIXELS; i++) {
strip.setPixelColor(i, COLOR_RED);
}
strip.show();
}
// Rainbow effect towards the center with white sparkle
void rainbowToCenterWithSparkle() {
for (long firstPixelHue = 0; firstPixelHue < 65536; firstPixelHue += 256) {
for (int i = 0; i < NUM_PIXELS / 2; i++) {
int hue = firstPixelHue + (i * 65536L / (NUM_PIXELS / 2));
uint32_t rainbowColor = strip.gamma32(strip.ColorHSV(hue, 255, 100));
strip.setPixelColor((NUM_PIXELS / 2) - i - 1, rainbowColor); // Left side
strip.setPixelColor((NUM_PIXELS / 2) + i, rainbowColor); // Right side
}
if (random(10) < 3) {
int sparklePixel = random(NUM_PIXELS);
strip.setPixelColor(sparklePixel, COLOR_WHITE); // High brightness white
}
strip.show();
delay(20);
}
clearStrip();
delay(1);
}
// Hyper Sparkle effect
void hyperSparkleEffect() {
for (int i = 0; i < 10; i++) {
int pixel = random(NUM_PIXELS);
strip.setPixelColor(pixel, COLOR_WHITE); // White sparkle
strip.show();
delay(20);
clearStrip();
delay(3000);
}
}
// Airplane light effect
void airplaneLightEffect() {
while (digitalRead(PIN_AIRPLANE) == HIGH) { // Run while the pin is HIGH
strip.setPixelColor(0, COLOR_RED); // Pixel 1: Red
strip.setPixelColor(20, COLOR_WHITE); // Pixel 8: White
strip.setPixelColor(19, COLOR_WHITE); // Pixel 9: White
strip.setPixelColor(15, COLOR_GREEN); // Pixel 16: Green
strip.show();
delay(100); // 1 ms flashing
clearStrip();
delay(5500);
}
}
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
pinMode(PIN_RIGHT, INPUT);
pinMode(PIN_LEFT, INPUT);
pinMode(PIN_WHITE, INPUT);
pinMode(PIN_RAINBOW, INPUT);
pinMode(PIN_RED, INPUT);
pinMode(PIN_SPARKLE, INPUT);
pinMode(PIN_AIRPLANE, INPUT);
pinMode(PIN_RELAY, OUTPUT);
triggerRelay(); // Send relay signals on power-up
welcomeEffect(); // Run welcome effect on power-up
}
void loop() {
bool rightSignal = digitalRead(PIN_RIGHT);
bool leftSignal = digitalRead(PIN_LEFT);
bool whiteSignal = digitalRead(PIN_WHITE);
bool rainbowSignal = digitalRead(PIN_RAINBOW);
bool redSignal = digitalRead(PIN_RED);
bool sparkleSignal = digitalRead(PIN_SPARKLE);
bool airplaneSignal = digitalRead(PIN_AIRPLANE);
if (rightSignal && leftSignal) {
hazardFlowEffect(COLOR_ORANGE, 50);
} else if (rightSignal) {
rightFlowEffect(COLOR_ORANGE, 50);
} else if (leftSignal) {
leftFlowEffect(COLOR_ORANGE, 50);
} else if (whiteSignal) {
hazardFlowEffect(COLOR_WHITE, 50);
} else if (rainbowSignal) {
rainbowToCenterWithSparkle();
} else if (redSignal) {
redLightLowBrightness();
} else if (sparkleSignal) {
hyperSparkleEffect();
} else if (airplaneSignal) {
airplaneLightEffect();
} else {
clearStrip();
}
}