指纹识别传感器
光学指纹识别传感器采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip) 的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集 图像并识别指纹特征。模块配备了串口、USB 通讯接口,用户无需研究复杂的图像处理及及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。
模块来源
规格参数
工作电压:3.0-3.6V
工作电流:30~60mA
指纹存容量:300 枚(ID:0~299)
认假率:<0.001%
搜索时间:<0.3(S)
控制方式:串口或USB
管脚数量:8 Pin(2.54mm间距排针)
硬件连接
系统内设有一个72K字节的图像缓冲区与二个512bytes大小的特征文件缓冲区,名字分别称为:lmageBuffer,CharBuffer1和CharBuffer2。用户可以通过指令读写任意一个缓冲区。CharBufferl或 CharBuffer2既可以用于存放普通特征文件也可以用于存放模板特征文件。通过UART 口上传或下载图像时为了加快速度,只用到像素字节的高4位,即将两个像素合成一个字节传送。通过USB口则是整8位像素。
指纹库容量根据挂接的FLASH容量不同而改变,系统会自动判别。指纹模板按照序号存放,序号定义为:0—(N-1)(N为指纹库容量)。 用户只能根据序号访问指纹库内容。
这里我们使用的是串口控制方式,USB的接口我们可以悬空不接。
1脚(红线):模块主电源,接3.3V供电(请勿接3.3V以上电源,否则烧毁模块!);
2脚(黄线):模块串口TX(发送端),接MCU或TTL串口的RX(接收端);
3脚(白线):模块串口RX(接收端),接MCU或TTL串口的TX(发送端);
4脚(黑线):模块电源地,接3.3V电源地(负极);
5脚(蓝线):模块触摸感应信号输出(高电平为检测到触摸),需接VTI到3.3V。
6脚(绿线):模块触摸感应电路电源(3.3V),可以与1脚(红线)并接。
7脚,8脚为USB信号线,使用串口控制模块时可以悬空不用。
将AS608指纹识别传感器按照以下方式连接到开发板:
- VCC 连接到 开发板 的
- GND 连接到 开发板 的 GND
- TXD(传感器发送端)连接到 开发板 的2号数字引脚(用作RX)
- RXD(传感器接收端)连接到 开发板 的3号数字引脚(用作TX)
使用方法
- 这个例程通过串行监视器与用户交互,提供添加、识别、删除指纹的功能。
showMenu
函数用于供用户选择不同的操作。addFingerprint
函数接受指纹ID作为参数,这个ID由用户输入。deleteFingerprint
函数删除特定ID的指纹数据。- 要求用户在串行监视器中输入他们的选择,并且可以按照提示输入指纹ID。
- 需要调用
Serial.parseInt()
函数来从串行输入中获取整数。 - 在
loop
函数中,Serial.available()
是用来检查是否有数据从串行端口传入。
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月08日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
// 软串口配置,根据实际连接的TX、RX引脚修改
SoftwareSerial mySerial(2, 3); // RX, TX
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
// 函数声明
void addFingerprint(uint8_t id);
void deleteFingerprint(uint8_t id);
uint8_t getFingerprintIDez();
void showMenu();
void setup() {
Serial.begin(9600);
mySerial.begin(57600);
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("指纹传感器连接成功");
} else {
Serial.println("指纹传感器连接失败");
while (1) { delay(1); } // 无限循环直到重启
}
showMenu(); // 显示菜单
}
void loop() {
if (Serial.available()) {
int choice = Serial.parseInt();
switch (choice) {
case 1:
Serial.println("请输入要添加的指纹ID号(1-127):");
while(!Serial.available()); // 等待用户输入
addFingerprint(Serial.parseInt());
break;
case 2:
getFingerprintIDez(); // 识别指纹
break;
case 3:
Serial.println("请输入要删除的指纹ID号(1-127):");
while(!Serial.available()); // 等待用户输入
deleteFingerprint(Serial.parseInt());
break;
default:
Serial.println("无效选择,请重新选择:");
showMenu();
break;
}
}
}
void showMenu(){
Serial.println("--- 指纹传感器Demo 菜单 ---");
Serial.println("1. 添加新指纹");
Serial.println("2. 识别指纹");
Serial.println("3. 删除指纹");
Serial.print("请输入你的选择:");
}
/**************************************** 添加指纹 ********************************************/
void addFingerprint(uint8_t id) {
int p = -1;
Serial.println("请放置手指...");
// 等待手指按下
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("图像采集成功");
break;
case FINGERPRINT_NOFINGER:
Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("通信错误");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("图像采集失败");
break;
default:
Serial.println("未知错误");
break;
}
delay(50); // 短暂等待再次检测
}
// 将图像转换为特征并存储在CharBuffer 1
p = finger.image2Tz(1);
if (p != FINGERPRINT_OK) {
Serial.println("Error in image2Tz");
return;
}
Serial.println("请移开手指");
delay(2000);
p = -1;
Serial.println("请再次放置同一手指...");
// 等待手指再次按下
while (p != FINGERPRINT_OK) {
p = finger.getImage();
if (p == FINGERPRINT_OK) {
Serial.println("图像采集成功");
} else if (p == FINGERPRINT_NOFINGER) {
Serial.print(".");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("通信错误");
} else if (p == FINGERPRINT_IMAGEFAIL) {
Serial.println("图像采集失败");
} else {
Serial.println("未知错误");
}
delay(50); // 短暂等待再次检测
}
// 将图像转换为特征并存储在CharBuffer 2
p = finger.image2Tz(2);
if (p != FINGERPRINT_OK) {
Serial.println("Error in image2Tz");
return;
}
// 创建模型
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("指纹匹配");
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("指纹不匹配");
return;
} else {
Serial.println("未知错误");
return;
}
// 将模型存储在传感器的存储库中,位置ID自行设置,例如从1开始
Serial.print("存储指纹模板中...");
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("完成");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("通信错误");
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("无法存储在该位置");
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("写入Flash出错");
} else {
Serial.println("未知错误");
}
showMenu();//显示菜单
}
/**************************************** 识别指纹 ********************************************/
//注意该函数的写法是要先放好手指再进行识别
uint8_t getFingerprintIDez() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("图像采集成功");
break;
case FINGERPRINT_NOFINGER:
Serial.println("没有检测到指纹");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("通信错误");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("图像采集失败");
return p;
default:
Serial.println("未知错误");
return p;
}
// 尝试转换图像
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("图像转换成功");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("图像模糊");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("通信错误");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("无法找到指纹的特征");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("指纹图像无效");
return p;
default:
Serial.println("未知错误");
return p;
}
// 在库中搜索指纹
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("找到匹配的指纹");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("通信错误");
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("没有找到匹配");
} else {
Serial.println("未知错误");
}
// 如果找到匹配,finger.fingerID 将会有匹配指纹的ID
Serial.print("找到ID #"); Serial.println(finger.fingerID);
Serial.print("匹配得分: "); Serial.println(finger.confidence);
showMenu();//显示菜单
return p;
}
/**************************************** 删除指纹 ********************************************/
void deleteFingerprint(uint8_t id){
uint8_t p = -1;
Serial.print("正在删除ID "); Serial.println(id);
p = finger.deleteModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("删除成功!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("通讯错误");
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not delete in that location");
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
} else {
Serial.print("Unknown error: 0x"); Serial.println(p, HEX);
}
showMenu();//显示菜单
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
使用验证
根据串口调试工具的提醒,先选择添加指纹并将指纹数据保存在1的位置。识别指纹时,可以看出识别到了ID为1的指纹,这个明显是识别成功了。后将ID为1的指纹删除再进行识别,出现无法识别成功现象,说明删除指纹成功。