这个Arduino库正在改进单个按钮的输入使用。它展示了如何使用一个带有一个按钮的数字输入管脚来检测一些典型的按钮按下事件,如单次单击、双击和long-time按下。这使您能够将同一个按钮用于多个功能,并降低了硬件投资。
这也是一个使用上面的简单模式实现简单finite-state机器的示例。
您可以在http://www.mathertel.de/Arduino/OneButtonLibrary.aspx上找到有关此库的更多详细信息
将此存储库克隆到Arduino/Libraries或使用ArduinoIDE库管理器安装此库的副本。您可以在Arduino的网站上找到有关安装库的更多详细信息。
#include <Arduino.h> #include <OneButton.h>
每个物理按钮都需要自己的OneButton实例。可以这样初始化它们:
#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 );
#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!"); });
为了使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(bool)时指定一个逻辑级别,这将跳过读取pin并使用该级别。如果您想重置按钮的内部状态,请致电reset()。
如果您的按钮没有按应有的方式工作,请检查以下项目:
I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。
ESP32的DAC函数可以实现真正的模拟输出。
ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。
本文档作为UNO R4 WiFi的技术概览,您将找到一系列资源和指南链接,帮助您开始下一个项目。
本文从Arduino Uno入手,看看怎样在这个"简单"的8bit单片机搭建一个属于自己的bootloader