Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
alios-things
AliOS-Things
提交
9774a5ea
A
AliOS-Things
项目概览
alios-things
/
AliOS-Things
8 个月 前同步成功
通知
61
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
AliOS-Things
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
9774a5ea
编写于
6月 28, 2022
作者:
E
ethan.lcz
提交者:
yilu.myl
8月 22, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add fingerprint lock example's code
Signed-off-by:
N
ethan.lcz
<
ethan.lcz@alibaba-inc.com
>
上级
6685fd22
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
937 addition
and
0 deletion
+937
-0
haas_lib_bundles/python/docs/examples/FingerPrintLock/as608.py
...lib_bundles/python/docs/examples/FingerPrintLock/as608.py
+487
-0
haas_lib_bundles/python/docs/examples/FingerPrintLock/board.json
...b_bundles/python/docs/examples/FingerPrintLock/board.json
+63
-0
haas_lib_bundles/python/docs/examples/FingerPrintLock/main.py
..._lib_bundles/python/docs/examples/FingerPrintLock/main.py
+387
-0
未找到文件。
haas_lib_bundles/python/docs/examples/FingerPrintLock/as608.py
0 → 100644
浏览文件 @
9774a5ea
import
utime
import
ustruct
from
micropython
import
const
from
driver
import
UART
# check passwoard: 4 byte 0000
cmdVerifyPasswoard
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x07\x13\x00\x00\x00\x00\x00\x1B
'
# 采集图片
cmdGetImage
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x01\x00\x05
'
# 生成指纹图片对应的特征值
cmdImage2Char
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF
'
cmdSaveimage2Char
=
b
'
\x01\x00\x04\x02
'
# 创建指纹模板
cmdCreateModel
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x05\x00\x09
'
# 保存指纹模板
cmdStoreModel
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF
'
cmdSaveStoreModel
=
b
'
\x01\x00\x06\x06\x01
'
#指纹匹配指令
cmdMatch
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x03\x00\x07
'
#指纹搜索指令
cmdSearch
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x08\x04\x01\x00\x00\x00\x7F\x00\x8D
'
# 读取索引表
cmdReadIndexTable
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x1F\x00\x00\x24
'
#删除指纹记录
cmdDeleteModel
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF
'
cmdSaveDeleteModel
=
b
'
\x01\x00\x07\x0c\x00
'
# 清除数据库中的指纹信息
cmdEmptyDatabase
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x0D\x00\x11
'
# 获取指纹图片信息
cmdGetFPImage
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x03\x0a\x00\x0e
'
# 获取指纹特征值信息
cmdGetFPChar
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x08\x00\x00\x00
'
SUCCESS
=
const
(
0
)
FAIL
=
const
(
-
1
)
NO_FINGER
=
const
(
2
)
DATABASE_CAPABILITY
=
const
(
300
)
CMD_RSP_TIMEOUT_MS
=
const
(
500
)
# 单条指令超时时间
CMD_RSP_WAIT_TIME_MS
=
const
(
10
)
# 目前指令的response最多44个byte,44*(1+8+2+1)/57600 ~= 9.9ms
class
AS608
:
def
__init__
(
self
,
*
args
,
**
kargs
):
self
.
_uartDev
=
None
if
not
isinstance
(
args
[
0
],
UART
):
raise
ValueError
(
"parameter is not an UART object"
)
#实例化和AS608通信所用串口
self
.
_uartDev
=
args
[
0
]
#接收指令执行结果
def
getCmdResult
(
self
):
cnt
=
0
len
=
12
rx
=
bytearray
(
len
*
b
'5'
)
# 检查UART接收缓冲区中是否有足够的数据
l
=
self
.
_uartDev
.
any
()
while
(
l
<
len
):
# print('uart.any:', l)
cnt
+=
1
if
cnt
>
CMD_RSP_TIMEOUT_MS
/
CMD_RSP_WAIT_TIME_MS
:
# 等待超时时间后退出
break
utime
.
sleep_ms
(
CMD_RSP_WAIT_TIME_MS
)
l
=
self
.
_uartDev
.
any
()
self
.
_uartDev
.
read
(
rx
)
return
rx
def
matchCmdResult
(
self
):
cnt
=
0
len
=
14
rx
=
bytearray
(
len
*
b
'5'
)
# 检查UART接收缓冲区中是否有足够的数据
l
=
self
.
_uartDev
.
any
()
while
(
l
<
len
):
# print('uart.any:', l)
cnt
+=
1
if
cnt
>
CMD_RSP_TIMEOUT_MS
/
CMD_RSP_WAIT_TIME_MS
:
# 等待超时时间后退出
break
utime
.
sleep_ms
(
CMD_RSP_WAIT_TIME_MS
)
l
=
self
.
_uartDev
.
any
()
self
.
_uartDev
.
read
(
rx
)
return
rx
#接收指纹图像数据
def
getLongResult
(
self
):
cnt
=
0
rx
=
bytearray
(
0
)
# 检查UART接收缓冲区中是否有足够的数据
while
(
cnt
<
5
):
utime
.
sleep_ms
(
30
)
buf
=
bytearray
(
512
)
l
=
self
.
_uartDev
.
any
()
# 检查UART中是否有数据
if
l
>
0
:
# 从UART读取数据
l
=
self
.
_uartDev
.
read
(
buf
)
#print(l)
if
l
>
0
:
# 合并UART返回结果
rx
+=
buf
[
0
:
l
]
cnt
=
0
else
:
cnt
+=
1
return
rx
# 接收搜索指令结果
def
searchCmdResult
(
self
):
cnt
=
0
len
=
16
rx
=
bytearray
(
len
*
b
'5'
)
l
=
self
.
_uartDev
.
any
()
while
(
l
<
len
):
# print('uart.any:', l)
cnt
+=
1
if
cnt
>
CMD_RSP_TIMEOUT_MS
/
CMD_RSP_WAIT_TIME_MS
:
# 等待超时时间后退出
break
utime
.
sleep_ms
(
CMD_RSP_WAIT_TIME_MS
)
l
=
self
.
_uartDev
.
any
()
self
.
_uartDev
.
read
(
rx
)
return
rx
# 接收索引表结果
def
readIndexCmdResult
(
self
):
cnt
=
0
len
=
44
rx
=
bytearray
(
len
*
b
'5'
)
l
=
self
.
_uartDev
.
any
()
while
(
l
<
len
):
# print('uart.any:', l)
cnt
+=
1
if
cnt
>
CMD_RSP_TIMEOUT_MS
/
CMD_RSP_WAIT_TIME_MS
:
# 等待超时时间后退出
break
utime
.
sleep_ms
(
CMD_RSP_WAIT_TIME_MS
)
l
=
self
.
_uartDev
.
any
()
self
.
_uartDev
.
read
(
rx
)
return
rx
# 验证密码
def
verifyPassword
(
self
):
self
.
_uartDev
.
write
(
cmdVerifyPasswoard
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
-
3
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm code=00H shows OK;
Confirm Code=01H shows receiving packet error;
Confirm Code=13H shows password incorrect;
Confirm Code=21H shows Must verify password first;
'''
# 录入指纹图像
def
getImage
(
self
):
self
.
_uartDev
.
write
(
cmdGetImage
)
rsp
=
self
.
getCmdResult
()
# print(rsp)
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
elif
rsp
[
9
]
==
2
:
return
NO_FINGER
else
:
return
FAIL
'''
Confirm Code=00H - 录入成功
Confirm Code=01H - 收包错误
Confirm Code=02H - 传感器上无手指
Confirm Code=03H - 指纹录入失败
'''
# 生成指纹对应的特征值, slot代表Buffer缓冲区ID
def
image2Character
(
self
,
slot
=
1
):
sumImage2Char
=
cmdSaveimage2Char
+
bytearray
([
slot
,
0
,
slot
+
0x7
])
self
.
_uartDev
.
write
(
cmdImage2Char
)
self
.
_uartDev
.
write
(
sumImage2Char
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 生成特征值成功
Confirm Code=01H - 收包错误
Confirm Code=06H - 指纹图像太乱,生成特征值失败
Confirm Code=07H - 特征点太少,生成特征值失败
feature;
Confirm Code=15H - 图像缓冲区内没有有效原始图,生成特征值失败
'''
# 合并特征并生成模板
def
createModel
(
self
):
self
.
_uartDev
.
write
(
cmdCreateModel
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 合并成功
Confirm Code=01H - 收包错误
Confirm Code=0aH - 合并失败(两枚指纹不属于同一手指)
'''
# 将模板文件存储到PageID中,默认存储缓冲区1中的模板
def
storeModel
(
self
,
id
):
#sumStoreModel = cmdSaveStoreModel + bytearray([id, 0, id + 0x0E])
payload
=
cmdSaveStoreModel
+
bytearray
([(
id
>>
8
)
&
0xff
,
id
&
0xff
])
s
=
sum
(
payload
)
sumStoreModel
=
cmdStoreModel
+
payload
+
bytearray
([(
s
>>
8
)
&
0xff
,
s
&
0xff
])
self
.
_uartDev
.
write
(
sumStoreModel
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 储存成功
Confirm Code=01H - 收包错误
Confirm Code=0bH - pageID超出范围
Confirm Code=18H - 写Flash操作出错
'''
# 精确比对两枚指纹特征
def
match
(
self
):
self
.
_uartDev
.
write
(
cmdMatch
)
rsp
=
self
.
matchCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 指纹匹配
Confirm Code=01H - 收包错误
Confirm Code=08H - 指纹不匹配
'''
# 以缓冲区1或缓冲区2中的特征文件搜索整个或部分指纹库,若搜索到,返回页码
def
search
(
self
):
result
=
FAIL
fingerId
=
-
1
confidence
=
0
self
.
_uartDev
.
write
(
cmdSearch
)
rsp
=
self
.
searchCmdResult
()
# print(rsp)
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
result
=
SUCCESS
fingerId
,
confidence
=
ustruct
.
unpack
(
">HH"
,
bytes
(
rsp
[
10
:
14
]))
else
:
fingerId
,
confidence
=
-
1
,
0
# print (result, fingerId, confidence)
return
result
,
fingerId
,
confidence
'''
Confirm Code=00H - 搜索成功
Confirm Code=01H - 收包错误
Confirm Code=09H - 没有搜索到,此时fingerId和confidence均为0
'''
# 删除Flash指纹库中的一个特征文件
def
deleteModel
(
self
,
id
):
if
id
>=
DATABASE_CAPABILITY
or
id
<
0
:
return
FAIL
deleteModel
=
cmdSaveDeleteModel
+
bytearray
([
id
,
0
,
1
,
0
,
id
+
0x15
])
self
.
_uartDev
.
write
(
cmdDeleteModel
)
self
.
_uartDev
.
write
(
deleteModel
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 删除模板成功
Confirm Code=01H - 收包错误
Confirm Code=10H - 删除模板失败
'''
# 删除flash数据库中的所有指纹模板
def
emptyDatabase
(
self
):
self
.
_uartDev
.
write
(
cmdEmptyDatabase
)
rsp
=
self
.
getCmdResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
else
:
return
FAIL
'''
Confirm Code=00H - 清空指纹模板成功
Confirm Code=01H - 收包错误
Confirm Code=11H - 清空指纹模板失败
'''
# 获取指纹特征值
def
getFPCharacter
(
self
,
slot
=
1
):
# 获取指纹特征值信息
cmd
=
bytearray
(
cmdGetFPChar
)
cmd
[
10
]
=
slot
s
=
sum
(
cmd
[
6
:
11
])
cmd
[
11
]
=
(
s
>>
8
)
&
0xff
cmd
[
12
]
=
s
&
0xff
self
.
_uartDev
.
write
(
cmd
)
rsp
=
self
.
getLongResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
,
rsp
[
12
:
len
(
rsp
)]
else
:
return
FAIL
,
[]
'''
Confirm Code=00H - 清空指纹模板成功
Confirm Code=01H - 收包错误
Confirm Code=0dH - 指纹执行失败
'''
# 获取指纹图像
def
getFPImage
(
self
):
self
.
_uartDev
.
write
(
cmdGetFPImage
)
rsp
=
self
.
getLongResult
()
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
return
SUCCESS
,
rsp
[
12
:
len
(
rsp
)]
else
:
return
FAIL
,
[]
'''
Confirm Code=00H - 清空指纹模板成功
Confirm Code=01H - 收包错误
Confirm Code=0fH - bu不能发送后续数据包
'''
def
getEmptyPosition
(
self
):
for
i
in
range
(
4
):
cmdReadIndexTable
=
b
'
\xEF\x01\xFF\xFF\xFF\xFF\x01\x00\x04\x1F\x00\x00\x24
'
s
=
sum
(
cmdReadIndexTable
[
6
:
10
])
+
i
cmd
=
cmdReadIndexTable
[
0
:
10
]
+
bytearray
([
i
])
+
bytearray
([(
s
>>
8
)
&
0xff
,
s
&
0xff
])
self
.
_uartDev
.
write
(
cmd
)
rsp
=
self
.
readIndexCmdResult
()
# print(rsp)
# 检查命令是否执行成功
if
rsp
[
9
]
==
0
:
index
=
rsp
[
10
:
41
]
for
j
in
range
(
len
(
index
)):
for
m
in
range
(
8
):
if
not
(
index
[
j
]
&
(
1
<<
m
)):
return
i
*
32
+
j
*
8
+
m
return
FAIL
# 指纹录入
def
fingerEnroll
(
self
,
id
):
p
=
FAIL
if
id
>=
DATABASE_CAPABILITY
or
id
<
0
:
return
FAIL
print
(
'wait for finger print on the pannel'
)
while
p
!=
NO_FINGER
:
p
=
self
.
getImage
()
# 开始采集指纹
while
p
!=
SUCCESS
:
p
=
self
.
getImage
()
print
(
'finger detected'
)
# 指纹图片转化为特征值
p
=
self
.
image2Character
(
1
)
if
p
!=
SUCCESS
:
print
(
'image to text failed, exit'
)
return
0
# 再录制一次
print
(
'take off your finger, please'
)
#Take off your finger
p
=
0
while
p
!=
NO_FINGER
:
p
=
self
.
getImage
()
# put on again
# Get image again
print
(
'put on your finger again, please'
)
while
p
!=
SUCCESS
:
p
=
self
.
getImage
()
# 指纹图片转化为特征值
p
=
self
.
image2Character
(
2
)
if
p
!=
SUCCESS
:
return
0
print
(
'creating finger model'
)
# 创建指纹模板
p
=
self
.
createModel
()
if
p
!=
SUCCESS
:
print
(
'creating model failed'
)
return
0
print
(
'store finger model'
)
# 存储指纹模板
p
=
self
.
storeModel
(
id
)
if
p
!=
SUCCESS
:
# fingerrecordfail
print
(
'store finger model failed'
)
return
FAIL
print
(
'store finger model success'
)
return
SUCCESS
# 指纹识别
def
fingerSearch
(
self
):
p
=
FAIL
print
(
'search finger'
)
print
(
'wait for finger print on the pannel'
)
while
p
!=
NO_FINGER
:
p
=
self
.
getImage
()
while
p
!=
SUCCESS
:
p
=
self
.
getImage
()
print
(
'finger detected'
)
p
=
self
.
image2Character
(
1
)
if
p
!=
SUCCESS
:
# 指纹图片转换为特征值失败
print
(
'image to text failed, exit'
)
return
-
1
# 在指纹库中搜索指纹
p
,
id
,
confidence
=
self
.
search
()
if
p
==
SUCCESS
:
# 搜索成功
print
(
'finger id:'
,
id
,
' confidence:'
,
confidence
)
return
SUCCESS
,
id
else
:
# 搜索失败
print
(
'no match finger found'
)
return
FAIL
,
-
1
haas_lib_bundles/python/docs/examples/FingerPrintLock/board.json
0 → 100644
浏览文件 @
9774a5ea
{
"name"
:
"esp32"
,
"version"
:
"1.0.0"
,
"io"
:
{
"as608"
:
{
"type"
:
"UART"
,
"port"
:
2
,
"dataWidth"
:
8
,
"baudRate"
:
57600
,
"stopBits"
:
2
,
"flowControl"
:
"disable"
,
"parity"
:
"none"
},
"oled_spi"
:
{
"type"
:
"SPI"
,
"port"
:
1
,
"mode"
:
"master"
,
"freq"
:
26000000
},
"oled_dc"
:
{
"type"
:
"GPIO"
,
"port"
:
28
,
"dir"
:
"output"
,
"pull"
:
"pullup"
},
"oled_res"
:
{
"type"
:
"GPIO"
,
"port"
:
30
,
"dir"
:
"output"
,
"pull"
:
"pullup"
},
"KEY_1"
:
{
"type"
:
"GPIO"
,
"port"
:
23
,
"dir"
:
"irq"
,
"pull"
:
"pullup"
,
"intMode"
:
"rising"
},
"KEY_2"
:
{
"type"
:
"GPIO"
,
"port"
:
20
,
"dir"
:
"irq"
,
"pull"
:
"pullup"
,
"intMode"
:
"rising"
},
"KEY_3"
:
{
"type"
:
"GPIO"
,
"port"
:
21
,
"dir"
:
"irq"
,
"pull"
:
"pullup"
,
"intMode"
:
"rising"
},
"KEY_4"
:
{
"type"
:
"GPIO"
,
"port"
:
26
,
"dir"
:
"irq"
,
"pull"
:
"pullup"
,
"intMode"
:
"rising"
}
},
"debugLevel"
:
"ERROR"
,
"repl"
:
"disable"
}
\ No newline at end of file
haas_lib_bundles/python/docs/examples/FingerPrintLock/main.py
0 → 100644
浏览文件 @
9774a5ea
import
utime
from
micropython
import
const
from
driver
import
UART
import
sh1106
# SH1106 OLED驱动库
from
driver
import
SPI
# 引入SPI总线库
from
driver
import
GPIO
# 引入GPIO库
import
framebuf
# framebuf基类,用于设置字体库
import
_thread
# 线程库
import
as608
# AS608指纹识别模块库
fig
=
None
p
=
-
1
SaveResult
=
-
1
from
audio
import
Player
,
Snd
resDir
=
"/data/pyamp/resource/"
PUT_ON_FINGER
=
"putonfinger.wav"
# 请将手指按压在指纹识别面板上
PUT_OFF_FINGER
=
"putofffinger.wav"
# 请移开手指
FINGER_RECORD_SUCCESS
=
"fingerrecordsuccess.wav"
# 指纹录制成功
FINGER_SEARCH_FAIL
=
"searchfail.wav"
# 指纹识别失败 请再试一次
FINGER_SEARCH_SUCCESS
=
"searchfingersuccess.wav"
# 欢迎回家
FINGER_NOT_MATCH
=
"fingernotmatch.wav"
# 您的指纹不在指纹库中
PUT_ON_FINGER_AGAIN
=
"putonagain.wav"
# 请再次将手指放在指纹识别面板上
FINGER_RECORD_FAIL
=
"fingerrecordfail"
# 指纹录入失败 请重新录入
AUDIO_HEADER
=
'fs:'
player
=
None
oled
=
None
K1
=
None
K2
=
None
K3
=
None
K4
=
None
keyEvents
=
{
'K1'
:
False
,
'K2'
:
False
,
'K3'
:
False
,
'K4'
:
False
}
SYS_INIT
=
const
(
1
)
SYS_ENROLLING
=
const
(
2
)
SYS_DETECTING
=
const
(
3
)
promptName
=
None
# OLED初始化
def
oledInit
():
global
oled
# 字库文件存放于项目目录 font, 注意若用到了中英文字库则都需要放置
framebuf
.
set_font_path
(
framebuf
.
FONT_HZK12
,
'/data/font/HZK12'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_HZK16
,
'/data/font/HZK16'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_HZK24
,
'/data/font/HZK24'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_HZK32
,
'/data/font/HZK32'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_ASC12_8
,
'/data/font/ASC12_8'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_ASC16_8
,
'/data/font/ASC16_8'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_ASC24_12
,
'/data/font/ASC24_12'
)
framebuf
.
set_font_path
(
framebuf
.
FONT_ASC32_16
,
'/data/font/ASC32_16'
)
oled_spi
=
SPI
()
oled_spi
.
open
(
"oled_spi"
)
oled_res
=
GPIO
()
oled_res
.
open
(
"oled_res"
)
oled_dc
=
GPIO
()
oled_dc
.
open
(
"oled_dc"
)
#oled像素132*64
oled
=
sh1106
.
SH1106_SPI
(
132
,
64
,
oled_spi
,
oled_dc
,
oled_res
)
# 按键K1~K4的初始化
def
keyInit
():
global
K1
,
K2
,
K3
,
K4
K1
=
GPIO
()
K1
.
open
(
"KEY_1"
)
K1
.
on
(
k1Handler
)
K2
=
GPIO
()
K2
.
open
(
"KEY_2"
)
K2
.
on
(
k2Handler
)
K3
=
GPIO
()
K3
.
open
(
"KEY_3"
)
K3
.
on
(
k3Handler
)
K4
=
GPIO
()
K4
.
open
(
"KEY_4"
)
K4
.
on
(
k4Handler
)
def
k1Handler
(
obj
):
print
(
'K1 pressed'
)
keyEvents
[
'K1'
]
=
True
def
k2Handler
(
obj
):
print
(
'K2 pressed'
)
keyEvents
[
'K2'
]
=
True
def
k3Handler
(
obj
):
print
(
'K3 pressed'
)
keyEvents
[
'K3'
]
=
True
def
k4Handler
(
obj
):
print
(
'K4 pressed'
)
keyEvents
[
'K4'
]
=
True
# 检查是否有按键按下事件处于pending状态
def
keyEventsPending
():
if
all
(
value
==
False
for
value
in
keyEvents
.
values
()):
return
False
return
True
# 清除按键事件
def
clearKeyEvents
():
keyEvents
[
'K1'
]
=
False
keyEvents
[
'K2'
]
=
False
keyEvents
[
'K3'
]
=
False
keyEvents
[
'K4'
]
=
False
pass
# OLED显示
# text:显示的文本
# x:水平坐标 y:垂直坐标
# color:颜色
# clear: True-清屏显示 False-不清屏显示
# sz:字体大小
def
oledShowText
(
text
,
x
,
y
,
color
,
clear
,
sz
):
global
oled
if
clear
:
oled
.
fill
(
0
)
# 清屏
oled
.
text
(
text
,
x
,
y
,
color
,
size
=
sz
)
oled
.
show
()
# 清除屏幕
def
oledClear
():
oled
.
fill
(
0
)
# 清屏
oled
.
show
()
# 播放器初始化
def
playerInit
():
global
player
Snd
.
init
()
player
=
Player
()
player
.
open
()
player
.
setVolume
(
8
)
# 播放提示音
def
playVoicePrompt
(
prompt
):
global
promptName
promptName
=
prompt
'''
global player
if player.getState():
player.stop()
# 音频文件路径格式:‘fs:/data/pyamp/resource/xxx.wav’
player.play(AUDIO_HEADER + resDir + prompt)
'''
def
playVoicePromptSync
(
prompt
):
'''
global promptName
promptName = prompt
'''
global
player
if
player
.
getState
():
player
.
stop
()
# 音频文件路径格式:‘fs:/data/pyamp/resource/xxx.wav’
player
.
play
(
AUDIO_HEADER
+
resDir
+
prompt
)
player
.
waitComplete
()
# 指纹录入
def
fingerEnroll
(
id
):
p
=
as608
.
FAIL
global
SaveResult
# 如果在识别指纹过程中被返回初始页面操作打断,则退出此循环
if
keyEvents
[
'K4'
]
or
keyEvents
[
'K2'
]:
return
playVoicePrompt
(
PUT_ON_FINGER
)
oledShowText
(
'请按压触控板'
,
32
,
28
,
1
,
True
,
12
)
print
(
'wait for finger print on the pannel...'
)
while
p
!=
as608
.
NO_FINGER
:
p
=
fig
.
getImage
()
print
(
'invalid, please put your finger on the pannel again...'
)
# 开始采集指纹
while
p
!=
as608
.
SUCCESS
:
p
=
fig
.
getImage
()
# 如果在识别指纹过程中被返回初始页面操作打断,则退出此循环
if
keyEvents
[
'K4'
]
or
keyEvents
[
'K2'
]:
return
print
(
'finger detected'
)
# 指纹图片转化为特征值
p
=
fig
.
image2Character
(
1
)
if
p
!=
as608
.
SUCCESS
:
SaveResult
=
0
print
(
'image to text failed, exit...'
)
playVoicePrompt
(
FINGER_RECORD_FAIL
)
return
0
# putofffinger
print
(
'take off your finger please'
)
oledShowText
(
'请移开手指'
,
32
,
28
,
1
,
True
,
12
)
playVoicePrompt
(
PUT_OFF_FINGER
)
#Take off your finger
p
=
0
while
p
!=
as608
.
NO_FINGER
:
p
=
fig
.
getImage
()
# put on again
#Get image again
print
(
'put on your finger again, please...'
)
oledShowText
(
'请再次按压触控板'
,
17
,
28
,
1
,
True
,
12
)
playVoicePrompt
(
PUT_ON_FINGER_AGAIN
)
while
p
!=
as608
.
SUCCESS
:
p
=
fig
.
getImage
()
# 指纹图片转化为特征值
p
=
fig
.
image2Character
(
2
)
if
p
!=
as608
.
SUCCESS
:
SaveResult
=
0
print
(
'image to text failed, exit...'
)
playVoicePrompt
(
FINGER_RECORD_FAIL
)
return
0
print
(
'creating finger model...'
)
# 创建指纹模板
p
=
fig
.
createModel
()
if
p
!=
as608
.
SUCCESS
:
SaveResult
=
0
print
(
'creating model failed'
)
return
0
print
(
'store finger model...'
)
# 存储指纹模板
p
=
fig
.
storeModel
(
id
)
if
p
!=
as608
.
SUCCESS
:
SaveResult
=
0
# fingerrecordfail
oledShowText
(
'指纹录入失败'
,
25
,
28
,
1
,
True
,
12
)
playVoicePromptSync
(
FINGER_RECORD_FAIL
)
return
0
SaveResult
=
1
# fingerrecordsuccess
oledShowText
(
'指纹录入成功'
,
25
,
28
,
1
,
True
,
12
)
playVoicePromptSync
(
FINGER_RECORD_SUCCESS
)
return
1
# 指纹识别
def
fingerSearch
():
p
=
as608
.
FAIL
print
(
'search finger...'
)
print
(
'wait for finger print on the pannel...'
)
while
p
!=
as608
.
NO_FINGER
:
p
=
fig
.
getImage
()
while
p
!=
as608
.
SUCCESS
:
p
=
fig
.
getImage
()
# 如果在识别指纹过程中被返回初始页面操作打断,则退出此循环
if
keyEvents
[
'K4'
]
or
keyEvents
[
'K2'
]:
return
print
(
'finger detected'
)
p
=
fig
.
image2Character
(
1
)
if
p
!=
as608
.
SUCCESS
:
# 指纹图片转换为特征值失败
print
(
'image to text failed, exit...'
)
playVoicePrompt
(
FINGER_SEARCH_FAIL
)
return
-
1
# 在指纹库中搜索指纹
p
,
id
,
confidence
=
fig
.
search
()
if
p
==
as608
.
SUCCESS
:
print
(
'finger id:'
,
id
,
' confidence:'
,
confidence
)
# searchfingersuccess
oledShowText
(
'指纹识别成功'
,
32
,
28
,
1
,
True
,
12
)
playVoicePrompt
(
FINGER_SEARCH_SUCCESS
)
return
id
else
:
print
(
'no match finger found'
)
# fingernotmatch
oledShowText
(
'指纹未注册'
,
32
,
28
,
1
,
True
,
12
)
playVoicePrompt
(
FINGER_NOT_MATCH
)
return
-
1
def
promptThread
(
arg
):
global
player
,
promptName
while
True
:
if
promptName
:
prompt
=
promptName
promptName
=
None
# 如果播放器处于播放状态,先停止播放当前提示音
if
player
.
getState
():
player
.
stop
()
# 音频文件路径格式:‘fs:/data/pyamp/resource/xxx.wav’
player
.
play
(
AUDIO_HEADER
+
resDir
+
prompt
)
player
.
waitComplete
()
else
:
utime
.
sleep
(
0.1
)
#print('promptThread')
pass
# 主函数
if
__name__
==
'__main__'
:
# 系统状态机初始化
systemState
=
SYS_INIT
# OLED屏幕初始化
oledInit
()
# 播放器初始化
playerInit
()
# 串口设备初始化
uartDev
=
UART
()
uartDev
.
open
(
'as608'
)
# AS608指纹识别装置初始化
fig
=
as608
.
AS608
(
uartDev
)
# 按键初始化
keyInit
()
try
:
# 启动播放声音线程
_thread
.
stack_size
(
10
*
1024
)
_thread
.
start_new_thread
(
promptThread
,
[
'promptThread'
])
except
:
print
(
"Error: unable to start thread"
)
# 清除按键状态
clearKeyEvents
()
while
True
:
# 对按键时键进行处理
if
keyEvents
[
'K1'
]:
if
systemState
==
SYS_INIT
:
systemState
=
SYS_ENROLLING
if
keyEvents
[
'K3'
]:
if
systemState
==
SYS_INIT
:
systemState
=
SYS_DETECTING
if
keyEvents
[
'K4'
]
or
keyEvents
[
'K2'
]:
# 返回按键
systemState
=
SYS_INIT
# 清除按键中断事件
clearKeyEvents
()
# 系统状态机切换
if
systemState
==
SYS_INIT
:
oledShowText
(
'< >'
,
2
,
28
,
1
,
True
,
16
)
oledShowText
(
'指纹注册 指纹识别'
,
10
,
30
,
1
,
False
,
12
)
# 等待用户操作
while
not
keyEventsPending
():
utime
.
sleep
(
0.1
)
pass
elif
systemState
==
SYS_ENROLLING
:
oledShowText
(
'指纹注册中'
,
32
,
28
,
1
,
True
,
12
)
# 查找空闲可用id
id
=
fig
.
getEmptyPosition
()
# 指纹注册
fingerEnroll
(
id
)
systemState
=
SYS_INIT
elif
systemState
==
SYS_DETECTING
:
# 开始指纹识别
oledShowText
(
'指纹识别中'
,
38
,
28
,
1
,
True
,
12
)
fingerSearch
()
uartDev
.
close
()
del
fig
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录