【问题标题】:Arduino push button debounceArduino 按钮去抖动
【发布时间】:2025-12-22 12:40:07
【问题描述】:

我需要关于按钮去抖动的帮助。有时它会向串行链路发送两次相同的字符串,我不知道为什么。谁能帮帮我,哪里有问题?

int reading;
int exbutton= LOW;
unsigned long ddelay= 200;
unsigned long last= 0;
void loop(){
    reading= digitalRead(prkgbrake);
   if (reading== HIGH && exbutton == LOW && millis() - last> ddelay){
    if (brake == 0){
      Serial.write("brake:1\n");
      while( digitalRead(prkgbrake) == HIGH){
      }
    }
    else{
      Serial.write("brake:0\n");
      while( digitalRead(prkgbrake) == HIGH){
      }
    }
    last = millis();
  }

提前谢谢你。

【问题讨论】:

    标签: arduino debouncing


    【解决方案1】:

    我希望你没有从某个地方复制这段代码,有些代码没有意义。

    例如,什么是“prkgbrake”?什么是“刹车”?它们没有被声明。为什么没有“setup()”函数?

    尽管如此,可以通过多种方式实现去抖动。我会修复你的代码。这样你就会明白你做错了什么。

    int exbutton        = LOW;
    unsigned int _delay = 200;
    int pushButton      = 2;
    
    void setup() 
    {
      // initialize serial communication at 9600 bits per second:
      Serial.begin(9600);
      pinMode(pushButton, INPUT_PULLUP);
    }
    
    void loop()
    {
       while (digitalRead(pushButton) == LOW && exbutton == LOW)
       {
          if((millis() - last) > _delay)
          {
              Serial.println("Button Pressed");
              while(digitalRead(pushButton) == LOW);
          }
       }
       last = millis();
    }
    

    说明:
    假设您的按钮与数字引脚 2 连接。当您将数字引脚与按钮一起使用时,最好使用上拉/下拉。您可以为此使用外部电阻器或内部电阻器。内部电阻只支持上拉。

    要了解有关上拉/下拉结帐的更多信息,请查看此Arduino page。底线是当您使用引脚作为输入时,它就像天线一样,可以捕获来自周围环境的信号,称为浮动状态。因此最好将引脚保持在已知状态。如果您使用内部上拉,引脚将始终为HIGH。因此,按钮配置必须以某种方式进行,以便在按下时引脚应该变为LOW

    Pull Up Configuration

    代码pinMode(pushButton, INPUT_PULLUP); 启用数字引脚2 作为输入并启用上拉。

    loop() 应该像这样工作:

    1) 检查按钮是否被按下(即是否为LOW)。

    2) 如果不更新 last 变量。

    3) 如果是,则不要更新last,并进入while 循环。

    4) 现在继续检查millis()-last 是否大于_delay。如果不是,它将返回while 循环并检查按钮是否仍被按下。如果是,那么它将返回并检查millis()-last 是否大于_delay。它将继续这样做,直到超过上述的去抖动延迟量。

    5) 如果按钮在 '_delay' 时间之前被按下(即转到HIGH),那么它将更新last 并检查按钮是否被按下并开始计算延迟时间。

    注意使用_delay 变量。它将定义按钮的响应能力。

    【讨论】: