0

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

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();
  }

先感谢您。

4

1 回答 1

0

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

例如,什么是“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 页面。底线是当您使用引脚作为输入时,它就像天线一样,可以捕获来自周围环境的信号,称为浮动状态。因此最好将引脚保持在已知状态。如果您使用内部上拉,引脚将始终为HIGH。所以按钮配置必须以某种方式使当它被按下时针应该去LOW

上拉配置

该代码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变量。它将定义按钮的响应能力。

于 2016-09-08T22:16:13.413 回答