Arduino UNO接3按键2LED时熄灭按键功能失效的代码问题咨询
问题分析
- 计数器未联动重置:按下button2执行灭灯时,仅设置了LED电平为低,没有将
buttonPushCounterLeft和buttonPushCounterRight重置为0,下一轮loop运行时两个计数器仍为1,会再次触发LED闪烁逻辑,熄灭操作直接被覆盖。 - 逻辑对应关系错误:预期按下button1控制led1、按下button3控制led3,但现有代码中button1触发的是led3闪烁,button3触发的是led1闪烁,引脚对应完全倒置。
- 阻塞式
delay()影响响应:闪烁逻辑中使用的delay()会阻塞整个程序运行,熄灭操作需要等待所有delay执行完成才会生效,极端情况会出现按下button2后几秒才会响应的问题。 - 状态互斥逻辑缺失:三个按钮的状态没有互斥,按下button2后的灭灯状态会被后续的button1/3触发逻辑覆盖,没有状态标记阻止闪烁逻辑执行。
修复方案
调整计数器联动逻辑,按下任意按钮时重置另外两个按钮的计数器,修正LED与按钮的对应关系,替换阻塞式delay为非阻塞的millis计时逻辑,以下是可直接运行的修正代码:
const byte button3 = 4; const byte button1 = 2; const byte button2 = 3; const int led1 = 9; const int led3 = 7; int buttonPushCounterRight = 0; int buttonPushCounterDominant = 0; int buttonPushCounterLeft = 0; boolean buttonState = 0; boolean lastButtonStateRight = 0; boolean lastButtonStateDominant = 0; boolean lastButtonStateLeft = 0; // 非阻塞闪烁用变量,替代delay unsigned long previousMillis = 0; boolean led1State = LOW; boolean led3State = LOW; void setup() { pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP); pinMode(button3, INPUT_PULLUP); pinMode(led3, OUTPUT); pinMode(led1, OUTPUT); pinMode(A0, INPUT); Serial.begin(9600); } void loop() { int potValue = analogRead(A0); unsigned long currentMillis = millis(); // 读取button1状态 buttonState = digitalRead(button1); if (buttonState != lastButtonStateLeft) { if (buttonState == LOW) { // 按下button1,重置另外两个计数器 buttonPushCounterLeft = 1; buttonPushCounterRight = 0; buttonPushCounterDominant = 0; digitalWrite(led3, LOW); } lastButtonStateLeft = buttonState; delay(50); // 简单消抖 } // 读取button3状态 buttonState = digitalRead(button3); if (buttonState != lastButtonStateRight) { if (buttonState == LOW) { // 按下button3,重置另外两个计数器 buttonPushCounterRight = 1; buttonPushCounterLeft = 0; buttonPushCounterDominant = 0; digitalWrite(led1, LOW); } lastButtonStateRight = buttonState; delay(50); // 简单消抖 } // 读取button2状态 buttonState = digitalRead(button2); if (buttonState != lastButtonStateDominant) { if (buttonState == LOW) { // 按下button2,重置所有闪烁计数器,熄灭两个LED buttonPushCounterDominant = 1; buttonPushCounterLeft = 0; buttonPushCounterRight = 0; digitalWrite(led1, LOW); digitalWrite(led3, LOW); } lastButtonStateDominant = buttonState; delay(50); // 简单消抖 } // led1闪烁逻辑(非阻塞) if (buttonPushCounterLeft == 1) { if (currentMillis - previousMillis >= potValue) { previousMillis = currentMillis; led1State = !led1State; digitalWrite(led1, led1State); } } // led3闪烁逻辑(非阻塞) if (buttonPushCounterRight == 1) { if (currentMillis - previousMillis >= potValue) { previousMillis = currentMillis; led3State = !led3State; digitalWrite(led3, led3State); } } }
内容的提问来源于stack exchange,提问作者Sritangwong Sornram
相关产品推荐
相关产品推荐

