首页 > 解决方案 > Arduino 按钮弹跳

问题描述

我的按钮有什么问题,它不能正常工作,我想知道为什么。我不明白。按钮通过 5V 连接,然后连接一个 10k 电阻并用电线接地。我认为 isr 已正确实施。而且功能也是正确的。但我真的不明白 Button 的问题是什么。我尝试了一个电容器,但效果不佳……我直接在按钮之前连接了它。

#include <LiquidCrystal.h>

LiquidCrystal lcd(5, 6, 9, 10, 11, 12);


unsigned long volatile startTime = 0;
unsigned long volatile endTime = 0;
unsigned long volatile  sec;
volatile boolean buttonState;
const int button = 2;
long ms;
long timeT;
long z;

void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:

  pinMode(button, INPUT_PULLUP);

  lcd.setCursor(0, 0);
  lcd.print("Stopwatch");


  attachInterrupt(digitalPinToInterrupt(button), isr, FALLING);

}

void loop() {


  if (buttonState == LOW) {

    startTime = millis();
  }

  while (buttonState == HIGH) {


    z = (millis() - startTime);
    sec = (z / 1000);
    ms = z % 1000;
    lcd.setCursor(0, 1);
    lcd.print(sec);
    lcd.print(".");
    lcd.print(ms);
    lcd.setCursor(9, 1);
    lcd.print("Secs");

  }

}
//Interrupt Service Routines
void isr() {
  buttonState = !buttonState;
}

标签: c++button

解决方案


按钮是古怪的东西。他们可能会发送多个信号(相反,联系人不会立即稳定)。冷凝器可能会有所帮助,但这也可以输出波形信号并触发多个“事件”,无论如何,它会引入延迟。

所以,延迟延迟,你可以做这样的事情应该更可控:

if (buttonState !== previousState) {
    startTime = millis();
    previousState = buttonState;
    triggered = 0;
} else {
    if (0 == triggered) {
        if ((millis() - startTime) > threshold) {
            triggered = 1;
            // Okay, buttonState is now reliably LOW or HIGH
            ...
        }
    } else {
        // Continuous event (pressed or not-pressed)
    }
}

在实践中,这应该只在按钮被不间断地按下或释放“阈值”毫秒时做出反应。假设 BTN 是按钮的实际信号,没有任何其他参与硬件,

                   1        2    3                     4       5   6
BTN: LLLLLLLLLLLLLLHLHHLHHHLHHHHHHHHHHHHHHHHHHHHHHHHHHHLHHHLLHHLLLLLLLLL
FLT: ___________________________-----------------------------------_____
Time --------------------------------------------------------------->

1 button is physically pressed
2 button is now truly pressed
3 stable button press is detected
4 button begins to be released
5 button is now fully released
6 stable button release is detected

推荐阅读