如何减少Arduino按键控制LED代码中的if语句数量?
优化按键控制LED序列的代码(减少if语句)
核心优化方向
- 用状态机+预定义序列数组替代多层嵌套的if判断
- 简化按键逻辑,去掉冗余的条件分支
- 规范化常量定义,提升代码可维护性
优化后的代码
const int START_PIN = 8; const int STOP_PIN = 10; const int BLUE_PIN = 4; const int YELLOW_PIN = 7; const unsigned long DELAY_MS = 1000; bool ledEnabled = false; unsigned long previousTime = 0; // 预存LED状态序列:[黄LED状态, 蓝LED状态] const int ledSequence[4][2] = { {LOW, LOW}, {HIGH, LOW}, {LOW, HIGH}, {HIGH, LOW} }; int currentSeqIndex = 0; void setup() { pinMode(BLUE_PIN, OUTPUT); pinMode(YELLOW_PIN, OUTPUT); pinMode(START_PIN, INPUT); pinMode(STOP_PIN, INPUT); } void loop() { unsigned long timeNow = millis(); // 简化按键逻辑:直接赋值替代独立if判断 ledEnabled = digitalRead(START_PIN) == HIGH ? true : ledEnabled; ledEnabled = digitalRead(STOP_PIN) == HIGH ? false : ledEnabled; if (!ledEnabled) { // 关闭状态下直接重置并输出低电平 currentSeqIndex = 0; digitalWrite(YELLOW_PIN, LOW); digitalWrite(BLUE_PIN, LOW); return; } // 定时切换LED状态 if (timeNow - previousTime >= DELAY_MS) { previousTime = timeNow; currentSeqIndex = (currentSeqIndex + 1) % 4; // 循环切换序列索引 // 从数组读取状态并输出 digitalWrite(YELLOW_PIN, ledSequence[currentSeqIndex][0]); digitalWrite(BLUE_PIN, ledSequence[currentSeqIndex][1]); } }
优化细节说明
- 常量规范化:用
const定义引脚、延迟时间等固定值,避免魔法数字,方便后续修改 - 按键逻辑简化:用三元运算符直接更新
ledEnabled状态,去掉两个独立的if分支 - 状态序列数组:把LED的4种循环状态预存在二维数组中,通过索引循环切换,彻底消除了多层嵌套的if-else判断
- 关闭逻辑优化:关闭LED时直接重置序列索引并返回,减少不必要的代码执行分支
内容的提问来源于stack exchange,提问作者MMHassoun
相关产品推荐
相关产品推荐

