Finger Unit

以下产品受支持:

FingerUnit

MicroPython 应用示例

  1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8from unit import FingerUnit
  9import time
 10
 11
 12rect0 = None
 13rect1 = None
 14rect2 = None
 15label0 = None
 16label1 = None
 17label2 = None
 18label3 = None
 19title0 = None
 20finger_0 = None
 21
 22
 23ret = None
 24cur_time = None
 25t_x = None
 26last_touch_time = None
 27t_y = None
 28
 29
 30# Describe this function...
 31def add_handler():
 32    global \
 33        ret, \
 34        cur_time, \
 35        t_x, \
 36        last_touch_time, \
 37        t_y, \
 38        rect0, \
 39        rect1, \
 40        rect2, \
 41        label0, \
 42        label1, \
 43        label2, \
 44        label3, \
 45        title0, \
 46        finger_0
 47    label2.setColor(0xFFFFFF, 0x222222)
 48    label2.setText(str("add..."))
 49    if (finger_0.add_user(1, 1)) == 1:
 50        label2.setColor(0xFFFFFF, 0x62B900)
 51        label2.setText(str("added"))
 52    else:
 53        label2.setColor(0xFFFFFF, 0xF45554)
 54        label2.setText(str("add failed"))
 55
 56
 57# Describe this function...
 58def match_handler():
 59    global \
 60        ret, \
 61        cur_time, \
 62        t_x, \
 63        last_touch_time, \
 64        t_y, \
 65        rect0, \
 66        rect1, \
 67        rect2, \
 68        label0, \
 69        label1, \
 70        label2, \
 71        label3, \
 72        title0, \
 73        finger_0
 74    label2.setColor(0xFFFFFF, 0x222222)
 75    label2.setText(str("macth..."))
 76    ret = finger_0.compare_finger()
 77    if ret == 1:
 78        label2.setColor(0xFFFFFF, 0x62B900)
 79        label2.setText(str("macth"))
 80    else:
 81        label2.setColor(0xFFFFFF, 0xF45554)
 82        label2.setText(str("no macth"))
 83
 84
 85def setup():
 86    global \
 87        rect0, \
 88        rect1, \
 89        rect2, \
 90        label0, \
 91        label1, \
 92        label2, \
 93        label3, \
 94        title0, \
 95        finger_0, \
 96        ret, \
 97        cur_time, \
 98        t_x, \
 99        last_touch_time, \
