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

Arduino新手项目:3路LED与按键控制代码问题求助

3路LED与按键控制的Arduino程序问题

需求逻辑

  • 程序启动时默认点亮红灯;
  • 按下按键并保持按压状态时,点亮绿灯;
  • 释放按键后,绿灯熄灭,黄灯点亮1秒后熄灭;
  • 随后红灯重新点亮,直至下一次按键被按下。

现有问题

当前代码可运行,但每次启动时会先亮黄灯再切换到红灯,需要修正为启动默认亮红灯,且仅在按键释放后才执行黄灯转红灯的流程。

现有代码

// Pin variables
int red = 9;        // 红灯接引脚9
int yellow = 10;    // 黄灯接引脚10
int green = 11;     // 绿灯接引脚11
int button = 2;     // 按键接引脚2

// 按键状态跟踪变量
int buttonState = 0;                   // 按键当前状态(LOW或HIGH)
int previousButtonState = HIGH;        // 存储按键上一次的状态

void setup() {
  // 设置LED引脚为输出模式,按键为输入模式
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(button, INPUT);
}

void loop() {
  // 读取按键当前状态
  buttonState = digitalRead(button);

  // 检测按键首次按下
  if (buttonState == HIGH && previousButtonState == LOW) {
    // 关闭红灯,点亮绿灯
    digitalWrite(red, LOW);
    digitalWrite(green, HIGH);
  } 
  // 检测按键持续按压
  else if (buttonState == HIGH && previousButtonState == HIGH) {
    // 保持绿灯点亮(无需操作)
  } 
  // 检测按键释放(此前处于按压状态)
  else if (buttonState == LOW && previousButtonState == HIGH) {
    // 关闭绿灯,点亮黄灯,延迟1秒后关闭黄灯,点亮红灯
    digitalWrite(green, LOW);
    digitalWrite(yellow, HIGH);
    delay(1000);  // 延迟1000毫秒(1秒)
    digitalWrite(yellow, LOW);
    digitalWrite(red, HIGH);
  }

  // 保存当前按键状态,用于下一次循环判断
  previousButtonState = buttonState;
}

问题原因及解决方案

问题根源

  1. 启动时未主动点亮红灯:Arduino引脚默认输出LOW(熄灭),所以启动时红灯不会自动亮起;
  2. 初始状态误触发分支:previousButtonState被初始化为HIGH,而按键未按下时读取值为LOW,直接触发了按键释放的逻辑分支,导致启动时点亮黄灯。

修正后的代码

// Pin variables
int red = 9;        // 红灯接引脚9
int yellow = 10;    // 黄灯接引脚10
int green = 11;     // 绿灯接引脚11
int button = 2;     // 按键接引脚2

// 按键状态跟踪变量
int buttonState = 0;                   // 按键当前状态(LOW或HIGH)
int previousButtonState = LOW;         // 初始化为LOW,避免启动误触发释放逻辑
bool hasButtonPressed = false;         // 标记按键是否被按压过,过滤启动时的无效判断

void setup() {
  // 设置LED引脚为输出模式,按键为输入模式
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(button, INPUT);
  
  // 启动时直接点亮红灯,关闭其他灯
  digitalWrite(red, HIGH);
  digitalWrite(yellow, LOW);
  digitalWrite(green, LOW);
}

void loop() {
  // 读取按键当前状态
  buttonState = digitalRead(button);

  // 检测按键首次按下
  if (buttonState == HIGH && previousButtonState == LOW) {
    hasButtonPressed = true;
    // 关闭红灯,点亮绿灯
    digitalWrite(red, LOW);
    digitalWrite(green, HIGH);
  } 
  // 检测按键持续按压
  else if (buttonState == HIGH && previousButtonState == HIGH) {
    // 保持绿灯点亮(无需操作)
  } 
  // 仅当按键确实被按压过,释放时才执行黄灯转红灯流程
  else if (buttonState == LOW && previousButtonState == HIGH && hasButtonPressed) {
    // 关闭绿灯,点亮黄灯,延迟1秒后关闭黄灯,点亮红灯
    digitalWrite(green, LOW);
    digitalWrite(yellow, HIGH);
    delay(1000);  // 延迟1000毫秒(1秒)
    digitalWrite(yellow, LOW);
    digitalWrite(red, HIGH);
    hasButtonPressed = false;  // 重置标记,等待下一次按键
  }

  // 保存当前按键状态,用于下一次循环判断
  previousButtonState = buttonState;
}

修正说明

  1. 初始化点亮红灯:在setup()中主动设置红灯为HIGH,确保启动即亮;
  2. 修正初始状态:将previousButtonState初始化为LOW,匹配按键未按下的初始状态,避免启动时误触发释放分支;
  3. 添加按压标记:新增hasButtonPressed变量,只有当按键真正被按压过之后,释放时才执行黄灯逻辑,彻底排除启动时的无效触发。

内容的提问来源于stack exchange,提问作者An K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:31