如何让按钮读取一次单击而不是在arduino中按住

How to make button read a single click and not hold in arduino

我正在 Arduino 中制作一个非常简单的项目,除了将点击读取为按住的按钮外,它一切正常,我希望它可以通过单击读取。

我有一个连接到我的 Arduino 的数字显示器,它应该显示数字 5,一旦我点击按钮,数字应该增加 5,但是当我点击它时它会一直增加 5 直到我松手,所以单击一次从 5 变为 155,而不是 10。

 buttonState = digitalRead (btnPin);
 if (buttonState == LOW)
  {
    leilao = leilao + 5;
    sevseg.setNumber(leilao);
    sevseg.refreshDisplay(); 
    previousMillis = currentMillis;
  }

"leilao" 是应该增加 5 的值。

您需要获取信号的"edge"。试试这个:

#define btnPin 2

uint8_t btn_prev;

void setup() {
  pinMode(btnPin, INPUT_PULLUP);

  btn_prev = digitalRead(btnPin);
}

void loop() {
 uint8_t btn = digitalRead(btnPin);

 if (btn == LOW && btn_prev == HIGH)
  {
    //your code here
  }

  btn_prev = digitalRead(btnPin);
}

您可以将按钮信号想象成一个正方形。不按的时候什么都没有,按的时候有电压流动,所以是这样的:

所以您的原始代码在整个 "on" 持续时间内更改值。上面的代码在图中查找 "rising edge",理论上它是一个单一的时刻。

如果这对您不起作用,请查看 Arduino 的 "Debouncing" 教程,其中还添加了时间概念,直到您的代码被触发 here

假设:

  1. 按钮的一端连接到引脚 2,按钮的另一端连接到 Arduino Uno 微控制器板的 GND。
  2. 在设置中,引脚 2 初始化如下:pinMode(2, INPUT_PULLUP);

单击按钮可以定义为按下按钮后松开按钮。通过使用 digitalRead(2) 读取引脚,可以在引脚中检测到按钮按下或按钮释放。如果读取的值为 LOW,则按钮已被按下。如果读取的值为 HIGH,则按钮已被释放。因此,如果两次连续读取的值是 LOWHIGH,则发生按钮点击。 A Petri Net Model of Button Clicks 包括您描述的系统的模拟和示例草图。