#include <Adafruit_NeoPixel.h>
#define GREEN_LEDS 5 // 跑道頭綠色燈及引導燈,接在 D5
#define WHITE_PLATES_ALL 10 // 兩側著入區白燈及跑道尾紅燈,接在 D10
#define WHITE_STRIP_PIN A0 // 中線指示白色 NeoPixel 燈條,接在 A0
#define SIDE_STRIP_PIN A2 // 兩側跑道邊界白色燈,接在A2
#define WHITE_STRIP_COUNT 32 // 中線白色燈條的燈珠數量(跑道長)(可依實體修改)
#define SIDE_STRIP_COUNT 34 // 外側白色燈調的燈珠數量(跑道長) (可依實體修改)
// 初始化中間的白色 NeoPixel 燈條及兩側燈條
Adafruit_NeoPixel whiteStrip(WHITE_STRIP_COUNT, WHITE_STRIP_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel sideStrip(SIDE_STRIP_COUNT, SIDE_STRIP_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// 1. 點亮一整排綠色跑道頭燈
pinMode(GREEN_LEDS, OUTPUT);
digitalWrite(GREEN_LEDS, HIGH);
// 2. 點亮兩側著入區白燈(後排跑道尾紅燈)
pinMode(WHITE_PLATES_ALL, OUTPUT);
digitalWrite(WHITE_PLATES_ALL, HIGH);
// 3. 初始化中間的白色燈條
whiteStrip.begin();
whiteStrip.setBrightness(255);
whiteStrip.show(); // 先清除殘留訊號
//4. 初始化外側雙色燈條
sideStrip.begin();
for(int i = 0; i < SIDE_STRIP_COUNT; i++) {
//判斷是不是奇數燈位置
if (i % 2 != 0) {
//如果是奇數燈,再判斷它是前段還是後段
if (i < SIDE_STRIP_COUNT / 1.2) {
sideStrip.setPixelColor(i, sideStrip.Color(255, 255, 255)); //前段奇數:純白光
} else {
sideStrip.setPixelColor(i, sideStrip.Color(255, 150, 0)); // 後段奇數:暖黃光
}
}
//如果是偶數燈 (0, 2, 4, 6, 8, 10),就讓它完全不亮!
else {
sideStrip.setPixelColor(i, sideStrip.Color(0, 0, 0)); // 偶數暗
}
}
sideStrip.setBrightness(255);
sideStrip.show(); // 送出訊號,外側奇數燈會維持恆亮
}
void loop() {
// 中線白色燈條:跑出漸層
for (int i = 0; i < WHITE_STRIP_COUNT; i++) {
whiteStrip.clear(); // 每次前進前,先清空上一幕的燈光
// 頭(最亮純白光:紅綠藍全滿)
whiteStrip.setPixelColor(i, whiteStrip.Color(255, 255, 255));
// 尾巴漸暗(做出絲滑消散的漸層效果)
if (i - 1 >= 0) whiteStrip.setPixelColor(i - 1, whiteStrip.Color(160, 160, 160)); // 中階白
if (i - 2 >= 0) whiteStrip.setPixelColor(i - 2, whiteStrip.Color(80, 80, 80)); // 暗白
if (i - 3 >= 0) whiteStrip.setPixelColor(i - 3, whiteStrip.Color(25, 25, 25)); // 微弱餘輝
whiteStrip.show();
delay(50); // 流星前進的速度(毫秒),數字越小跑越快
}
delay(50); // 流星跑到盡頭後,稍微停頓一下再重新出發
}