本项目利用gt511c3指纹传感器(fps)模块,在aduino开发板上实现了一个高精度、快速响应的指纹扫描仪。项目通过arduino录入指纹,在需要的时候检测、验证指纹,还可通过硬姐智造pcba一站式服务将项目从diy拓展到新兴的生物识别市场。
	所需的组件:
	arduino uno开发板
	gt511c3指纹传感器模块
	162a lcd显示屏
	1k电阻
	2k电阻
	10k电位器
	按钮
	连接跳线
	面包板
了解gt511c3指纹传感器模块	
	与电容式、超声波指纹传感器模块不同,gt511c3指纹传感器模块采用光学技术。该模块内置一个摄像头,可以拍摄指纹图案,再由内部holtek arm cortex m3 mcu处理这些指纹图案。该扫描仪模块最多可保存200次指纹扫描,并为每个指纹分配一个从0到199的id。
	该光学传感器模块外形小巧,可轻松集成到具有串行uart接口的应用中。模块有四根线:两根线用于tx和rx,两根线用于电源。传感器可在3.3-6v电压范围内工作,通信引脚(rx和tx)可承受3.3v电压。
	gt511c3模块可通过usb直接与计算机连接。使用usb连接时,可使用sdk_demo.exe应用程序控制此模块。此应用程序允许用户录/验证/删除指纹。
gt511c3模块的特性和规格:
	工作电压:3.3-6vdc
	工作电流:<130ma
	工作温度:~20°c ~ +60°c
	cpu:arm cortex m3内核(holtek ht32f2755)
	最大指纹数:200个指纹
	传感器:光学传感器
	串行通信:uart(默认:9600波特)和usb v1.1
	错误接受率 (far):< 0.001%
	错误拒绝率 (frr): < 0.01%
	注册时间 < 3 秒(3个指纹)
	识别时间:<1.0秒(200个指纹)
	gt511c3指纹传感器模块有4个引脚,红色线是vcc,黑色是gnd,绿色线是rx,白色线是tx。
gt511c3 sdk演示软件
	 	gt511c3 sdk是一套快速入门套件。使用时,首先将指纹传感器连接到usb转ttl模块,将红色线连接到vcc,黑色线连接到gnd,绿色线连接到tx,白色线连接到rx。
usb转ttl ftdi模块与gt511c3指纹传感器的uart连接	 
	接下来,按以下操作在电脑上使用sdk:
	1. 下载 sdk_demo.exe
	2. 解压文件夹。
	3. 进入解压后的目录
	4. 打开 sdk_demo.exe 可执行文件。
	5. 在“串行端口号”下拉菜单中选择ftdi枚举的com端口。
	6. 在波特率的下拉菜单中选择9600。
	7. 单击打开按钮。
连接正确后,将显示固件版本和设备序列号,以及其他选项,例如录取、验证、识别、获取图像、删除、获取数据库等。如果要删除指纹,只需单击“全部删除”选项即可完成。
将gt511c3模块与arduino连接	
	根据线路图,将指纹传感器与arduino连接起来。
由于传感器uart引脚仅承受3.3v电压,本项目使用了一个由2k电阻和1k电阻组成的分压器网络,将绿色线(rx)连接到arduino开发板的d5引脚,将白色线(tx)连接到arduino开发板的d4引脚。
gt511c3 arduino库	 
	现在要做的,就是把gt511c3 arduino库上传到arduino ide。该库由sparkfun编写,已经在其他类型的指纹传感器上进行了测试。
	以下是指纹录入代码:
#include fps_gt511c3.h
	#include softwareserial.h
fps_gt511c3 fps(4, 5);          //    digital pin 5(arduino tx, fps rx)
	                               //    digital pin 4(arduino rx, fps tx)
	void setup()
	{
	 serial.begin(9600);           //default baud rate
	 delay(100);
	 fps.open();
	 fps.setled(true);
enroll();
	}
