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

按4、5、6按键序列关闭RGB LED的代码失效问题排查

光敏电阻报警器代码问题排查与修复

核心问题分析

你的按键功能失效主要源于三个关键错误:

  • 引脚匹配错误:需求是检测4、5、6号按键,但代码里写的是检测0、1、2号引脚,完全不匹配硬件连接。
  • 触发逻辑错误:当前代码要求三个按键同时为高电平才触发,和你需要的“依次按下4→5→6”的顺序逻辑不符。
  • 状态读取失效:value1/2/3在全局作用域初始化,只会读取一次引脚状态,无法实时更新按键状态;同时缺少按键消抖,容易出现误触发。

另外,距离触发关闭扬声器的逻辑没有阻止后续报警代码执行,可能导致扬声器被再次触发。

修正后的代码

int pins[]={4,5,6};
int notes[]={392,392,440,440,392,392,330};
int b=0,r=0,g=0;
int c=0;
// 按键顺序检测状态:0=等待按4,1=等待按5,2=等待按6
int keyState = 0;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;

void setup() {
  randomSeed(analogRead(A0));
  for(int i=0;i<3;i++){
    // 使用内部上拉电阻,无需外接下拉元件
    pinMode(pins[i],INPUT_PULLUP);
  }
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
  int vin=analogRead(A0);
  unsigned long currentMillis = millis();

  // 距离触发关闭扬声器,阻止后续报警逻辑
  if (c>5){
    noTone(8);
    goto skip_alarm_logic;
  }

  // 依次按下4→5→6的按键检测逻辑
  switch(keyState){
    case 0: // 等待按下4号键
      if(digitalRead(4) == LOW && (currentMillis - lastDebounceTime) > debounceDelay){
        lastDebounceTime = currentMillis;
        keyState = 1;
      }
      break;
    case 1: // 等待按下5号键
      if(digitalRead(5) == LOW && (currentMillis - lastDebounceTime) > debounceDelay){
        lastDebounceTime = currentMillis;
        keyState = 2;
      }
      break;
    case 2: // 等待按下6号键
      if(digitalRead(6) == LOW && (currentMillis - lastDebounceTime) > debounceDelay){
        lastDebounceTime = currentMillis;
        // 关闭RGB LED和扬声器
        b=0;r=0;g=0;
        noTone(8);
        analogWrite(11,b);
        analogWrite(10,r);
        analogWrite(9,g);
        // 重置按键状态,允许再次触发
        keyState = 0;
      }
      break;
  }

  // 光敏电阻触发报警逻辑
  if(vin>800){
    for(int i=0; i<7 ;i++){
      tone(8,notes[i],100);
      delay(200);
      noTone(8);
      analogWrite(11,random(256));
      analogWrite(10,random(256));
      analogWrite(9,random(256));
      delay(200);
    }
  }

skip_alarm_logic:
  // 距离检测逻辑
  long duration = pulseIn(3,HIGH);
  if(duration == 0){
    return;
  }
  long distance=duration/58.2;
  if (distance<5){
    c++;
  }
}

关键修改说明

  • 引脚匹配修正:将按键检测引脚改为4、5、6,和硬件连接一致。
  • 顺序触发逻辑:通过keyState变量跟踪按键按下顺序,实现依次按下4→5→6才触发关闭功能。
  • 按键消抖:使用millis()实现非阻塞消抖,避免按键抖动导致的误触发。
  • 输入模式优化:将按键引脚设置为INPUT_PULLUP,利用Arduino内部上拉电阻,简化接线(按键按下时引脚为LOW,松开为HIGH)。
  • 距离触发逻辑优化:添加goto跳过后续报警逻辑,确保次数超过5次后不再触发扬声器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:25:14