这个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()。
如果您的按钮没有按应有的方式工作,请检查以下项目:
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚。
Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789
Queue 库提供了一个通用的 C++ 动态队列实现,专为在 Arduino 项目中使用而定制。
本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。
ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。
用于Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示器提供了通用语法和图形功能集。这使Arduino程序可以轻松地在显示类型之间进行调整,而不必花太多精力……
在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。