一、硬件介绍
产品特点
使用的是天空星STM32F407开发板,搭载ARM Cortex-M4F内核的STM32F407VET6,最高主频为168MHz,Flash 512KB,SRAM 192KB,板载SPI Flash、Micro SD卡插槽等;
STM32F407VET6

主要原理图

二、环境搭建

2、搭建方法
搭建方法点此查看!!!
三、硬件设备
指纹识别模块(ZW101)
ZW101模块由主动式半导体指纹采集SENSOR和指纹识别处理芯片构成,指纹识别算法芯片采用高性能、低功耗riscv内核,运行360度自适应自学习算法;

模块UART默认波特率为57.6Kbps;
(数据格式:8 位数据位,1 位停止位,无校验位)
| 引脚定义 |
说明 |
| V_SENSOR |
3.3V 触摸供电 |
| TOUCH_OUT |
唤醒 IRQ (true:1, flase:0) |
| VCC |
3V3 |
| TX |
UART_TX(指纹模组->MCU) |
| RX |
UART_RX(MCU->指纹模组) |
| GND |
GND |
实物连接效果
| 硬件引脚 |
- |
- |
- |
- |
| STM32 |
PB15 |
PB14 |
3V3 |
GND |
| ZW101模块 |
TX |
RX |
V_SENSOR / VCC |
GND |

四、代码编写
效果:通过不同的串口指令,实现指纹录入、指纹匹配、指纹清除等操作功能;并在串口上显示,当前操作的相关信息;
主要相关代码
#include <SoftwareSerial.h>
typedef unsigned short u16;
typedef unsigned int u32;
HardwareSerial Serial1(PA10, PA9);
#define FINGERPRINT_RX PB15
#define FINGERPRINT_TX PB14
bool isInit = false;
SoftwareSerial fingerprintSerial(FINGERPRINT_RX, FINGERPRINT_TX); // 软件串口
...
void setup()
{
Serial1.begin(115200);
fingerprintSerial.begin(57600); // 模块初始化
delay(200);
}
void loop()
{
if(!isInit)
{
isInit = true;
int ret = read_FP_info();
if(ret == 0){
Serial1.println("读取模组参数失败!");
}
command_use();
}
run_command();
delay(100);
}
void command_use(void)
{
Serial1.println("------------------------------------------");
Serial1.println("操作指令说明:");
Serial1.println("输入 1 -> 录入新指纹");
Serial1.println("输入 2 -> 识别按压的指纹");
Serial1.println("输入 3 -> 清空全部指纹库");
Serial1.println("------------------------------------------");
}
int run_command(void)
{
if (Serial1.available() > 0)
{
String command = Serial1.readStringUntil('\n');
command.trim();
if (command == "1")
{
Serial1.println("【操作】开始录入指纹,请多次按压手指...");
if(register_FP()) {
Serial1.println("录入指纹成功!");
}else{
Serial1.println("录入失败,指纹图像模糊或两次纹路不一致");
}
}
else if (command == "2")
{
Serial1.println("【操作】开始指纹识别,请放置手指");
if(search_FP()) {
Serial1.println("识别成功,库内存在匹配指纹!");
}else{
Serial1.println("识别失败,无匹配指纹或采集图像异常");
}
}
else if (command == "3")
{
Serial1.println("【操作】清空全部指纹库");
if(clear_FP_all_lib()) {
Serial1.println("指纹库清空完成!");
}else{
Serial1.println("清空指纹库失败!");
}
} else {
Serial1.print("【错误】未知指令:");
Serial1.println(command);
}
}
return 0;
}
int read_FP_info(void)
{
uint8_t response[32] = {0};
uint8_t index = 0;
u32 startTime = millis();
send_cmd(CMD_READ_SYSPARA);
while (millis() - startTime < 2000)
{
if (fingerprintSerial.available())
{
response[index++] = fingerprintSerial.read();
if (index >= 28) break;
}
}
if (index >= 28 && response[9] == 0x00)
{
return 1;
}
return 0;
}
五、效果演示
分别执行不同的功能指令;

1、录入指纹

2、指纹匹配
成功匹配时

匹配失败时

3、清空指纹库

|