// TODO:两个按键控制三个呼吸灯的频率,上电后灯不亮,
// 通过一个按键选择相应的灯,然后再通过另一个按键控制频率
const int LED_PINS[] = {5, 6, 3}; // LED引脚
const int RATE_BUTTON_PIN = 0; // 呼吸速率调整按钮引脚
const int SELECT_BUTTON_PIN = 1; // LED选择按钮引脚
int selectedLED = -1; // 取-1保证通电后不亮灯
int breathingRate = 5; // 呼吸速率 (1-10)
int brightness = 0; // 当前LED灯的亮度
int fadeAmount = 5; // LED灯亮度变化的步长
bool isBreathing = false; // 根据这个变量判断LED灯是否进入呼吸状态
unsigned long lastButtonCheckTime = 0;
const unsigned long buttonDebounceDelay = 50;
void setup() {
for (int i = 0; i < 3; i++) {
pinMode(LED_PINS[i], OUTPUT);
digitalWrite(LED_PINS[i], LOW); // 确保通电不亮灯
}
pinMode(RATE_BUTTON_PIN, INPUT_PULLUP);
pinMode(SELECT_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastButtonCheckTime > buttonDebounceDelay) {
checkButtons();
lastButtonCheckTime = currentTime;
}
// 确保正确的灯和正确的状态
if (selectedLED != -1 && isBreathing) {
// 修改亮度以便后面使用
brightness += fadeAmount * breathingRate;
// 完成呼吸效果
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
brightness = constrain(brightness, 0, 255);
}
// 修改当前选中LED灯的亮度
for (int i = 0; i < 3; i++) {
if (i == selectedLED) {
analogWrite(LED_PINS[i], brightness);
} else {
analogWrite(LED_PINS[i], 0);
}
}
}
delay(30);
}
// 两个按钮的功能
void checkButtons() {
// 读取速率按钮的状态,按下时执行代码
if (digitalRead(RATE_BUTTON_PIN) == LOW) {
breathingRate = (breathingRate % 10) + 1; // 呼吸速率 1 - 10
isBreathing = true; // 开启呼吸状态
delay(200);
}
// 选择LED灯按钮
if (digitalRead(SELECT_BUTTON_PIN) == LOW) {
if (selectedLED == -1) {
selectedLED = 0; // 如果是第一次启动,选择第一个LED灯
} else {
selectedLED = (selectedLED + 1) % 3; // 否则就切换到下一个灯,取下标 (0 - 2)
}
brightness = 128; // 切换LED灯后让亮度处于一个中间值方便观察
fadeAmount = abs(fadeAmount);
isBreathing = true;
delay(200);
}
}