#include <Arduino.h>
const int ledPins[] = {3, 5, 6, 9, 10, 11}; // LED腳位的陣列
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]); // LED數量
const int buttonPin = 2; // 按鈕腳位
volatile bool buttonPressed = false; // 標記按鈕是否被按下
unsigned long lastDebounceTime = 0; // 上一次按鈕彈跳的時間
unsigned long debounceDelay = 100; // 按鈕彈跳延遲的時間
int buttonState = 0; // 按鈕狀態
int lastButtonState = 0; // 上一次的按鈕狀態
int currentMode = 1; // 目前的LED模式
int delaytime = 20; // LED亮度變化的間隔時間
int midsleep = 500; // 兩次亮度變化之間的延遲時間
void setup() {
Serial.begin(115200); // 初始化序列通訊
pinMode(buttonPin, INPUT_PULLUP); // 設定按鈕腳位為輸入並啟用上拉電阻
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT); // 設定LED腳位為輸出
}
randomSeed(analogRead(0)); // 初始化亂數種子
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, FALLING); // 設定中斷函式,當按鈕觸發下降沿時呼叫buttonISR函式
}
void loop() {
Serial.println(currentMode); // 列印目前的LED模式
delay(midsleep); // 延遲一段時間
switch (currentMode) {
case 1: {
int ii = 0;
while (ii < numLeds && !buttonPressed) {
analogWrite(ledPins[ii], 0); // 將所有 LED 都設定為最小亮度,熄滅狀態
ii++;
}
// 每次隨機漸漸亮起 2 或 3 個 LED 然後漸漸熄滅,循環下去
int numLedsToTurnOn = random(2, 4); // 隨機選擇要亮起的 LED 數量,範圍為 2 到 3
int ledsToTurnOn[numLedsToTurnOn]; // 儲存要亮起的 LED 的腳位號碼的陣列
int i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
int index;
do {
index = random(numLeds); // 隨機選擇一個 LED 腳位號碼
} while (ledsToTurnOn[i] == index && !buttonPressed); // 確保選擇的 LED 腳位號碼不重複
ledsToTurnOn[i] = index; // 將選擇的 LED 腳位號碼存入陣列
i++;
}
int brightness = 0;
while (brightness <= 255 && !buttonPressed) {
i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
analogWrite(ledPins[ledsToTurnOn[i]], brightness); // 逐漸調整選中的 LED 亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness += 5;
}
delay(midsleep); // 延遲一段時間
brightness = 255;
while (brightness >= 0 && !buttonPressed) {
i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
analogWrite(ledPins[ledsToTurnOn[i]], brightness); // 逐漸調整選中的 LED 亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
delay(midsleep); // 延遲一段時間
break;
}
case 2: {
// 先六個 LED 全亮,每次隨機漸漸熄滅 1 顆LED,再亮起,循環下去
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], 255); // 將六個 LED 都設定為最大亮度
i++;
}
int numLedsToTurnOn = random(1, 1); // 隨機選擇要熄滅的 LED 數量,這裡設定為 1
int ledsToTurnOn[numLedsToTurnOn]; // 儲存要熄滅的 LED 的腳位號碼的陣列
i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
int index;
do {
index = random(numLeds); // 隨機選擇一個 LED 腳位號碼
} while (ledsToTurnOn[i] == index && !buttonPressed); // 確保選擇的 LED 腳位號碼不重複
ledsToTurnOn[i] = index; // 將選擇的 LED 腳位號碼存入陣列
i++;
}
int brightness = 255;
while (brightness >= 0 && !buttonPressed) {
i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
analogWrite(ledPins[ledsToTurnOn[i]], brightness); // 逐漸調整熄滅的 LED 亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
delay(midsleep); // 延遲一段時間
brightness = 0;
while (brightness <= 255 && !buttonPressed) {
i = 0;
while (i < numLedsToTurnOn && !buttonPressed) {
analogWrite(ledPins[ledsToTurnOn[i]], brightness); // 逐漸調整重新亮起的 LED 亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness += 5;
}
delay(midsleep); // 延遲一段時間
break;
}
case 3: {
// 每次隨機漸漸亮起 1 個 LED 然後漸漸熄滅,循環下去
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], 0); // 將所有 LED 都設定為最小亮度,熄滅狀態
i++;
}
int ledToTurnOn = random(numLeds); // 隨機選擇一個 LED 腳位號碼
int brightness = 0;
while (brightness <= 255 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOn], brightness); // 逐漸調整選中的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness += 5;
}
delay(midsleep); // 延遲一段時間
brightness = 255;
while (brightness >= 0 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOn], brightness); // 逐漸調整選中的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
delay(midsleep); // 延遲一段時間
break;
}
case 4: {
// 全部 6 個 LED 漸漸亮起然後漸漸熄滅,循環下去
int brightness = 0;
while (brightness <= 255 && !buttonPressed) {
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], brightness); // 逐漸調整所有 LED 的亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness += 5;
}
brightness = 255;
delay(midsleep); // 延遲一段時間
while (brightness >= 0 && !buttonPressed) {
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], brightness); // 逐漸調整所有 LED 的亮度
i++;
}
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
delay(midsleep); // 延遲一段時間
break;
}
case 5: {
// 每次有規律漸漸亮 1 顆 LED 然後漸漸熄滅,循環下去
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], 0); // 將所有 LED 都設定為最小亮度,熄滅狀態
i++;
}
delay(midsleep); // 延遲一段時間
int ledToTurnOn = 0;
while (ledToTurnOn < numLeds && !buttonPressed) {
int brightness = 0;
while (brightness <= 255 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOn], brightness); // 逐漸調整選中的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness += 5;
}
delay(midsleep); // 延遲一段時間
brightness = 255;
while (brightness >= 0 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOn], brightness); // 逐漸調整選中的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
ledToTurnOn++;
delay(midsleep); // 延遲一段時間
}
delay(midsleep); // 延遲一段時間
break;
}
case 6: {
// 六個 LED 全亮,每次有規律熄滅 1 顆然後亮起
int i = 0;
while (i < numLeds && !buttonPressed) {
analogWrite(ledPins[i], 255); // 將所有 LED 都設定為最大亮度
i++;
}
int ledToTurnOff = 0;
while (ledToTurnOff < numLeds && !buttonPressed) {
int brightness = 255;
while (brightness >= 0 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOff], brightness); // 逐漸調整要熄滅的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness -= 5;
}
delay(midsleep); // 延遲一段時間
brightness = 0;
while (brightness <= 255 && !buttonPressed) {
analogWrite(ledPins[ledToTurnOff], brightness); // 逐漸調整重新亮起的 LED 亮度
delay(delaytime); // 延遲一段時間
brightness += 5;
}
ledToTurnOff++;
}
delay(midsleep); // 延遲一段時間
break;
}
}
button_event(); // 處理按鈕事件
}
void button_event() {
buttonState = digitalRead(buttonPin); // 讀取按鈕狀態
Serial.print("buttonState=");
Serial.println(buttonState); // 列印按鈕狀態
if (buttonState != lastButtonState) { // 檢查按鈕狀態是否有變化
if (lastButtonState == HIGH && buttonState == LOW) { // 檢查按鈕是否被按下
buttonPressed = true; // 設定按鈕按下的標記為 true
}
lastDebounceTime = millis(); // 更新按鈕彈跳的時間
if ((millis() - lastDebounceTime) > debounceDelay) { // 檢查按鈕彈跳的時間是否超過彈跳延遲
lastButtonState = buttonState; // 更新上一次的按鈕狀態
}
if (buttonPressed) { // 如果按鈕被按下
buttonPressed = false; // 重置按鈕按下的標記為 false
currentMode++; // 切換到下一個LED模式
if (currentMode >= 7) { // 如果已經是最後一個模式,則回到第一個模式
currentMode = 1;
delay(midsleep); // 延遲一段時間
}
}
}
}
void buttonISR() {
buttonPressed = true; // 按鈕中斷服務例程,將按鈕按下的標記設定為 true
}