双按键 Unit

Dual Button Unit 提供两个独立按键。使用 DualButtonUnit 可处理单击、双击、长按和回调;使用 SimpleDualButtonUnit 可直接读取引脚并轮询消抖后的边沿事件。

支持以下产品:

Dual_Button

UiFlow2 应用示例

按键事件

在 UiFlow2 中打开 dual_button_core_example.m5f2 项目。

本示例演示如何在 UiFlow2 中读取按键状态并处理按键事件。

UiFlow2 代码块:

example.png

示例输出:

按键事件发生时显示按键状态。

MicroPython 应用示例

按键事件与回调

本示例演示如何使用 DualButtonUnit 处理按键状态、单击、长按和回调。

MicroPython 代码块:

 1import os, sys, io
 2import M5
 3from M5 import *
 4from unit import DualButtonUnit
 5
 6
 7dual_button_0_blue = None
 8dual_button_0_red = None
 9
10
11def dual_button_0_blue_wasClicked_event(state):  # noqa: N802
12    global dual_button_0_blue, dual_button_0_red
13    print(dual_button_0_blue.isHolding())
14
15
16def setup():
17    global dual_button_0_blue, dual_button_0_red
18
19    M5.begin()
20    Widgets.fillScreen(0x222222)
21
22    dual_button_0_blue, dual_button_0_red = DualButtonUnit((36, 26))
23    dual_button_0_blue.setCallback(
24        type=dual_button_0_blue.CB_TYPE.WAS_CLICKED, cb=dual_button_0_blue_wasClicked_event
25    )
26    print(dual_button_0_blue.isHolding())
27
28
29def loop():
30    global dual_button_0_blue, dual_button_0_red
31    M5.update()
32    dual_button_0_blue.tick(None)
33
34
35if __name__ == "__main__":
36    try:
37        setup()
38        while True:
39            loop()
40    except (Exception, KeyboardInterrupt) as e:
41        try:
42            from utility import print_error_msg
43
44            print_error_msg(e)
45        except ImportError:
46            print("please update to latest firmware")

示例输出:

蓝色按键事件发生时打印按键状态。

简单轮询

本示例演示如何使用 SimpleDualButtonUnit 直接读取引脚,并在无需 tick() 或回调的情况下轮询消抖后的按下和释放边沿。

MicroPython 代码块:

 1import os, sys, io
 2import time
 3
 4import M5
 5from M5 import *
 6from unit import SimpleDualButtonUnit
 7
 8
 9blue = None
10red = None
11
12
13def setup():
14    global blue, red
15
16    M5.begin()
17    Widgets.fillScreen(0x222222)
18
19    blue, red = SimpleDualButtonUnit((36, 26))
20
21
22def loop():
23    global blue, red
24    M5.update()
25    blue.update()
26    red.update()
27
28    if blue.was_pressed():
29        print("blue pressed, pin value:", blue.value())
30    if blue.was_released():
31        print("blue released, active:", blue.is_active())
32
33    if red.was_pressed():
34        print("red pressed, pin value:", red.value())
35    if red.was_released():
36        print("red released, active:", red.is_active())
37
38    time.sleep_ms(10)
39
40
41if __name__ == "__main__":
42    try:
43        setup()
44        while True:
45            loop()
46    except (Exception, KeyboardInterrupt) as e:
47        try:
48            from utility import print_error_msg
49
50            print_error_msg(e)
51        except ImportError:
52            print("please update to latest firmware")

示例输出:

打印蓝色和红色按键的按下与释放事件。

API

DualButtonUnit

DualButtonUnit(port)

创建两个功能完整的按键对象。

参数:

port (tuple) – 两个按键的引脚号。

返回:

蓝色和红色 hardware.Button 按键对象。

返回类型:

tuple

UiFlow2 代码块:

init.png

Dual_Button.isHolding()

返回按键当前是否处于长按状态。

UiFlow2 代码块:

get_status.png

Dual_Button.setCallback(type, cb)

为指定的按键事件注册回调函数。

参数:
  • type (int) – 按键事件类型。

  • cb (callable) – 事件发生时调用的函数。

UiFlow2 代码块:

setCallback.png

Dual_Button.tick(pin)

轮询按键状态机。请在循环中定期调用此方法。

参数:

pin – 中断处理程序传入的可选引脚参数。从循环中轮询时使用 None

UiFlow2 代码块:

tick.png

SimpleDualButtonUnit

SimpleDualButtonUnit(port, active_low=True, debounce_ms=50)

创建两个用于直接轮询的 SimpleButton 对象。

参数:
  • port (tuple) – 两个按键的引脚号。

  • active_low (bool) – 为 True 时使用低电平作为有效状态。低电平有效输入使用内部上拉,高电平有效输入使用内部下拉。

  • debounce_ms (int) – 输入在生成边沿事件前必须保持稳定的时间,单位为毫秒。设为 0 可禁用消抖。

返回:

蓝色和红色按键对象。

返回类型:

tuple

SimpleButton

class SimpleButton(pin_num, active_low=True, debounce_ms=50)

提供无需回调的直接引脚读取和消抖边沿轮询。

读取边沿事件前需定期调用 SimpleButton.update()SimpleButton.value()SimpleButton.is_active() 方法会直接读取引脚,无需调用 update()

value()

返回原始引脚值。

返回:

01

返回类型:

int

is_active()

根据 active_low 返回按键当前是否处于有效状态。

返回:

按键处于有效状态时返回 True

返回类型:

bool

update()

采样引脚并更新消抖后的边沿状态。每次循环迭代调用一次此方法。

was_pressed()

返回最近一次调用 SimpleButton.update() 是否检测到消抖后的按下事件。

返回类型:

bool

was_released()

返回最近一次调用 SimpleButton.update() 是否检测到消抖后的释放事件。

返回类型:

bool