同时检测多个按钮上的点击事件。 单击、双击、长按。-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5273|回复: 2

同时检测多个按钮上的点击事件。 单击、双击、长按。

[复制链接]
发表于 2020-7-9 22:25 | 显示全部楼层 |阅读模式
本帖最后由 z01228 于 2020-7-9 23:31 编辑

使用OneButton库
  1. / *TwoButtons实例
  2. 这是一个示例草图,显示了如何使用OneButtonLibrary
  3. 同时检测2个按钮上的点击事件。
  4. 库的内部说明在
  5. http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

  6. 设置测试电路:低电平有效。
  7. *将按钮连接到引脚A1(ButtonPin)并接地。
  8. *将按钮连接到引脚A2(ButtonPin)并接地。
  9. *串行接口用于输出检测到的按钮事件。

  10. 草图显示了如何设置库并将2个按钮绑定到其功能。
  11. 在循环功能中,必须根据需要多次调用button1.tick和button2.tick函数。
  12. * /

  13. // 01.03.2014 created by Matthias Hertel
  14. // ... and working.

  15. /* 示例输出:t:

  16. Starting TwoButtons...//明细
  17. Button 1 click.--按键1单击
  18. Button 2 click.--按键2单击
  19. Button 1 doubleclick.--双击按钮1。
  20. Button 2 doubleclick.--按钮2双击。
  21. Button 1 longPress start--按钮1长按开始
  22. Button 1 longPress...--按钮1长按...
  23. Button 1 longPress...-按钮1长按...
  24. Button 1 longPress...--按钮1长按...
  25. Button 1 longPress stop--按钮1长按停止
  26. Button 2 longPress start--按钮2长按开始
  27. Button 2 longPress...--按钮2长按...
  28. Button 2 longPress...--按钮2长按...
  29. Button 2 longPress stop--按钮2长按停止

  30. */

  31. #include "OneButton.h"

  32. // 在引脚A1上设置一个新的OneButton。  
  33. OneButton button1(A1, true);
  34. // //在引脚A2上设置一个新的OneButton。
  35. OneButton button2(A2, true);


  36. // 在此处设置代码,使其运行一次:
  37. void setup() {
  38.   // 设置串行端口。参见http://arduino.cc/en/Serial/IfSerial
  39.   Serial.begin(9600);
  40.   while (!Serial) {
  41.     ; // 等待串口连接。仅莱昂纳多需要
  42.   }
  43.   Serial.println("Starting TwoButtons...");

  44.   // 链接按钮1的功能。注册被调函数
  45.   button1.attachClick(click1);//按键1单击
  46.   button1.attachDoubleClick(doubleclick1);//按键1双击
  47.   button1.attachLongPressStart(longPressStart1);//按键1长按开始
  48.   button1.attachLongPressStop(longPressStop1);//按钮1长按停止
  49.   button1.attachDuringLongPress(longPress1);//按钮1长按

  50.   // 链接按钮2个功能。注册被调函数
  51.   button2.attachClick(click2);//按键2单击
  52.   button2.attachDoubleClick(doubleclick2);//按键2双击
  53.   button2.attachLongPressStart(longPressStart2);//按键2长按开始
  54.   button2.attachLongPressStop(longPressStop2);//按钮2长按停止
  55.   button2.attachDuringLongPress(longPress2);//按钮2长按

  56. }


  57. // 这里的主要代码,可以重复运行:
  58. void loop() {
  59.   // 按键执行函数这个必须在loop中:
  60.   button1.tick();
  61.   button2.tick();

  62.   // 您可以在此处实现其他代码,也可以稍等片刻
  63.   delay(10);
  64. } // loop


  65. // ----- 按钮1回调函数

  66. // 按下button1 1次(然后不按2.按钮)将调用此函数。
  67. void click1() {
  68.   Serial.println("单击按钮1。");
  69. } // click1


  70. // 如果在短时间内两次按下button1,则将调用此函数。
  71. void doubleclick1() {
  72.   Serial.println("按钮1双击。");
  73. } // doubleclick1


  74. // 长时间按下button1时,将调用一次此函数。
  75. void longPressStart1() {
  76.   Serial.println("Button 1 longPress start");
  77. } // longPressStart1


  78. // 长时间按下button1时,通常会调用此函数.
  79. void longPress1() {
  80.   Serial.println("Button 1 longPress...");
  81. } // longPress1


  82. // 当长时间按下蜂鸣器后释放button1时,该函数将被调用一次.
  83. void longPressStop1() {
  84.   Serial.println("Button 1 longPress stop");
  85. } // longPressStop1


  86. // ...与按钮2相同:

  87. void click2() {
  88.   Serial.println("单击按钮2.");
  89. } // click2


  90. void doubleclick2() {
  91.   Serial.println("按钮2双击.");
  92. } // doubleclick2


  93. void longPressStart2() {
  94.   Serial.println("Button 2 longPress start");
  95. } // longPressStart2


  96. void longPress2() {
  97.   Serial.println("Button 2 longPress...");
  98. } // longPress2

  99. void longPressStop2() {
  100.   Serial.println("Button 2 longPress stop");
  101. } // longPressStop2


  102. // End
复制代码


OneButton-master.zip

15.67 KB, 下载次数: 72

 楼主| 发表于 2020-7-9 23:31 | 显示全部楼层
//实验

  1. //检测A1按钮上的点击事件。 单击、双击、长按。 低电平有效。
  2. //使用millis();loop中不使用delay();函数防止程序卡,出现按键按完不执行。

  3. #include "OneButton.h"
  4. OneButton button1(A1, true);
  5. int a=1;
  6. uint32_t t=0;
  7. boolean b=1;
  8. void setup() {
  9.   pinMode(13, OUTPUT);
  10.   digitalWrite(13, LOW);
  11.   t=millis();
  12.   
  13.   button1.attachClick(click1);//按键1单击
  14.   button1.attachDoubleClick(doubleclick1);//按键1双击
  15.   button1.attachDuringLongPress(longPress1);//按钮1长按
  16.   
  17. }

  18. // the loop function runs over and over again forever
  19. void loop() {
  20.   //这个函数必须在loop按键才能正常检测
  21.     button1.tick();
  22.    
  23.    //单击长亮
  24.   if (a==2 ) digitalWrite(13, HIGH);
  25.   //双击长灭
  26.   if (a==3 ) digitalWrite(13, LOW);
  27.   //长按闪灯
  28.   if (a==4 ){
  29.   if(((millis()-t)>1000)&&b==1){digitalWrite(13, HIGH); b=0; t=millis();}
  30.   if(((millis()-t)>1000)&&b==0){digitalWrite(13, LOW ); b=1; t=millis();}
  31.   }
  32.   
  33. }


  34. void click1() { a=2;}

  35. void doubleclick1() { a=3;}

  36. void longPress1() { a=4;}
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 05:14 , Processed in 0.115586 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表