Arduino代码故障求助:LED按键亮度调节未达预期
Arduino按键控制LED亮度问题排查
本人是Arduino新手,编写代码预期实现:首次按下按键时LED以100%亮度点亮,后续每按一次亮度降低25%;但实际按下按键后,LED点亮但亮度偏暗,随后逐渐熄灭。附上硬件连接图及代码,请求排查逻辑错误。
硬件连接图

原代码
int LED = 11; const int Bryter = 8; int LED1; int Bryterstat; int Count = 0; void setup() { pinMode(11,OUTPUT); pinMode(Bryter,INPUT_PULLUP); Serial.begin(9600); } void loop() { LED1 = digitalRead(LED); Bryterstat = digitalRead(Bryter); delay(10); Serial.println(LED1); if (Count == 0) { analogWrite(11,0); Count = 5; } if (Bryterstat == LOW && Count == 5) { analogWrite(11,255); Count = 1; } if (Bryterstat == LOW && Count == 1) { analogWrite(11,191); Count = 2; } if (Bryterstat == LOW && Count == 2) { analogWrite(11,127); Count = 3; } if (Bryterstat == LOW && Count == 3) { analogWrite(11,255); Count = 4; } if (Bryterstat == LOW && Count == 4) { analogWrite(11,0); Count = 0; } }
问题排查与修复
核心逻辑错误
- 无按键边缘检测:
loop()会快速循环,按下按键时代码会连续触发多个if分支,导致Count一次按键内跳变多个值,LED亮度被连续修改,表现为变暗后直接熄灭。 - 亮度档位逻辑错误:代码中
Count=3时又将亮度设为255(100%),不符合“每次按降低25%”的需求;且缺少25%亮度的档位(对应PWM值应为63)。 - 冗余代码:
LED1 = digitalRead(LED);完全无用,LED是输出引脚,读取其状态没有意义。
修复后的代码
int LED = 11; const int Bryter = 8; int currentBtnState; int lastBtnState = HIGH; // 记录上一次按键状态 int brightnessLevel = 0; void setup() { pinMode(LED, OUTPUT); pinMode(Bryter, INPUT_PULLUP); Serial.begin(9600); analogWrite(LED, 0); // 初始LED熄灭 } void loop() { currentBtnState = digitalRead(Bryter); delay(10); // 简易消抖 // 仅在按键按下的瞬间触发一次逻辑 if (currentBtnState == LOW && lastBtnState == HIGH) { brightnessLevel++; // 循环档位:0→1→2→3→4→0 if (brightnessLevel > 4) brightnessLevel = 0; switch(brightnessLevel) { case 1: analogWrite(LED, 255); break; // 100% case 2: analogWrite(LED, 191); break; // 75% case 3: analogWrite(LED, 127); break; // 50% case 4: analogWrite(LED, 63); break; // 25% default: analogWrite(LED, 0); break; // 熄灭 } Serial.print("当前亮度档位:"); Serial.println(brightnessLevel); } lastBtnState = currentBtnState; // 更新上一次按键状态 }
修复说明
- 按键边缘检测:通过对比当前与上一次按键状态,确保一次按键仅触发一次档位切换,避免连续跳变。
- 修正亮度档位:按照25%递减逻辑设置正确的PWM值,补充25%亮度的档位。
- 移除冗余代码:删除无用的
LED1变量及相关读取操作,简化逻辑。 - 明确初始状态:在
setup中直接设置LED初始为熄灭,避免状态混乱。
内容的提问来源于stack exchange,提问作者Clown Fish
相关产品推荐
相关产品推荐

