#include <Adafruit_NeoPixel.h>
#define slide 15 //滑桿
#define sw1 25 //指撥紅色
#define sw2 26 //指撥綠色
#define sw3 27 //指撥藍色
#define sw4 14 //彩虹
#define LED_PIN 23 //接WS2812燈條的DIN腳
#define NUM_LEDS 16 //LED數量
#define BRIGHTNESS 255 //亮度255
#define LED_TYPE WS2812 //類型WS2812
Adafruit_NeoPixel strip(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
pinMode(sw1, INPUT_PULLUP); //開關(內部提升電阻)
pinMode(sw2, INPUT_PULLUP);
pinMode(sw3, INPUT_PULLUP);
pinMode(sw4, INPUT_PULLUP);
}
//=================================================================
void loop() {
static int prevValue = -1; // 儲存上一個 Value,避免重複更新
int val = analogRead(slide); // 讀取滑桿值 0~4095
int Value = map(val, 0, 4095, 0, 16); // 對應到 16 個 LED 的數量
// 只要SW4 被按下,觸發彩虹效果
if (!digitalRead(sw4)) { // 啟動彩虹模式
rainbowCycle(); // 執行彩虹效果
return; // 不繼續執行其他燈條更新
}
// 當滑桿值變化或指撥開關被按下時更新燈條
if (Value != prevValue || !digitalRead(sw1) || !digitalRead(sw2) ||\
!digitalRead(sw3)) {
for (int i = Value; i < 16; i++) { // 清除不需要亮的像素
strip.setPixelColor(i, 0, 0, 0);
}
for (int i = 0; i < Value; i++) { // 指撥改顏色
uint8_t red = 0, green = 0, blue = 0;
if (!digitalRead(sw1)) red = 255;
if (!digitalRead(sw2)) green = 255;
if (!digitalRead(sw3)) blue = 255;
strip.setPixelColor(i, red, green, blue);
}
strip.show();
prevValue = Value; // 更新上一個 Value
}
delay(10); // 短暫延遲避免高頻處理
}
//=================================================================
void rainbowCycle() {
for (int i = 0; i < 256 * 5; i++) {
for (int j = 0; j < strip.numPixels(); j++) {
strip.setPixelColor(j, Wheel(((j * 255) / strip.numPixels()) + i % 256));
}
strip.show();
}
}
int Wheel(byte WheelPos) {
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
}