当前位置:   article > 正文

第十一篇、基于Arduino uno,获取单个按键的输入信号(滤波消抖)——结果导向_arduino按键消抖

arduino按键消抖

0、结果

说明:先来看看串口调试助手显示的结果,当按下按键的时候,按一次会打印一次按键被按下。如果是你想要的,可以接着往下看。

 1、外观

说明:虽然每个型号的按键形态各异,但是原理和代码都是适用的,只要能保证按下导通,不按下不导通就行。

 

 2、连线

说明:只需要连接两根线,一端和另一端需要保证按下导通,不按下不导通。

  • uno————按键
  • GND--------------按键一端
  • D2--------------按键另一端

下面的图是多个按键的,但是连接方式和单个的是一样的,可以参考。

3、源程序

说明:对按键进行了消抖,基本上不会存在误触发的可能,并将对应功能进行函数化,方便移植。

  1. /****************************************按键 part****************************************/
  2. /*
  3. 接线:
  4. 按键一端接GND,一端接D2,能保证按下导通,不按下不导通就行。
  5. */
  6. #define startButton 2 //按钮
  7. #define buttonON LOW //按钮按下时为低电平
  8. struct Button {
  9. int buttonState = !buttonON; //按钮状态变量,与按钮按下时的状态取反
  10. int lastButtonState = !buttonON; //按钮状态初始化,与按钮按下时的状态取反
  11. long lastDebounceTime = 0; //记录抖动变量
  12. long debounceDelay = 30; //抖动时间变量
  13. bool flag = false; //按钮flag
  14. };
  15. const int buttonPins[1] = {startButton};
  16. Button button, buttons[1]; //新建1个按钮
  17. /****************************************set up and loop part*********************************/
  18. void setup() {
  19. Serial.begin(9600); //初始化串口,波特率为9600
  20. initButtons(); //初始化所有按键串口
  21. }
  22. void loop() {
  23. getButton(startButton); //适用于单个按钮
  24. }
  25. /****************************************按键 part****************************************/
  26. /*初始化按键串口*/
  27. void initButtons() {
  28. pinMode(startButton, INPUT_PULLUP); //适用于单个按钮
  29. }
  30. /*读取按键的状态*/
  31. void getButton(int _buttonPin) {
  32. int reading = digitalRead(_buttonPin); //读取状态
  33. if (reading != button.lastButtonState) { //如果状态改变
  34. button.lastDebounceTime = millis(); //更新时间
  35. } //如果等待大于debounceDelay
  36. if ((millis() - button.lastDebounceTime) > button.debounceDelay) {
  37. if (reading != button.buttonState) { //读取状态不等于按钮状态
  38. button.buttonState = reading; //更新状态
  39. if (button.buttonState == buttonON) { //判断按钮是否真的按下
  40. Serial.println("button is pressed"); //输出按钮按下的文字
  41. button.flag = true; //按钮flag为真
  42. }
  43. else {
  44. button.flag = false; //按钮flag为假
  45. }
  46. }
  47. }
  48. button.lastButtonState = reading; //更新last状态
  49. }

4、注意事项

说明:按键有四个引脚或者三个引脚,四个引脚的按键,两个引脚挨得近的是不按下不导通,按下导通;如果是三个引脚的,随便接两个引脚就行。

5、基本原理

       在按键被按下时使得电路闭合,从而触发相应的程序操作。按键通常由两个部分组成:一个是用于连接电路的接点(也称为触点或固定触点),另一个是用于控制接点状态的弹簧式机构(也称为活动触点)。
        当按键未被按下时,接点处于断开状态,此时电路不通,无法传递电信号。当按键被按下时,机械结构将弹簧压缩,使活动触点与固定触点接触,从而形成闭合电路。在这个过程中,电流可以沿着闭合的电路流通,达到控制相应程序操作的目的。
        在Arduino中,按键的工作流程主要包括两个阶段:输入和处理。在输入阶段,当按键被按下时,Arduino会读取对应的数字或模拟输入引脚的电压状态,并将其转换为高或低电平信号。在处理阶段,Arduino根据输入信号的状态进行相应的判断和操作,如执行特定函数、调用模块等操作。

6、消抖的方法

        采用软件消抖的原理是通过编程实现,在按键被按下后,通过程序进行一定的处理和判断,使得系统仅响应有效的按键操作,避免因按键抖动等原因产生误触发现象。
        具体来说,软件消抖的原理主要包括以下几个步骤:

  1. 读取按键状态:首先需要读取按键状态,即检测输入引脚的电平是否发生变化(从高电平到低电平)。可以使用Arduino中的digitalRead函数实现该功能。

  2. 延时消抖:当检测到按键状态发生变化时,需要延时一段时间,以等待按键抖动消除。可以使用Arduino中的delay函数或借助定时器实现延时功能。

  3. 再次读取按键状态:在延时结束后,需要再次读取按键状态,并与之前的状态比较,以确定是否发生有效的按键操作。只有当两次读取的状态相同,且状态为低电平时,才表示发生了有效的按键操作。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/67614
推荐阅读
相关标签
  

闽ICP备14008679号