void enroll()
	{
	 int enrollid = 0;             // find open enroll id
	 bool okid = true;
	 while (okid == true)
	 {
	   okid = fps.checkenrolled(enrollid);
	   if (okid==true) enrollid++;
	 }
	 fps.enrollstart(enrollid);   // enroll
serial.print(press finger to enroll #); 
	 serial.println(enrollid);
	 while(fps.ispressfinger() == false) delay(100);
	 bool bret = fps.capturefinger(true);
	 int iret = 0;
	 if (bret != false)
	 {
	   serial.println(remove finger);
	   fps.enroll1(); 
	   while(fps.ispressfinger() == true) delay(100);
	   serial.println(press same finger again);
	   while(fps.ispressfinger() == false) delay(100);
	   bret = fps.capturefinger(true);
	   if (bret != false)
	   {
	     serial.println(remove finger);
	     fps.enroll2();
	     while(fps.ispressfinger() == true) delay(100);
	     serial.println(press same finger yet again);
	     while(fps.ispressfinger() == false) delay(100);
	     bret = fps.capturefinger(true);
	     if (bret != false)
	     {
	       serial.println(remove finger);
	       iret = fps.enroll3();
	       if (iret == 0)
	       {
	         serial.println(enrolling successfull);
	       }
	       else
	       {
	         serial.print(enrolling failed with error code:);
	         serial.println(iret);
	       }
	     }
	     else serial.println(failed to capture third finger);
	   }
	   else serial.println(failed to capture second finger);
	 }
	 else serial.println(failed to capture first finger);
	}
void loop()
	{
	 delay(100);
	}
	上传代码后,打开串口监视器,系统将要求你放置一个手指,进行录入并注册。
以下是读取指纹的代码:
#include fps_gt511c3.h
	#include softwareserial.h
fps_gt511c3 fps(4, 5);          //    digital pin 5(arduino tx, fps rx)
	                               //    digital pin 4(arduino rx, fps tx)
	void setup()
	{
	 serial.begin(9600);           //default baud rate
	 delay(100);
	 fps.open();
	 fps.setled(true);
	}
void loop()
	{
// identify fingerprint test
	 if (fps.ispressfinger())
	 {
	   fps.capturefinger(false);
	   int id = fps.identify1_n();
	   if (id <200)
	   {
	     serial.print(verified id:);
	     serial.println(id);
	   }
	   else
	   {
	     serial.println(finger not found);
	   }
	 }
	 else
	 {
	   serial.println(please press finger);
	 }
	 delay(100);
	}
再次上传代码并进行测试。上传代码后,打开串口监视器,系统将请求放置手指进行验证。你可以放置刚刚注册的手指,也可以随意放一个指头上去,让设备自己读取你的指纹并进行验证对比。
采用arduino和lcd屏的便携式指纹扫描仪	
	经过对gt511c3的了解和使用,我们在上述电路图中再添加一个lcd显示屏,就构成了一个简单的便携式指纹扫描仪。
gt511c3指纹传感器、lcd显示屏与arduino开发板的连接电路图	 
	这里,我们通过一个按钮开关,将gt511c3连接到arduino数字引脚2。按下按钮时,传感器将进入指纹录入模式。新添加的16x2字符lcd显示屏,用来显示用户与指纹传感器交互时的实时数据。
	增加了lcd显示屏后,组合了指纹录入、验证和lcd显示库的完整代码如下:
#include 
	const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
	liquidcrystal lcd(rs, en, d4, d5, d6, d7);
#include fps_gt511c3.h
	#include softwareserial.h
fps_gt511c3 fps(4, 5);          //    digital pin 5(arduino tx, fps rx)
void setup()
	{
	 serial.begin(9600);           //default baud rate
	 lcd.begin(16, 2);
	 delay(100);
	 fps.open();
	 fps.setled(true);
pinmode(2, input_pullup); //connect to internal pull up resistor as input pin
lcd.setcursor(4, 0);
	 lcd.print(gt511c3);
	 lcd.setcursor(3, 1);
	 lcd.print(fps sensor);
	 delay(2500);
	}
void loop()
	{
	 read_fps();
if (digitalread(2) == 0) //if button pressed
	 {
	   enroll(); //enroll a fingerprint
	 }
	 delay(100);
	}
void enroll()
	{
	 int enrollid = 0;             // find open enroll id
	 bool okid = true;
	 while (okid == true)
	 {
	   okid = fps.checkenrolled(enrollid);
	   if (okid == true) enrollid++;
	 }
	 fps.enrollstart(enrollid);   // enroll
serial.print(press finger to enroll #);
	 serial.println(enrollid);
lcd.setcursor(0, 0);
	 lcd.print(put finger to);
	 lcd.setcursor(0, 1);
	 lcd.print(enroll: #);
	 lcd.print(enrollid);
while (fps.ispressfinger() == false)
	   delay(100);
	 bool bret = fps.capturefinger(true);
	 int iret = 0;
	 if (bret != false)
	 {
	   serial.println(remove finger);
	   lcd.clear();
	   lcd.setcursor(0, 0);
	   lcd.print(remove finger);
fps.enroll1();
	   while (fps.ispressfinger() == true)
	     delay(100);
serial.println(press same finger again);
	   lcd.clear();
	   lcd.setcursor(0, 0);
	   lcd.print(put same finger);
	   lcd.setcursor(0, 1);
	   lcd.print(again);
while (fps.ispressfinger() == false)
	     delay(100);
	   bret = fps.capturefinger(true);
	   if (bret != false)
	   {
	     serial.println(remove finger);
	     lcd.clear();
	     lcd.setcursor(0, 0);
	     lcd.print(remove finger);
fps.enroll2();
	     while (fps.ispressfinger() == true)
	       delay(100);
	     serial.println(press same finger yet again);
	     lcd.clear();
	     lcd.setcursor(0, 0);
	     lcd.print(put same finger);
	     lcd.setcursor(0, 1);
	     lcd.print(yet again);
while (fps.ispressfinger() == false)
	       delay(100);
	     bret = fps.capturefinger(true);
	     if (bret != false)
	     {
	       serial.println(remove finger);
	       iret = fps.enroll3();
	       if (iret == 0)
	       {
	         serial.println(enrolling successfull);
	         lcd.clear();
	         lcd.setcursor(0, 0);
	         lcd.print(enrolling);
	         lcd.setcursor(0, 1);
	         lcd.print(successfull);
}
	       else
	       {
	         serial.print(enrolling failed with error code:);
	         serial.println(iret);
	         lcd.clear();
	         lcd.setcursor(0, 0);
	         lcd.print(enrolling failed);
	         lcd.setcursor(0, 1);
	         lcd.print(iret);
	       }
	     }
	     else
	       serial.println(failed to capture third finger);
	     lcd.clear();
	     lcd.setcursor(0, 0);
	     lcd.print(failed capturing);
	     lcd.setcursor(0, 1);
	     lcd.print(third finger);
	   }
	   else
	     serial.println(failed to capture second finger);
	   lcd.clear();
	   lcd.setcursor(0, 0);
	   lcd.print(failed capturing);
	   lcd.setcursor(0, 1);
	   lcd.print(second finger);
	 }
	 else
	   serial.println(failed to capture first finger);
	 lcd.clear();
	 lcd.setcursor(0, 0);
	 lcd.print(failed capturing);
	 lcd.setcursor(0, 1);
	 lcd.print(first finger);
	}
void read_fps()
	{
	 // identify fingerprint test
	 if (fps.ispressfinger())
	 {
	   fps.capturefinger(false);
	   int id = fps.identify1_n();
	   if (id < 200)
	   {
	     serial.print(verified id:);
	     serial.println(id);
lcd.clear();
	     lcd.setcursor(0, 0);
	     lcd.print(verified id:);
	     lcd.setcursor(0, 1);
	     lcd.print(id);
	   }
	   else
	   {
	     serial.println(finger not found);
	     lcd.clear();
	     lcd.setcursor(0, 0);
	     lcd.print(finger not found);
	   }
	 }
	 else
	 {
	   serial.println(please press finger);
	   lcd.clear();
	   lcd.setcursor(0, 0);
	   lcd.print(please put );
	   lcd.setcursor(0, 1);
	   lcd.print(finger);
	 }
	 delay(100);
	}
	选择arduino nano开发板型号和com端口并上传。代码上传完成后,lcd显示屏会提示放置手指,同时,指纹模块中的蓝色led将会点亮。
	如果要录入指纹,请按下按钮,然后扫描手指3次。完成后,指纹录取完毕。
	要验证指纹,请将同一根手指放在指纹模块上。
	上面就是一个便携式指纹扫描仪模型的制作全过程了。如果你觉得这个项目非常好,还想进行小批量生产,就需要将其中的面包板换成pcb板。这里的pcb打样很简单,硬姐智造pcba一站式“打样+批量”服务可满足创客的各种定制需求,把项目从diy拓展到指纹锁、pos机等生物识别领域。
			
			
       	 	
    	温室大棚气象观测站的用途有哪些?
         	 	
    	关于ATE Load Board的设计挑战及注意事项
         	 	
    	IGBT模块缓冲电路的模型_igbt缓冲电路类型
         	 	
    	农村供水工程如何实现标准化物联网管理
         	 	
    	网上冲浪不爽?可能是你没用上华为云CDN
         	 	
    	利用GT511C3指纹传感器模块的指纹扫描仪设计
         	 	
    	美国开发出一种高效催化剂 可由可再生资源产生
         	 	
    	关于在使用点胶机点胶加工前的一些注意事项
         	 	
    	串口服务器的类型及作用
         	 	
    	S1336-5BQ光敏二极管用于光度检测的驱动设计与实现
         
       	 	
    	第八届中国移动全球合作伙伴大会:5G与物联网碰撞
         	 	
    	单片机系统软件抗干扰方法的研究
         	 	
    	有哪一些好的对策可以推动区块链的发展
         	 	
    	USB控制器芯片按功能分类的特性比较
         	 	
    	全自动装车码垛机器人的应用优势是什么
         	 	
    	研究人员发现:更多黑客的网络攻击针对于基于Linux的设备
         	 	
    	智慧安防让视频服务无处不在 提升公众的安全度和安居满意度
         	 	
    	百度AI开发者大会:首次在国内以元宇宙形式举办科技大会
         	 	
    	太阳能半导体制冷空调控制系统设计
         	 	
    	深入剖析esp32c3的系统底层启动