#include #include #define Neo_Pix_Pin 2 #define Neon_pin 8 #define Num_LED 14 #define I2C_ADDRESS 0x09 Adafruit_NeoPixel strip(Num_LED, Neo_Pix_Pin, NEO_GRB + NEO_KHZ800); const long BlinkInterval = 300; const long GreenBlinkTime = 6000; const int AnimationDelay = 60; const int AnimationLoops = 7; bool neonBlinking = false; int neonBlinkCount = 0; bool neonState = true; unsigned long neonLastBlinkTime = 0; bool greenBlinking = false; bool greenState = false; unsigned long greenStartTime = 0; unsigned long greenLastBlinkTime = 0; bool rightAnimating = false; int rightStep = 0; int rightLoops = 0; bool leftAnimating = false; int leftStep = 0; int leftLoops = 0; bool reverseAnimating = false; int reverseStep = 0; int reverseLoops = 0; void setup() { strip.begin(); strip.setBrightness(50); strip.show(); pinMode(Neon_pin, OUTPUT); digitalWrite(Neon_pin, HIGH); // Always ON initially Serial.begin(9600); Wire.begin(I2C_ADDRESS); Wire.onReceive(receiveEvent); } void loop() { // Default red if (!greenBlinking && !leftAnimating && !rightAnimating && !reverseAnimating) { for (int i = 0; i < Num_LED; i++) strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.show(); } if (neonBlinking) handleNeonBlink(); if (greenBlinking) handleGreenBlink(); if (rightAnimating) handleRightAnimation(); if (leftAnimating) handleLeftAnimation(); if (reverseAnimating) handleReverseAnimation(); } // === I2C Command Handler === void receiveEvent(int howMany) { if (howMany < 1) return; char cmd = Wire.read(); Serial.print("Received command: "); Serial.println(cmd); switch (cmd) { case 'L': leftAnimating = true; leftStep = 0; leftLoops = 0; break; case 'R': rightAnimating = true; rightStep = 0; rightLoops = 0; break; case 'B': reverseAnimating = true; reverseStep = 0; reverseLoops = 0; break; case 'O': case 'C': neonBlinking = true; neonBlinkCount = 0; neonLastBlinkTime = millis(); digitalWrite(Neon_pin, HIGH); greenBlinking = true; greenStartTime = millis(); greenLastBlinkTime = millis(); break; } } // === Animation Functions === void handleNeonBlink() { if (millis() - neonLastBlinkTime >= BlinkInterval) { neonLastBlinkTime = millis(); neonState = !neonState; digitalWrite(Neon_pin, neonState ? HIGH : LOW); if (!neonState) neonBlinkCount++; if (neonBlinkCount >= 10) { neonBlinking = false; digitalWrite(Neon_pin, HIGH); // Ensure ON } } } void handleGreenBlink() { if (millis() - greenLastBlinkTime >= BlinkInterval) { greenLastBlinkTime = millis(); greenState = !greenState; for (int i = 0; i < Num_LED; i++) strip.setPixelColor(i, greenState ? strip.Color(0, 255, 0) : strip.Color(255, 0, 0)); strip.show(); } if (millis() - greenStartTime >= GreenBlinkTime) { greenBlinking = false; for (int i = 0; i < Num_LED; i++) strip.setPixelColor(i, strip.Color(255, 0, 0)); strip.show(); } } void handleLeftAnimation() { static unsigned long lastStep = 0; if (millis() - lastStep >= AnimationDelay) { lastStep = millis(); strip.clear(); for (int i = 0; i <= 6; i++) { int distance = abs(i - leftStep); int brightness = max(0, 255 - distance * 60); strip.setPixelColor(i, strip.Color(brightness, brightness / 2, 0)); // Amber } strip.show(); leftStep++; if (leftStep > 8) { leftStep = 0; leftLoops++; if (leftLoops >= AnimationLoops) leftAnimating = false; } } } void handleRightAnimation() { static unsigned long lastStep = 0; if (millis() - lastStep >= AnimationDelay) { lastStep = millis(); strip.clear(); for (int i = 13; i >= 7; i--) { int distance = abs(i - (13 - rightStep)); int brightness = max(0, 255 - distance * 60); strip.setPixelColor(i, strip.Color(brightness, brightness / 2, 0)); } strip.show(); rightStep++; if (rightStep > 8) { rightStep = 0; rightLoops++; if (rightLoops >= AnimationLoops) rightAnimating = false; } } } void handleReverseAnimation() { static unsigned long lastStep = 0; if (millis() - lastStep >= AnimationDelay) { lastStep = millis(); strip.clear(); int center1 = 6; int center2 = 7; for (int i = 0; i <= reverseStep; i++) { int brightness = constrain(i * 40, 0, 255); if (center1 - i >= 0) strip.setPixelColor(center1 - i, strip.Color(0, 0, brightness)); if (center2 + i < Num_LED) strip.setPixelColor(center2 + i, strip.Color(0, 0, brightness)); } strip.show(); reverseStep++; if (center1 - reverseStep < 0 && center2 + reverseStep >= Num_LED) { reverseStep = 0; reverseLoops++; if (reverseLoops >= AnimationLoops) reverseAnimating = false; } } }