100        t_y
101
102    M5.begin()
103    Widgets.fillScreen(0x222222)
104    rect0 = Widgets.Rectangle(8, 206, 95, 30, 0xFFFFFF, 0xFFFFFF)
105    rect1 = Widgets.Rectangle(112, 206, 95, 30, 0xFFFFFF, 0xFFFFFF)
106    rect2 = Widgets.Rectangle(216, 206, 95, 30, 0xFFFFFF, 0xFFFFFF)
107    label0 = Widgets.Label("Add", 37, 213, 1.0, 0x000000, 0xFFFFFF, Widgets.FONTS.DejaVu18)
108    label1 = Widgets.Label("Match", 132, 212, 1.0, 0x000000, 0xFCFCFC, Widgets.FONTS.DejaVu18)
109    label2 = Widgets.Label("label2", 132, 109, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
110    label3 = Widgets.Label("label3", 8, 27, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
111    title0 = Widgets.Title("Finger Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
112
113    finger_0 = FingerUnit(port=(18, 17))
114    finger_0.delete_all_user()
115    finger_0.set_add_mode(0)
116    label3.setText(str((str("User Num: ") + str((finger_0.get_user_count())))))
117    last_touch_time = time.ticks_ms()
118
119
120def loop():
121    global \
122        rect0, \
123        rect1, \
124        rect2, \
125        label0, \
126        label1, \
127        label2, \
128        label3, \
129        title0, \
130        finger_0, \
131        ret, \
132        cur_time, \
133        t_x, \
134        last_touch_time, \
135        t_y
136    M5.update()
137    if M5.Touch.getCount():
138        cur_time = time.ticks_ms()
139        if cur_time - last_touch_time > 150:
140            t_x = M5.Touch.getX()
141            t_y = M5.Touch.getY()
142            if t_x >= 8 and t_x <= 8 + 95 and t_y >= 206 and t_y <= 206 + 30:
143                rect0.setColor(color=0x007BFF, fill_c=0x007BFF)
144                label0.setColor(0xFFFFFF, 0x007BFF)
145                add_handler()
146            else:
147                rect0.setColor(color=0xFFFFFF, fill_c=0xFFFFFF)
148                label0.setColor(0x000000, 0xFFFFFF)
149            if t_x >= 112 and t_x <= 112 + 95 and t_y >= 206 and t_y <= 206 + 30:
150                rect1.setColor(color=0x007BFF, fill_c=0x007BFF)
151                label1.setColor(0xFFFFFF, 0x007BFF)
152                match_handler()
153            else:
154                rect1.setColor(color=0xFFFFFF, fill_c=0xFFFFFF)
155                label1.setColor(0x000000, 0xFFFFFF)
156            last_touch_time = time.ticks_ms()
157    label3.setText(str((str("User Num: ") + str((finger_0.get_user_count())))))
158
159
160if __name__ == "__main__":
161    try:
162        setup()
163        while True:
164            loop()
165    except (Exception, KeyboardInterrupt) as e:
166        try:
167            from utility import print_error_msg
168
169            print_error_msg(e)
170        except ImportError:
171            print("please update to latest firmware")

UiFlow2 应用示例

example.png

cores3_finger_example.m5f2

class FingerUnit

Constructors

class FingerUnit(id: Literal[0, 1, 2] = 1, port: list | tuple = None)

创建一个 FingerUnit 对象。

参数:
  • id – UART 的 ID,取值为 0、1 或 2。

  • port – UART 引脚编号。

UiFlow2

init.png

Methods

FingerUnit.sleep() bool

成功调用此方法后,FPC1020A 将无法响应任何消息。

返回:

如果命令执行成功则为 True,否则为 False。

UiFlow2

sleep.png

FingerUnit.get_add_mode() int

在不重复模式下,同一手指只能添加 1 个用户;如果强制进行第二次添加,将返回错误信息。

返回:

模式(0:不重复模式,1:重复模式)

UiFlow2

get_add_mode.png

FingerUnit.set_add_mode(mode: int) int

在不重复模式下,同一手指只能添加 1 个用户;如果强制进行第二次添加,将返回错误信息。

参数:

mode – 模式(0:不重复模式,1:重复模式)

返回:

模式(0:不重复模式,1:重复模式)

UiFlow2

set_add_mode.png

FingerUnit.add_user(id: int, permission: Literal[1, 2, 3]) int

添加新用户

调用此方法后,需要将手指放在指纹模块上。

参数:
  • id – 用户 ID(0-149)

  • permission – 用户权限(1:普通,2:管理员,3:超级管理员)

返回:

如果命令执行失败则返回 -1,否则返回用户 id。

UiFlow2

add_user.png

FingerUnit.delete_user(id: int) int

删除指定 id 的用户。

参数:

id – 用户 ID(0-149)

返回:

如果命令执行失败则返回 -1,否则返回用户 id。

UiFlow2

delete_user.png

FingerUnit.delete_all_user() bool

删除所有用户。

返回:

如果命令执行成功则为 True,否则为 False。

UiFlow2

delete_all_user.png

FingerUnit.get_user_count() int

获取已注册用户数量。

返回:

如果命令执行失败,则返回 -1;否则返回已注册用户的数量。

UiFlow2

get_user_count.png

FingerUnit.get_user_capacity() int

获取可注册的最大用户数量。

返回:

如果命令执行失败则返回 -1,否则返回可注册的最大用户数量。

UiFlow2

get_user_capacity.png

FingerUnit.compare_id(id: int, timeout: int = 5000) bool

检查当前采集的指纹是否与指定的用户 id 匹配。

参数:

id – 用户 ID(0-149)

返回:

如果命令执行失败则返回 -1,否则返回用户 id。

UiFlow2

compare_id.png

FingerUnit.compare_finger(timeout: int = 5000) int

检测当前采集的指纹是否为已注册用户。

返回:

如果命令执行失败则返回 -1,否则返回用户 id。

UiFlow2

compare_finger.png

FingerUnit.get_user_list() list

获取已注册用户列表。

返回:

已注册用户列表。

UiFlow2

get_user_list.png

FingerUnit.get_user_info(id: int) Union[tuple, None]:

获取指定 id 的用户信息。

参数:

id – 用户 ID(0-149)

返回:

如果命令执行成功,则返回 (id, permission) 元组;否则返回 None。

UiFlow2

get_user_info.png

FingerUnit.get_user_permission(id: int) int

获取指定 id 的用户权限。

参数:

id – 用户 ID(0-149)

返回:

如果命令执行不成功则返回 -1,否则返回该用户的权限。

UiFlow2

get_user_permission.png

FingerUnit.get_user_characteristics(id: int) bytes | None

获取指定 id 的用户特征。

参数:

id – 用户 ID(0-149)

返回:

如果命令成功,则返回特征的字节;否则返回 None。

UiFlow2

get_user_characteristic.png

FingerUnit.add_user_info(id, permissions, characteristic, timeout: int = 5000) bool

使用 FPC1020A 注册新用户。

参数:
  • id – 用户 ID(0-149)

  • permissions – 用户权限(1:普通,2:管理员,3:超级管理员)

  • characteristic – 用户特征

  • timeout – 超时时间(毫秒)

返回:

如果命令执行成功则为 True,否则为 False。

UiFlow2

add_user_info.png

FingerUnit.capture_characteristic(timeout: int = 5000) bytes

采集指纹特征。

参数:

timeout – 超时时间(毫秒)

返回:

如果命令成功,则返回特征的字节;否则返回 None。

FingerUnit.get_match_level() int

比较级别范围为 0 到 9,数值越大,比较越严格,默认值为 5。

返回:

匹配等级(0-9)

UiFlow2

get_match_level.png

FingerUnit.set_match_level(level: int) int

比较级别范围为 0 到 9,数值越大,比较越严格,默认值为 5。

参数:

level – 匹配等级(0-9)

返回:

匹配等级(0-9)

UiFlow2

set_match_level.png

FingerUnit.get_version() str

获取 FPC1020A 的版本信息。

返回:

版本信息。