实验二:指纹单模块实验

一、实验目的

利用ESP32和FPM10A光学指纹模块,实现指纹录入、指纹匹配、指纹删除等功能

二、实验内容

1.录入指纹
2.匹配已录入的指纹
3.删除已录入的指纹

三、实验设备

1.ESP32-WROOM-32D开发板
2.FPM10A光学指纹模块(红色:5V TX:绿色 RX:黄色 黑色:GND)

3.杜邦线

四、实验步骤

1) 安装Adafruit指纹传感器库

1.Adafruit指纹传感器库下载:https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library/archive/master.zip
2.解压下载的.zip文件,你会看到一个Adafruit-Fingerprint-Sensor-Library-master文件夹
3.将Adafruit-Fingerprint-Sensor-Library-master文件夹重命名为Adafruit_Fingerprint_Sensor_Library文件夹
4.将文件夹移动到您的Arduino IDE安装库文件夹中的libraries文件夹
5.重新打开Arduino IDE

2) 录入指纹

1.连接设备

将FPM10A指纹模块与ESP32连接,如下图所示:
FPM10A的RX连接ESP32引脚17
FPM10A的TX连接ESP32引脚16

2.在Arduino IDE中编写如下代码

 //ESP32 引脚17(TX)和16(RX)上的Serial2/*指纹模块   连 接    ESP32*/
/* RX白      ---      17  */
/* TX绿      ---      16  */#include <Adafruit_Fingerprint.h>#define mySerial Serial2     Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);    //在之前设置的串行引脚上创建一个名为finger的Adafruit_Fingerprint对象。uint8_t id;                                                       //存储指纹编号void setup()
{Serial.begin(9600);while (!Serial);                                               // 如果没打开串口会一直循环,打开串口后继续进行Serial.println("\n\nEnrolling Fingerprint"); delay(100);finger.begin(57600);                                           //设置传感器串行端口的数据速率if (finger.verifyPassword()) {                                 //查看指纹传感器是否存在Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :");while (1) { delay(1000);Serial.println("waiting for fingerprint sensor..."); }}
}uint8_t readnumber(void) {                                      //从串口输入存入指纹的id编号uint8_t num = 0;while (num == 0) {while (! Serial.available());num = Serial.parseInt();    }return num;
}void loop()
{Serial.println("Ready to enroll a fingerprint!");Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");id = readnumber();                                           //获取串口输入的序号1-127if (id == 0) {                                               //输入0无效return;}Serial.print("Enrolling ID =");Serial.println(id);while (!getFingerprintEnroll() );
}uint8_t getFingerprintEnroll() {int p = -1;Serial.print("Waiting for valid finger to enroll as ");Serial.println(id);while (p != FINGERPRINT_OK) {p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.println(".");break;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");break;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");break;default:Serial.println("Unknown error");break;}}
//第一次采集结束//槽位置放置要素模板p = finger.image2Tz(1);switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}//OK SuccessSerial.println("Remove finger");delay(2000);p = 0;while (p != FINGERPRINT_NOFINGER) {p = finger.getImage();                              //请求传感器采集指纹}Serial.print("ID "); Serial.println(id);p = -1;Serial.println("Place same finger again");while (p != FINGERPRINT_OK) {p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.print(".");break;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");break;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");break;default:Serial.println("Unknown error");break;}}
// OK success!p = finger.image2Tz(2);switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}// OK converted!Serial.print("Creating model for =");Serial.println(id);p = finger.createModel();   //要求传感器采用两个打印特征模板并创建模型if (p == FINGERPRINT_OK) {Serial.println("Print matched");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_ENROLLMISMATCH) {Serial.println("Fingerprints did not match");return p;} else {Serial.println("Unknown error");return p;}   Serial.print("ID: "); Serial.println(id);p = finger.storeModel(id);  //要求传感器存储计算模型以进行后续匹配if (p == FINGERPRINT_OK) {Serial.println("Stored!");return 1;} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_BADLOCATION) {Serial.println("Could not store in that location");return p;} else if (p == FINGERPRINT_FLASHERR) {Serial.println("Error writing to flash");return p;} else {Serial.println("Unknown error");return p;}
}

3.上传代码,并录入指纹

1.上传代码到ESP32开发板,并以9600的波特率打开串行监视器
2.这时你应该输入指纹的ID。由于这是你的第一个指纹,请在左上角输入1,然后单击Send按钮。

