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

如何减少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]);
  }
}

优化细节说明

  1. 常量规范化:用const定义引脚、延迟时间等固定值,避免魔法数字,方便后续修改
  2. 按键逻辑简化:用三元运算符直接更新ledEnabled状态,去掉两个独立的if分支
  3. 状态序列数组:把LED的4种循环状态预存在二维数组中,通过索引循环切换,彻底消除了多层嵌套的if-else判断
  4. 关闭逻辑优化:关闭LED时直接重置序列索引并返回,减少不必要的代码执行分支

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:21:37