CardKB2 Unit
这是 CardKB2 单元的驱动库,用于获取按键输入数据。
支持以下产品:
UiFlow2 示例
CardKB2 I2C 模式
在 UiFlow2 中打开 cardkb2_i2c_core2_example.m5f2 项目。
此示例将在屏幕和串口上显示键盘输入内容。
UiFlow2 代码块:
示例输出:
输入的按键字符
CardKB2 UART 模式
在 UiFlow2 中打开 cardkb2_uart_core2_example.m5f2 项目。
此示例将在屏幕和串口上显示键盘输入内容。
UiFlow2 代码块:
示例输出:
输入的按键字符及状态
CardKB2 ESP-NOW 模式
在 UiFlow2 中打开 cardkb2_espnow_core2_example.m5f2 项目。
此示例将在屏幕和串口上显示键盘输入内容。
UiFlow2 代码块:
示例输出:
输入的按键字符及状态
MicroPython 示例
CardKB2 I2C 模式
此示例将在屏幕和串口上显示键盘输入内容。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from unit import CardKBUnit 9from hardware import Pin 10from hardware import I2C 11 12 13title0 = None 14label0 = None 15i2c0 = None 16cardkb2_0 = None 17 18 19char = None 20 21 22def cardkb2_0_i2c_pressed_event(kb): 23 global title0, label0, i2c0, cardkb2_0, char 24 char = cardkb2_0.get_char() 25 label0.setText(str((str(char) + str(" was pressed")))) 26 print((str(char) + str(" was pressed"))) 27 28 29def setup(): 30 global title0, label0, i2c0, cardkb2_0, char 31 32 M5.begin() 33 Widgets.setRotation(1) 34 Widgets.fillScreen(0x222222) 35 title0 = Widgets.Title( 36 "CardKB2 I2C Mode Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18 37 ) 38 label0 = Widgets.Label("label0", 3, 90, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 39 40 i2c0 = I2C(0, scl=Pin(33), sda=Pin(32), freq=100000) 41 cardkb2_0 = CardKBUnit(i2c0, mode=CardKBUnit.CardKB_I2C_MODE) 42 cardkb2_0.set_callback(cardkb2_0_i2c_pressed_event) 43 char = "" 44 45 46def loop(): 47 global title0, label0, i2c0, cardkb2_0, char 48 M5.update() 49 cardkb2_0.tick() 50 51 52if __name__ == "__main__": 53 try: 54 setup() 55 while True: 56 loop() 57 except (Exception, KeyboardInterrupt) as e: 58 try: 59 from utility import print_error_msg 60 61 print_error_msg(e) 62 except ImportError: 63 print("please update to latest firmware")
示例输出:
输入的按键字符
CardKB2 UART 模式
此示例将在屏幕和串口上显示键盘输入内容。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from unit import CardKBUnit 9 10 11title0 = None 12label0 = None 13cardkb2_0 = None 14 15 16key_id = None 17key_status = None 18 19 20def cardkb2_0_pressed_event(kb): 21 global title0, label0, cardkb2_0, key_id, key_status 22 key_id, key_status = kb 23 if key_status == (CardKBUnit.KEY_STATE_PRESS): 24 label0.setText(str((str("Key ID ") + str((str(key_id) + str(" Press")))))) 25 print((str("Key ID ") + str((str(key_id) + str(" Press"))))) 26 elif key_status == (CardKBUnit.KEY_STATE_RELEASE): 27 label0.setText(str((str("Key ID ") + str((str(key_id) + str(" Release")))))) 28 print((str("Key ID ") + str((str(key_id) + str(" Release"))))) 29 30 31def setup(): 32 global title0, label0, cardkb2_0, key_id, key_status 33 34 M5.begin() 35 Widgets.setRotation(1) 36 Widgets.fillScreen(0x222222) 37 title0 = Widgets.Title( 38 "CardKB2 UART Mode Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18 39 ) 40 label0 = Widgets.Label("label0", 3, 107, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 41 42 cardkb2_0 = CardKBUnit(2, port=(33, 32), mode=CardKBUnit.CardKB_UART_MODE) 43 cardkb2_0.set_callback(cardkb2_0_pressed_event) 44 45 46def loop(): 47 global title0, label0, cardkb2_0, key_id, key_status 48 M5.update() 49 cardkb2_0.tick() 50 51 52if __name__ == "__main__": 53 try: 54 setup() 55 while True: 56 loop() 57 except (Exception, KeyboardInterrupt) as e: 58 try: 59 from utility import print_error_msg 60 61 print_error_msg(e) 62 except ImportError: 63 print("please update to latest firmware")
示例输出:
输入的按键字符及状态
CardKB2 ESP-NOW 模式
此示例将在屏幕和串口上显示键盘输入内容。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from unit import CardKBUnit 9 10 11title0 = None 12label0 = None 13cardkb2_0 = None 14 15 16key_id = None 17key_status = None 18 19 20def cardkb2_0_pressed_event(kb): 21 global title0, label0, cardkb2_0, key_id, key_status 22 key_id, key_status = kb 23 if key_status == (CardKBUnit.KEY_STATE_PRESS): 24 label0.setText(str((str("Key ID ") + str((str(key_id) + str(" Press")))))) 25 print((str("Key ID ") + str((str(key_id) + str(" Press"))))) 26 elif key_status == (CardKBUnit.KEY_STATE_RELEASE): 27 label0.setText(str((str("Key ID ") + str((str(key_id) + str(" Release")))))) 28 print((str("Key ID ") + str((str(key_id) + str(" Release"))))) 29 30 31def setup(): 32 global title0, label0, cardkb2_0, key_id, key_status 33 34 M5.begin() 35 Widgets.setRotation(1) 36 Widgets.fillScreen(0x222222) 37 title0 = Widgets.Title( 38 "CardKB2 ESPNOW Mode Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18 39 ) 40 label0 = Widgets.Label("label0", 3, 107, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 41 42 cardkb2_0 = CardKBUnit(mode=CardKBUnit.CardKB_ESP_NOW_MODE) 43 cardkb2_0.set_callback(cardkb2_0_pressed_event) 44 45 46def loop(): 47 global title0, label0, cardkb2_0, key_id, key_status 48 M5.update() 49 cardkb2_0.tick() 50 51 52if __name__ == "__main__": 53 try: 54 setup() 55 while True: 56 loop() 57 except (Exception, KeyboardInterrupt) as e: 58 try: 59 from utility import print_error_msg 60 61 print_error_msg(e) 62 except ImportError: 63 print("please update to latest firmware")
示例输出:
输入的按键字符及状态
API
Class CardKB2Unit
- class unit.cardkb.CardKBUnit(*args, **kwargs)
基类:
object创建一个 CardKBUnit 对象。
- 参数:
args – 传递给底层通信类的位置参数。
mode (int) – 通信模式。默认模式包括: -
CardKBUnit.CardKB_I2C_MODE:I2C 模式 -CardKBUnit.CardKB_UART_MODE:UART 模式 -CardKBUnit.CardKB_ESP_NOW_MODE:ESP-NOW 模式
备注
这是一个工厂类。它会根据指定的模式返回相应的子类实例。
UiFlow2 代码块:

MicroPython 代码块:
from cardkb import CardKBUnit from hardware import I2C, Pin # I2C mode i2c0 = I2C(0, scl=Pin(33), sda=Pin(32), freq=100000) cardkb_0 = CardKBUnit(i2c0, mode=CardKBUnit.CardKB_I2C_MODE) # UART mode cardkb_0 = CardKBUnit(2, port=(33, 32), mode=CardKBUnit.CardKB_UART_MODE) # ESP-NOW mode cardkb_0 = CardKBUnit(mode=CardKBUnit.CardKB_ESP_NOW_MODE)
- class unit.cardkb.CardKBBase
基类:
objectCardKB 单元通信的基类。
该类为所有 CardKB 通信模式提供通用接口和逻辑。
- get_key()
从按键缓冲区获取下一个按键。
- 返回:
按键值(根据模式不同为 int 或 tuple)。
UiFlow2 代码块:

MicroPython 代码块:
key = cardkb_0.get_key() print(key)
- get_string()
将下一个按键以字符串形式获取。
- 返回:
下一个按键的字符串表示。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
s = cardkb_0.get_string() print(s)
- get_char()
将下一个按键以字符形式获取。
- 返回:
与下一个按键码对应的字符。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
c = cardkb_0.get_char() print(c)
- is_pressed()
检查当前是否有按键被按下。
- 返回:
若有按键被按下返回
True,否则返回False。- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
if cardkb_0.is_pressed(): print("Key pressed!")
- set_callback(handler)
设置按键按下事件的回调函数。
- 参数:
handler – 当按键被按下时调用的回调函数。该回调函数接收 CardKB 实例作为其参数。
UiFlow2 代码块:


MicroPython 代码块:
# I2C mode example def on_key_pressed(kb): print("Key pressed:", kb.get_char()) cardkb_0.set_callback(on_key_pressed) # UART/ESP-NOW mode example def on_key_event(kb): key_id, key_state = kb.get_key() print("Key event - ID:", key_id, "State:", key_state)
- tick()
轮询按键事件,并在按键被按下时触发回调函数。
此方法应在主循环中定期调用,以处理按键事件。
UiFlow2 代码块:

MicroPython 代码块:
while True: cardkb_0.tick()
- 返回类型:
None
- class unit.cardkb.CardKBI2C(i2c, address=95, mode=None)
基类:
CardKBBase基于 I2C 通信的 CardKB 单元驱动程序。
- 参数:
i2c (I2C) – I2C 总线实例。
address (int) – CardKB 单元的 I2C 地址。默认值为
0x5F。mode – 已忽略。保留用于工厂兼容性。
- 抛出:
Exception – 如果在 I2C 总线上未找到 CardKB 单元。
备注
不要直接实例化此类。请改用
CardKBUnit并设置mode=CardKBUnit.CardKB_I2C_MODE。MicroPython 代码块:
from hardware import I2C, Pin from cardkb import CardKBUnit i2c0 = I2C(0, scl=Pin(33), sda=Pin(32), freq=100000) cardkb_0 = CardKBUnit(i2c0, mode=CardKBUnit.CardKB_I2C_MODE)
- class unit.cardkb.CardKBUART(id=1, port=None, mode=None)
基类:
CardKBBase基于 UART 通信的 CardKB 单元驱动程序。
- 参数:
备注
不要直接实例化此类。请改用
CardKBUnit并设置mode=CardKBUnit.CardKB_UART_MODE。MicroPython 代码块:
from cardkb import CardKBUnit cardkb_0 = CardKBUnit(2, port=(33, 32), mode=CardKBUnit.CardKB_UART_MODE)
- tick()
轮询按键缓冲区,并在有可用按键时触发回调函数。
此方法应在主循环中定期调用,以处理通过 UART 接收的按键事件。
MicroPython 代码块:
while True: cardkb_0.tick()
- class unit.cardkb.CardKBESPNOW(mode=None)
基类:
CardKBBase基于 ESP-NOW 无线通信的 CardKB 单元驱动程序。
- 参数:
mode – 已忽略。保留用于工厂兼容性。
备注
不要直接实例化此类。请改用
CardKBUnit并设置mode=CardKBUnit.CardKB_ESP_NOW_MODE。备注
此类使用广播 MAC 地址(
ffffffffffff),并将 Wi-Fi 信道固定为 0。按键数据通过 IRQ 回调异步接收。MicroPython 代码块:
from cardkb import CardKBUnit cardkb_0 = CardKBUnit(mode=CardKBUnit.CardKB_ESP_NOW_MODE)
- espnow_recv_callback(espnow_obj)
在接收到 ESP-NOW 数据包时调用的回调函数。
- 参数:
espnow_obj – 包含接收数据的 ESP-NOW 对象。
- 返回:
如果帧有效并且已追加按键数据,则为
True,否则为False。- 返回类型:
- get_key()
从通过 ESP-NOW 接收的缓冲区中获取下一个按键。
- 返回:
按键元组
(key_id, key_state),如果缓冲区为空则返回None。- 返回类型:
tuple or None
MicroPython 代码块:
key = cardkb_0.get_key() if key: print("key_id:", key[0], "key_state:", key[1])
- is_pressed()
检查是否存在来自 ESP-NOW 的按键数据缓冲。
- 返回:
如果存在缓冲的按键数据则为
True,否则为False。- 返回类型:
MicroPython 代码块:
if cardkb_0.is_pressed(): print("Key received via ESP-NOW!")
- tick()
轮询按键缓冲区,并在有可用按键时触发回调函数。
此方法应在主循环中定期调用,以处理通过 ESP-NOW 接收的按键事件。
MicroPython 代码块:
while True: cardkb_0.tick()



