文章目录
前言
在ESP32的开发过程中,我们经常会遇到需要使用按钮进行交互的情况。然而,按钮的使用并不总是那么直观,特别是当我们需要识别单击、双击或长按等不同的按钮事件时。这时,OneButton库就派上了用场。
OneButton库简介
OneButton库是一个为Arduino设计的库,它可以改善单个按钮的输入使用。这个库能够检测一些典型的按钮按压事件,如单击、双击和长时间按压。这使得我们可以重复使用同一个按钮进行多种功能,从而降低硬件投资。
OneButton库的使用非常简单,只需要包含头文件,然后实例化一个OneButton对象,就可以开始使用了。此外,该库还提供了一些方法,如setDebounceTicks
设置去除抖动间隔,setClickTicks
设置单击检测间隔,setPressTicks
设置长按检测间隔,以及attachClick
绑定点击响应方法,attachDoubleClick
绑定双击响应方法等。
OneButton的使用
OneButtonTiny
对于较为简单的按键检测,我们可以使用OneButtonTiny
,当然,你可以直接使用OneButton
,OneButtonTiny
我们可以在文件->示例->OneButton->BlinkMachine找到他
#include "OneButtonTiny.h" // This example also works with reduced OneButtonTiny class saving.
OneButtonTiny构造函数
explicit OneButtonTiny(const int pin, const boolean activeLow = true, const bool pullupActive = true);
参数1为你的输入引脚
OneButtonTiny构造函数的第二个参数是一个布尔值,用于设置按钮的活动状态。如果这个参数为true
,那么按钮将被设置为活动低电平。这意味着当按钮被按下时,引脚读取为LOW。如果这个参数为false
,那么按钮将被设置为活动高电平。这意味着当按钮被按下时,引脚读取为HIGH。这个参数允许你根据你的硬件设置和需求来配置按钮的行为。总的来说,这个参数为你提供了一种灵活的方式来定义按钮的活动状态。这对于处理不同类型的按钮输入非常有用。例如,你可能有一个按钮在按下时连接到地线(活动低电平),或者你可能有一个按钮在按下时连接到电源(活动高电平)。这个参数就是用来处理这些情况的。
OneButtonTiny构造函数的第三个参数是一个布尔值,用于设置是否启用内部上拉电阻。如果这个参数为true
,那么将启用内部上拉电阻。这意味着当按钮未按下时,引脚读取为HIGH。如果这个参数为false
,那么将禁用内部上拉电阻。这个参数允许你根据你的硬件设置和需求来配置按钮的行为。总的来说,这个参数为你提供了一种灵活的方式来定义按钮的电阻状态。这对于处理不同类型的按钮输入非常有用。例如,你可能有一个按钮在未按下时需要连接到电源(启用内部上拉电阻),或者你可能有一个按钮在未按下时需要连接到地线(禁用内部上拉电阻)。这个参数就是用来处理这些情况的。
设置按钮点击的对应事件
下面三个函数分别是设置单击事件,双击事件和长按事件的函数,他的参数是触发这些事件后你需要执行的操作函数
void attachClick(callbackFunction newFunction);
/**
* Attach an event to be called after a double click is detected.
* @param newFunction This function will be called when the event has been detected.
*/
void attachDoubleClick(callbackFunction newFunction);
/**
* Attach an event to fire when the button is pressed and held down.
* @param newFunction
*/
void attachLongPressStart(callbackFunction newFunction);
callbackFunction
是无参数无返回值的函数:
typedef void (*callbackFunction)(void);
扫描按键状态
这个函数会扫描是否触发了单击事件,双击事件和长按事件,触发了就执行你的回调函数
/**
* @brief Call this function every some milliseconds for checking the input
* level at the initialized digital pin.
*/
void tick(void);
示例代码
// #include "OneButton.h"
#include "OneButtonTiny.h" // This example also works with reduced OneButtonTiny class saving.
// The actions I ca do...
typedef enum {
ACTION_OFF, // set LED "OFF".
ACTION_ON, // set LED "ON"
ACTION_SLOW, // blink LED "SLOW"
ACTION_FAST // blink LED "FAST"
} MyActions;
// Example pin assignments for a ESP32 board
// Some boards have a BOOT switch using GPIO 0.
#define PIN_INPUT 0
// Attach a LED using GPIO 25 and VCC. The LED is on when output level is LOW.
#define PIN_LED 25
// Setup a new OneButton on pin PIN_INPUT.
// OneButton button(PIN_INPUT, true);
OneButtonTiny button(PIN_INPUT, true); // This example also works with reduced OneButtonTiny class saving.
MyActions nextAction = ACTION_OFF; // no action when starting
// setup code here, to run once.
void setup() {
// enable the standard led on pin 13.
pinMode(PIN_LED, OUTPUT); // sets the digital pin as output
// link the myClickFunction function to be called on a click event.
button.attachClick(myClickFunction);
// link the doubleclick function to be called on a doubleclick event.
button.attachDoubleClick(myDoubleClickFunction);
// link the doubleclick function to be called on a doubleclick event.
button.attachLongPressStart(myDoubleClickFunction);
// set 80 msec. debouncing time. Default is 50 msec.
button.setDebounceMs(80);
} // setup
// main code here, to run repeatedly:
void loop() {
unsigned long now = millis();
// keep watching the push button:
button.tick();
// You can implement other code in here or just wait a while
if (nextAction == ACTION_OFF) {
// do nothing.
digitalWrite(PIN_LED, LOW);
} else if (nextAction == ACTION_ON) {
// turn LED on
digitalWrite(PIN_LED, HIGH);
} else if (nextAction == ACTION_SLOW) {
// do a slow blinking
if (now % 1000 < 500) {
digitalWrite(PIN_LED, LOW);
} else {
digitalWrite(PIN_LED, HIGH);
} // if
} else if (nextAction == ACTION_FAST) {
// do a fast blinking
if (now % 200 < 100) {
digitalWrite(PIN_LED, LOW);
} else {
digitalWrite(PIN_LED, HIGH);
} // if
} // if
} // loop
// this function will be called when the button was pressed 1 time and them some time has passed.
void myClickFunction() {
if (nextAction == ACTION_OFF)
nextAction = ACTION_ON;
else
nextAction = ACTION_OFF;
} // myClickFunction
// this function will be called when the button was pressed 2 times in a short timeframe.
void myDoubleClickFunction() {
if (nextAction == ACTION_ON) {
nextAction = ACTION_SLOW;
} else if (nextAction == ACTION_SLOW) {
nextAction = ACTION_FAST;
} else if (nextAction == ACTION_FAST) {
nextAction = ACTION_ON;
} // if
} // myDoubleClickFunction
// this function will be called when a long press was detected.
void myLongPressFunction() {
nextAction = ACTION_OFF;
} // myLongPressFunction
// End
总结
总的来说,OneButton库是一个强大而灵活的工具,它可以大大简化我们在使用ESP32进行开发时对按钮输入的处理。无论你是一个初学者,还是一个有经验的开发者,我都强烈推荐你尝试使用OneButton库,我相信你会发现它的强大之处的。在接下来的教程中,我们将深入探讨如何在实际项目中使用OneButton库,敬请期待!
标签:教程,LED,esp32,OneButtonTiny,按钮,ACTION,OneButton,nextAction From: https://blog.csdn.net/m0_62599305/article/details/140374351