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

z01228 发表于 2020-7-9 22:25

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

本帖最后由 z01228 于 2020-7-9 23:31 编辑

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

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

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

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

/* 示例输出:t:

Starting TwoButtons...//明细
Button 1 click.--按键1单击
Button 2 click.--按键2单击
Button 1 doubleclick.--双击按钮1。
Button 2 doubleclick.--按钮2双击。
Button 1 longPress start--按钮1长按开始
Button 1 longPress...--按钮1长按...
Button 1 longPress...-按钮1长按...
Button 1 longPress...--按钮1长按...
Button 1 longPress stop--按钮1长按停止
Button 2 longPress start--按钮2长按开始
Button 2 longPress...--按钮2长按...
Button 2 longPress...--按钮2长按...
Button 2 longPress stop--按钮2长按停止

*/

#include "OneButton.h"

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


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

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

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

}


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

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


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

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


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


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


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


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


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

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


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


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


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

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


// End


z01228 发表于 2020-7-9 23:31

//实验

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

#include "OneButton.h"
OneButton button1(A1, true);
int a=1;
uint32_t t=0;
boolean b=1;
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
t=millis();

button1.attachClick(click1);//按键1单击
button1.attachDoubleClick(doubleclick1);//按键1双击
button1.attachDuringLongPress(longPress1);//按钮1长按

}

// the loop function runs over and over again forever
void loop() {
//这个函数必须在loop按键才能正常检测
    button1.tick();
   
   //单击长亮
if (a==2 ) digitalWrite(13, HIGH);
//双击长灭
if (a==3 ) digitalWrite(13, LOW);
//长按闪灯
if (a==4 ){
if(((millis()-t)>1000)&&b==1){digitalWrite(13, HIGH); b=0; t=millis();}
if(((millis()-t)>1000)&&b==0){digitalWrite(13, LOW ); b=1; t=millis();}
}

}


void click1() { a=2;}

void doubleclick1() { a=3;}

void longPress1() { a=4;}

lss123 发表于 2020-8-17 17:55

不错,好贴
页: [1]
查看完整版本: 同时检测多个按钮上的点击事件。 单击、双击、长按。