基于STM32和AS608指纹模块的指纹录入功能的实现

615 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

AS608介绍

AS608指纹识别模块是ALIENTEK推出的一款高性能的光学指纹识别模块。AS608模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)的 AS608指纹识别芯片。芯片内置DSP运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。 

测试

测试软件

首先下载压缩包:download.csdn.net/download/qq…
之后直接解压即可。

测试流程

  1. 将模块的 Tx、Rx 连接到 USB 转串口设备。(提示:开发板可使用板载的 CH340)

  2. 在计算机设备管理器找到识别的串口号,如图 所示。

  3. 打开"指纹测试软件SYDemo.exe,然后在上位机选择对应串口号。

  4. 点击“确定”,通讯成功。

  5. 通讯成功之后可查看硬件信息、波特率等,可以点击面板上按钮等功能操作。
    下面我们点击“录入指纹”按钮。并输入 88 为录入指纹 ID。

  6. 点击“确定”,软件提示“请将手指平放在传感器上”。

  7. 按照提示将手指平放在传感器上,等待图像上传。提示:
    上传时间稍微久一点。波特率越高速度越快,使用 USB 模块测试则会更快。

  8. 第一次录入图像成功之后,软件会提示“2.请将手指平放在传感器上”表示第
    二次录入图像。

  9. :当两次录入图像的指纹经过对比匹配之后,如果一致的话指纹就录入成功了,录入成功。

  10. 前面操作是录入了一个指纹,下面我们测试一下刷指纹(验证指纹)。首先我们点击“搜索”

  11. 按照提示将手指放在传感器上录入图像成功之后,系统对比录入图像与指纹库,如果对比成功,则提示“找到相同手指,FingerID=88……”

录入功能的实现

指纹录入开发流程

软件开发流程图如图所示:

指纹录入程序

void Add_FR(void)
{
	u8 i=0,ensure ,processnum=0;
	while(1)
	{
		switch (processnum)
		{
			case 0:
			i++;
        printf("please finger\n");   //请按手指
				ensure=PS_GetImage();       //录入图像返回字
				if(ensure==0x00) 
				{
					ensure=PS_GenChar(CharBuffer1);//生成特征
					if(ensure==0x00)
					{
						printf("zhengque\n");//指纹正确
						i=0;
						processnum=1;//跳到第二步						
					}
					else printf("%c\n",ensure);					
				}
				else  printf("%c\n",ensure);						
				break;
			case 1:
				i++;
				 printf("please click on the finger\n");//再按一次手指
				ensure=PS_GetImage();
				if(ensure==0x00) 
				{
					ensure=PS_GenChar(CharBuffer2);//生成特征			
					if(ensure==0x00)
					{
            printf("Fingerprint right\n");//指纹正确
						i=0;
						processnum=2;//跳到第三步
					}else 
					printf("%c",ensure);	
				}else 
				printf("%c",ensure);		
				break;
			case 2:
        printf("comparing two fingerprints\n");   //对比两次指纹
				ensure=PS_Match();//精确比对两枚指纹特征返回字
				if(ensure==0x00) 
				{
					printf("Two fingerprints is the same\n");//两次指纹是一样的
					processnum=3;//跳到第四步
				}
				else 
				{
					printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指
					printf("%c",ensure);
					i=0;
					processnum=0;//跳回第一步		
				}
				delay_ms(1000);
				break;
			case 3:
				printf("generate a fingerprint template\n");//产生一个指纹模板
				ensure=PS_RegModel();
				if(ensure==0x00) 
				{
					printf("generate a fingerprint template is successful\n");//生成指纹模板成功
					processnum=4;//跳到第五步
				}else {processnum=0;printf("%c",ensure);}
				delay_ms(1000);
				break;	
			case 4:	
				printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
				printf("0=< ID <=299\n");	
			do			//设定指纹号
			{
					if(anjian(GPIOC,GPIO_Pin_8)==0)
				 {
				   ID++;
				 }
	            else if(anjian(GPIOC,GPIO_Pin_9)==0)
               {
          			 ID--;                             
                 }
		 }
				while(!(ID<300));//输入DI必须小于300
				
				ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
				if(ensure==0x00) 
				{			
					printf("Add the fingerprint successfully\n");//添加指纹成功
					PS_ValidTempleteNum(&ValidN);//读库指纹个数
					printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
					delay_ms(1500);//延时后清除显示	
					printf ("\n");
					return ;
				}else {processnum=0; printf("%c\n",ensure);}					
				break;				
		}
		delay_ms(800);
		if(i==5)//超过5次没有按手指则退出
		{
			printf("\n");
			break;	
		}				
	}
}