3.将手指放在扫描仪上,然后按照串行监视器上的说明进行操作系统会要求您将同一根手指放在扫描仪上两次。如果您收到“Prints matched!”消息,如下所示,您的指纹已成功存储。如果没有,重复这个过程,直到你成功

如果出现上图提示,表明上传成功。

3)匹配指纹

1.在Arduino IDE中编写如下代码

#include <Adafruit_Fingerprint.h>#define mySerial Serial2
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);void setup()
{Serial.begin(9600);while (!Serial);  delay(100);Serial.println("\n\nAdafruit finger detect test");finger.begin(57600);if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :(");while (1) { delay(1); }}finger.getTemplateCount();Serial.print("Sensor contains ");Serial.print(finger.templateCount);Serial.println(" templates");Serial.println("Waiting for valid finger...");
}void loop()
{getFingerprintIDez();delay(50);
}uint8_t getFingerprintID() {uint8_t p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.println("No finger detected");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");return p;default:Serial.println("Unknown error");return p;}// OK success!p = finger.image2Tz();switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}// OK converted!p = finger.fingerFastSearch();if (p == FINGERPRINT_OK) {Serial.println("Found a print match!");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_NOTFOUND) {Serial.println("Did not find a match");return p;} else {Serial.println("Unknown error");return p;}   Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence); return finger.fingerID;
}// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {uint8_t p = finger.getImage();if (p != FINGERPRINT_OK)  return -1;p = finger.image2Tz();if (p != FINGERPRINT_OK)  return -1;p = finger.fingerFastSearch();if (p != FINGERPRINT_OK)  return -1;// found a match!Serial.print("Found ID #"); Serial.print(finger.fingerID); Serial.print(" with confidence of "); Serial.println(finger.confidence);return finger.fingerID;
}

2.上传代码,并匹配指纹

1.代码上传成功后,打开串口监视器显示如下,

2.在扫描仪中放置要识别的手指。
3.在串行监视器上,您可以看到与指纹匹配的ID。同时它也显示了信心值 – 信心值越高,表示该指纹与存储的指纹越相似。

4)删除指纹

1.在Arduino IDE中编写如下代码

