首页 > 其他分享 >【史上最全面esp32教程】OneButton库的使用(一)

【史上最全面esp32教程】OneButton库的使用(一)

时间:2024-07-12 12:28:46浏览次数:13  
标签:教程 LED esp32 OneButtonTiny 按钮 ACTION OneButton nextAction

文章目录


前言

在ESP32的开发过程中,我们经常会遇到需要使用按钮进行交互的情况。然而,按钮的使用并不总是那么直观,特别是当我们需要识别单击、双击或长按等不同的按钮事件时。这时,OneButton库就派上了用场。


OneButton库简介

OneButton库是一个为Arduino设计的库,它可以改善单个按钮的输入使用。这个库能够检测一些典型的按钮按压事件,如单击、双击和长时间按压。这使得我们可以重复使用同一个按钮进行多种功能,从而降低硬件投资。

OneButton库的使用非常简单,只需要包含头文件,然后实例化一个OneButton对象,就可以开始使用了。此外,该库还提供了一些方法,如setDebounceTicks设置去除抖动间隔,setClickTicks设置单击检测间隔,setPressTicks设置长按检测间隔,以及attachClick绑定点击响应方法,attachDoubleClick绑定双击响应方法等。

OneButton的使用

OneButtonTiny

对于较为简单的按键检测,我们可以使用OneButtonTiny,当然,你可以直接使用OneButtonOneButtonTiny我们可以在文件->示例->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

相关文章

  • 【史上最全面ESP32】软件中断与硬件中断
    文章目录前言硬件中断硬件中断概念硬件中断的使用软件中断软件中断概念软件中断的使用总结前言ESP32是一款高度集成的芯片,具有强大的中断处理能力。在ESP32中,我们可以配置所有的GPIO引脚作为硬件中断源,通过附加它们到相应的中断服务例程(ISR)来启用中断。此外,ESP32......
  • 【史上最全面ESP32教程】http通信
    文章目录前言HTTP协议是什么?HTTP协议的特点HTTP协议的常见应用esp32使用http通信通信流程基础使用HTTPClient常用的函数函数介绍:`voidend(void);``boolconnected(void);``voidsetReuse(boolreuse);``voidsetUserAgent(constString&userAgent);``voidsetAuthor......
  • 闯荡西游之路,续写经典传奇,大话西游图文架设教程
    前言这次给大家带来的是我精心准备了很久的,也是大家呼声很高的大话西游,云集西游版本,安卓苹果双端,非变态版本,包含天梯、星阵、八卦等玩法,游戏内置GM后台,快来体验一下吧~本文讲解大话西游架设教程,闯荡西游路,天地任我行!不知道这款IP游戏,是不是有你的青春呢~我架设的大话西游请关......
  • 仙侠天花板,圆你土豪梦,上古传说手游详细图文架设教程
    前言这次给大家带来的是一款我的心头好,绝对是我所有架设游戏里排名前三的,一款经典的仙侠手游,安卓苹果双端,画质精美程度真的没有哪几个游戏可以比得上,故事情节加上背景音乐绝对值得沉浸其中慢慢玩,最主要的是这款游戏真的是基本没有任何BUG,玩法功能非常多,这么说吧,给你全后台所有功......
  • 一类账户认证API在Java、Python、PHP中的使用教程
    随着金融科技的快速发展,一类账户认证在金融服务中扮演着越来越重要的角色。对于个人和企业而言,拥有一个高级别的账户不仅能提高交易效率,还能享受到更多优惠和服务。然而,这也带来了账户安全的挑战和风险。为了确保账户的真实性和合法性,一类账户认证应运而生。它通过对用户......
  • ESP32纯Cj简单实现图片上传阿里云OSS
    对于嵌入式设备资源较少或者运行环境较简单的环境下,如果只是简单上传一张图片到阿里云OSS服务器的话,移植阿里云OSS的SDK就是一件性价比很低而且不一定能实现的事情了。那就得考虑自己实现一套简单的、最基础的图片上传功能。阿里云OSS提供了RESTAPI方式的图片上传接口,即通过HTTP......
  • [ Office安装 ] Mocreak 傻瓜式安装教程
    微软Office办公软件安装除了官方的安装包外,还可以通过部署工具来安装各种版本的Office,其中目前比较流行的是OfficeToolPlus和Office2013-2021C2RInstall这两个软件。今天再分享一个类似的Office部署工具「Mocreak」同样傻瓜式可以一键自动化、无人值守下载、安......
  • Python爬虫实战案例,从入门到进阶,零基础教程!
    这篇文章我们介绍了一下Python中的正则表达式和与爬虫正则相关的re模块,本章我们就利用正则表达式和re模块来做一个案例,爬取《糗事百科》的糗事并存储到本地。我们要爬取的网站链接是 https://www.qiushibaike.com/text/page/1/ 。我们要爬取的是里面的糗事,在之前......
  • Python爬虫入门详细教程,通俗易懂,看一遍就会!(含实例)
    一、正确认识Python爬虫爬虫是门很有意思的技术,可以通过爬虫技术获取一些别人拿不到或者需要付费才能拿到的东西,也可以对大量数据进行自动爬取和保存,减少时间和精力去手动做一些累活。【爬虫资料领取方式在文末!!】可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余......
  • 总结24个Python接单赚钱平台与详细教程,兼职月入5000+
     如果说当下什么编程语言最靠谱或者比较适合搞副业?答案肯定100%是:Python。python是所有语法中最简单易上手的语言,不需要特别的的英语词汇量,逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据,制作各种图表,提升工作效率。而且还能利用业余时间接点私活......