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

Arduino代码故障求助:LED按键亮度调节未达预期

Arduino按键控制LED亮度问题排查

本人是Arduino新手,编写代码预期实现:首次按下按键时LED以100%亮度点亮,后续每按一次亮度降低25%;但实际按下按键后,LED点亮但亮度偏暗,随后逐渐熄灭。附上硬件连接图及代码,请求排查逻辑错误。

硬件连接图

Hardware

原代码

int LED = 11;
const int Bryter = 8;

int LED1;
int Bryterstat;

int Count = 0;


void setup()
{
    pinMode(11,OUTPUT);
    pinMode(Bryter,INPUT_PULLUP);
    Serial.begin(9600);
}

void loop()
{
    LED1 = digitalRead(LED);
    Bryterstat = digitalRead(Bryter);
    delay(10);
    Serial.println(LED1);
    if (Count == 0)
    {
        analogWrite(11,0);
        Count = 5;
    }
  
    if (Bryterstat == LOW && Count == 5)
    {
        analogWrite(11,255);
        Count = 1;
    }
  
    if (Bryterstat == LOW && Count == 1)
    {
        analogWrite(11,191);
        Count = 2;
    }
  
    if (Bryterstat == LOW && Count == 2)
    {
        analogWrite(11,127);
        Count = 3;
    }
  
    if (Bryterstat == LOW && Count == 3)
    {
        analogWrite(11,255);
        Count = 4;
    }

    if (Bryterstat == LOW && Count == 4)
    {
        analogWrite(11,0);
        Count = 0;
    }
}

问题排查与修复

核心逻辑错误

  1. 无按键边缘检测:loop()会快速循环,按下按键时代码会连续触发多个if分支,导致Count一次按键内跳变多个值,LED亮度被连续修改,表现为变暗后直接熄灭。
  2. 亮度档位逻辑错误:代码中Count=3时又将亮度设为255(100%),不符合“每次按降低25%”的需求;且缺少25%亮度的档位(对应PWM值应为63)。
  3. 冗余代码:LED1 = digitalRead(LED);完全无用,LED是输出引脚,读取其状态没有意义。

修复后的代码

int LED = 11;
const int Bryter = 8;

int currentBtnState;
int lastBtnState = HIGH; // 记录上一次按键状态
int brightnessLevel = 0;

void setup()
{
    pinMode(LED, OUTPUT);
    pinMode(Bryter, INPUT_PULLUP);
    Serial.begin(9600);
    analogWrite(LED, 0); // 初始LED熄灭
}

void loop()
{
    currentBtnState = digitalRead(Bryter);
    delay(10); // 简易消抖

    // 仅在按键按下的瞬间触发一次逻辑
    if (currentBtnState == LOW && lastBtnState == HIGH)
    {
        brightnessLevel++;
        // 循环档位:0→1→2→3→4→0
        if (brightnessLevel > 4) brightnessLevel = 0;

        switch(brightnessLevel)
        {
            case 1: analogWrite(LED, 255); break; // 100%
            case 2: analogWrite(LED, 191); break; // 75%
            case 3: analogWrite(LED, 127); break; // 50%
            case 4: analogWrite(LED, 63);  break; // 25%
            default: analogWrite(LED, 0);   break; // 熄灭
        }
        Serial.print("当前亮度档位:");
        Serial.println(brightnessLevel);
    }

    lastBtnState = currentBtnState; // 更新上一次按键状态
}

修复说明

  • 按键边缘检测:通过对比当前与上一次按键状态,确保一次按键仅触发一次档位切换,避免连续跳变。
  • 修正亮度档位:按照25%递减逻辑设置正确的PWM值,补充25%亮度的档位。
  • 移除冗余代码:删除无用的LED1变量及相关读取操作,简化逻辑。
  • 明确初始状态:在setup中直接设置LED初始为熄灭,避免状态混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:44