#include <Adafruit_Fingerprint.h>#define mySerial Serial2Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);void setup()
{Serial.begin(9600);while (!Serial);  delay(100);Serial.println("\n\nDelete Finger");finger.begin(57600);if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :(");while (1);}
}uint8_t readnumber(void) {uint8_t num = 0;while (num == 0) {while (! Serial.available());num = Serial.parseInt();}return num;
}void loop()                     // run over and over again
{Serial.println("Please type in the ID # (from 1 to 127) you want to delete...");uint8_t id = readnumber();if (id == 0) {// ID #0 not allowed, try again!return;}Serial.print("Deleting ID #");Serial.println(id);deleteFingerprint(id);
}uint8_t deleteFingerprint(uint8_t id) {uint8_t p = -1;p = finger.deleteModel(id);             //删除指纹成功返回0x00if (p == FINGERPRINT_OK) {Serial.println("Deleted!");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_BADLOCATION) {Serial.println("Could not delete in that location");return p;} else if (p == FINGERPRINT_FLASHERR) {Serial.println("Error writing to flash");return p;} else {Serial.print("Unknown error: 0x"); Serial.println(p, HEX);return p;}
}

2.上传代码,并删除指纹

1.在串口中输入你要删除的指纹编号1-127,然后单击Send按钮
2.出现如下图所示内容,则指纹删除成功

实验2——指纹单模块实验相关推荐

  1. PCM开发板模块实验指导--IIC主从实验

     模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762        25---IIC主读写固定寄存器地址实验:​​​​​​​ ...

  2. 实验4——门磁单实验

    实验五:门磁单模块试验 一.实验目的 ESP32的一个引脚连接门磁,当门磁打开时,读取脚位的电平变化来触发中断程序. 二.实验内容 1.连接ESP32与门磁的引脚,另一引脚接地 2.将程序上传到ESP ...

  3. mysql实验6语言结构_实验六 SQL语言数据查询语言DQL.pdf

    实验六 SQL语言数据查询语言DQL 实验六 SQL 语言数据查询语言DQL 一.实验目的 数据查询语言指对数据库中的数据查询.统计.分组.排序等操作.查询语 句可以分为简单查询.连接查询.嵌套查询和 ...

  4. 淮海工学院linux实验报告三,作业三 实验报告

    作业三 实验报告 网络通信 文件传输 实验一 1-1 实验题目 服务器端和客户端各传递1次字符串.考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度.连接时服务器端和客户端数据传 ...

  5. linux内存管理实验malloc,linux内存管理实验报告.doc

    linux内存管理实验报告 操作系统实验报告 院别:XXXXXX 班级:XXXXXX 学号:XXXXXX 姓名:稻草人 实验题目:内存管理实验 实验目的 通过本次试验体会操作系统中内存的分配模式: 掌 ...

  6. 计算机网络子网划分路由配置实验报告,洛阳理工学院+计算机网络+实验5子网划分路由配置...

    洛阳理工学院实验报告 院别 计算机与信息班级 工程学院 课程名称 计算机网络 实验名称 实验五 子网划分路由配置 实验目的: 1. 理解子网划分原理,能够正确为网络中的计算机以及设备配置划分子网后的I ...

  7. Linux系统内存管理实验报告,linux内存管理实验报告

    <linux内存管理实验报告>由会员分享,可在线阅读,更多相关<linux内存管理实验报告(13页珍藏版)>请在人人文库网上搜索. 1.操作系统实验报告院别:XXXXXX班级: ...

  8. 计算机控制实验ppt模板,计算机控制技术实验课件.ppt

    计算机控制技术实验课件.ppt 计算机控制技术实验课件,易杰,目录,实验一模数.数模转换实验实验二多路模拟信号AD.DA转换实验实验三采样实验实验四保持器实验实验五积分分离PID控制实验,实验一模数. ...

  9. 计算机作业实验报告dw感想,微机实验报告

    微机实验报告 曾东明 实验一 输出字符'A' 一.实验目的 1.通过这个简单的例子熟悉在微机上建立.汇编.链接和运行8086/8088汇编语言程序的过程. 2.掌握字符的显示方法. 3.学习DOS系统 ...

最新文章

  1. python 关联表_python学习------9.13----约束、表之间的关联关系
  2. 浅谈机器学习的职业发展方向
  3. GDCM:gdcm::EnumeratedValues的测试程序
  4. 2019自考00018计算机应用基础,全国2019年4月自考00018《计算机应用基础》试题及答案...
  5. 最新 MySQL数据库安装详解(简洁快速)
  6. stm32入门(从51过渡到32)
  7. 使用System.Drawing.Printing 画报表。
  8. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景
  9. JS实现,页面显示数据加载,显示加载效果,加载完成显示数据
  10. 2019美赛B题完整论文
  11. Mysql 数据库迁移
  12. “去哪儿”创始人兼总裁庄辰超专访实录
  13. Blender摄像机环绕运动、动画渲染、视频合成
  14. 应用计算机测定伏安特性实验,实验25应用计算机测电阻伏安特性.doc
  15. IP种子眼中的《延禧攻略》流落何处?
  16. HDU 5238 Calculator(中国剩余定理+线段树)
  17. 7-38 实验7_3_奇数偶数 (100 分)
  18. 计算机房里面味道很大,搞笑段子:我负责单位的计算机房,同事的计算机有问题来向我讨教...
  19. Django 基于类的通用视图详解
  20. java毕业设计校园互助平台校园帮帮网站源码+lw文档+mybatis+系统+mysql数据库+调试

热门文章

  1. train错误cpython-37m-x86_64-linux-gnu.so: undefined symbol: THPVariableClass
  2. 2021-02-08【Web作业开发记录】Java代码读取文件问题
  3. QQ帝国的衰竭,一场还没开始就注定失败的战争
  4. Jenkins开发之——SCM日程表配置
  5. android通过代码设置铃声_使用VS Code调试Android C_C++代码(无需Android源码)
  6. ListView数据更新UI不刷新
  7. 恒大ems时间插件java0_ems 员工管理系统。包括 ,部门,职位的增删改查;考勤记录,薪资结算,日志和意见箱等 Java Develop 249万源代码下载- www.pudn.com...
  8. 付费云存储,微信的登云梯还是蜀道难?
  9. 内蒙古国税无需开通 VPDN 进行网上申报方法
  10. Word产品需求文档已经过时了?