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; }
问题原因及解决方案
问题根源
- 启动时未主动点亮红灯:Arduino引脚默认输出LOW(熄灭),所以启动时红灯不会自动亮起;
- 初始状态误触发分支:
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; }
修正说明
- 初始化点亮红灯:在
setup()中主动设置红灯为HIGH,确保启动即亮; - 修正初始状态:将
previousButtonState初始化为LOW,匹配按键未按下的初始状态,避免启动时误触发释放分支; - 添加按压标记:新增
hasButtonPressed变量,只有当按键真正被按压过之后,释放时才执行黄灯逻辑,彻底排除启动时的无效触发。
内容的提问来源于stack exchange,提问作者An K
相关产品推荐
相关产品推荐

