OneButton: 用于使用单个按钮进行多用途输入的Arduino库

Arduino OneButton库是一个用于简化按钮操作的库,它可以轻松地处理按钮的单击、双击和长按等操作。适用于Arduino开发板以及ESP32等其他基于Arduino的开发板。

这个Arduino库正在改进单个按钮的输入使用。它展示了如何使用一个带有一个按钮的数字输入管脚来检测一些典型的按钮按下事件,如单次单击、双击和long-time按下。这使您能够将同一个按钮用于多个功能,并降低了硬件投资。

这也是一个使用上面的简单模式实现简单finite-state机器的示例。

您可以在http://www.mathertel.de/Arduino/OneButtonLibrary.aspx上找到有关此库的更多详细信息

开始

将此存储库克隆到Arduino/Libraries或使用ArduinoIDE库管理器安装此库的副本。您可以在Arduino的网站上找到有关安装库的更多详细信息。

#include <Arduino.h>
#include <OneButton.h>

每个物理按钮都需要自己的OneButton实例。可以这样初始化它们:

将按钮初始化为GND

#define BUTTON_PIN 4

/**
* Initialize a new OneButton instance for a button
* connected to digital pin 4 and GND, which is active low
* and uses the internal pull-up resistor.
*/
OneButton btn = OneButton(
  BUTTON_PIN,  // Input pin for the button
  true,        // Button is active LOW
  true         // Enable internal pull-up resistor
);

将按钮初始化为VCC

#define BUTTON_PIN 4

/**
* Initialize a new OneButton instance for a button
* connected to digital pin 4, which is active high.
* As this does not use any internal resistor
* an external resistor (4.7k) may be required to create a LOW signal when the button is not pressed.
*/
OneButton btn = OneButton(
  BUTTON_PIN,  // Input pin for the button
  false,       // Button is active high
  false        // Disable internal pull-up resistor
);

连接到事件处理函数

初始化按钮后,可以通过将事件附加到按钮实例来处理事件。事件可以是静态函数,也可以是lambda(没有捕获变量)。

// Handler function for a single click:
static void handleClick() {
  Serial.println("Clicked!");
}

// Single Click event attachment
btn.attachClick(handleClick);

// Double Click event attachment with lambda
btn.attachDoubleClick([]() {
  Serial.println("Double Pressed!");
});

别忘了tick()!

为了使OneButton正常工作,必须在主loop()内的每个按钮实例上调用tick()。如果你没有得到任何按钮事件,这可能就是原因。

void loop() {
  btn.tick();

  // Do other things...
}

事件

以下是此库处理的事件的完整列表:

连接方法 描述
attachClick 一旦检测到一次单击就激发。
attachDoubleClick 检测到双击时立即激发。
attachPressStart 按下按钮后立即点火。
attachLongPressStart 按下按钮1秒后激发。
attachDuringLongPress 只要按下按钮,就会定期触发。
attachLongPressStop 长时间按住按钮释放时激发。

事件计时

当在指定毫秒数后调用tick()时,将发生有效事件。您可以使用以下函数更改计时。

注意:附加双击将增加检测单个单击的延迟。如果未附加双击事件,则库将在一次单击持续时间后假定有效的单次单击,否则它必须等待双击超时结束。

方法 默认值 (ms) 描述
setDebounceTicks(int) 50 忽略其他级别更改的时间段。
setClickTicks(int) 600 用于区分单次单击和双击的超时。
setPressTicks(int) 1000 按住按钮以触发长按的持续时间。

其他方法

OneButton还提供了几个用于查询按钮状态的附加函数:

方法 描述
bool isLongPressed() 检测按钮当前是否处于长按状态。
int getPressedTicks() 获取当前按下按钮的毫秒数。

tick() and reset()

您可以在调用tick(bool)时指定一个逻辑级别,这将跳过读取pin并使用该级别。如果您想重置按钮的内部状态,请致电reset()。

问题

如果您的按钮没有按应有的方式工作,请检查以下项目:

  1. 检查你的线路和引脚编号。
  2. 您是否对循环中的每个按钮实例调用了tick()?
  3. 你有没有在不调整时钟刻度的情况下改变时钟计时器?
- 本文内容来自网络,如有侵权,请联系本站处理。

2024-01   阅读(955)   评论(0)
 标签: 创客 Arduino

涨知识
SPI

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。

评论:
相关文章
ESP32 + Arduino使用TFT_eSPI库

Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789


Arduino 数据结构: 队列Queue

Queue 库提供了一个通用的 C++ 动态队列实现,专为在 Arduino 项目中使用而定制。


小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


Arduino 数据结构: ArrayList

ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


Arduino 和 TB6612FNG 驱动直流电机

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。


Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。


Adafruit GFX图形库的使用

用于Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示器提供了通用语法和图形功能集。这使Arduino程序可以轻松地在显示类型之间进行调整,而不必花太多精力……


Arduino Serial 接收数字

在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。