You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:45:03