#include <Adafruit_NeoPixel.h>
// NeoPixel 燈環參數
#define PIN 15 // NeoPixel 控制腳位
#define NUMPIXELS 16 // 燈環中的 LED 數量
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// LED 和按鈕腳位
#define BUTTON_PIN_O 25 // 按鈕 O
#define BUTTON_PIN_B 26 // 按鈕 B
#define LED_PIN_O 32 // LED O
#define LED_PIN_B 33 // LED B
// 去彈跳參數
unsigned long lastDebounceTime_O = 0;
unsigned long lastDebounceTime_B = 0;
const unsigned long debounceDelay = 50; // 50ms 去彈跳時間
bool buttonState_O = false;
bool buttonState_B = false;
void setup()
{
// 初始化 NeoPixel
pixels.begin();
pixels.clear();
pixels.show();
// 設置按鈕和 LED 腳位
pinMode(BUTTON_PIN_O, INPUT_PULLUP); // 按鈕使用內建上拉電阻
pinMode(BUTTON_PIN_B, INPUT_PULLUP);
pinMode(LED_PIN_O, OUTPUT);
pinMode(LED_PIN_B, OUTPUT);
// 關閉 LED
digitalWrite(LED_PIN_O, LOW);
digitalWrite(LED_PIN_B, LOW);
}
void loop()
{
// 檢測按鈕狀態並去彈跳
bool currentButtonState_O = !digitalRead(BUTTON_PIN_O); // 按鈕被按下時為 LOW,取反
bool currentButtonState_B = !digitalRead(BUTTON_PIN_B);
if (currentButtonState_O && (millis() - lastDebounceTime_O > debounceDelay))
{
lastDebounceTime_O = millis();
buttonState_O = true;
}
else if (!currentButtonState_O)
{
buttonState_O = false;
}
if (currentButtonState_B && (millis() - lastDebounceTime_B > debounceDelay))
{
lastDebounceTime_B = millis();
buttonState_B = true;
}
else if (!currentButtonState_B)
{
buttonState_B = false;
}
// 按鈕 O 的動作
if (buttonState_O)
{
digitalWrite(LED_PIN_O, HIGH);
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++)
{
pixels.setPixelColor(i, pixels.Color(255, 0, 255)); // 紫色
pixels.show();
delay(200); // 延遲時間
}
pixels.clear();
pixels.show();
}
else
{
digitalWrite(LED_PIN_O, LOW);
}
// 按鈕 B 的動作
if (buttonState_B)
{
digitalWrite(LED_PIN_B, HIGH);
pixels.clear();
for (int i = NUMPIXELS - 1; i >= 0; i--)
{
pixels.setPixelColor(i, pixels.Color(0, 255, 255)); // 青色
pixels.show();
delay(200); // 延遲時間
}
pixels.clear();
pixels.show();
}
else
{
digitalWrite(LED_PIN_B, LOW);
}
}