分享一个刚写完的FPM10光学指纹识别库-Arduino中文社区 - Powered by Discuz! Archiver

0晨鹤0 发表于 2017-5-31 01:12

分享一个刚写完的FPM10光学指纹识别库

本帖最后由 0晨鹤0 于 2017-5-31 01:31 编辑

想改造宿舍门锁开始捣鼓指纹识别。
网上FPM指纹模块的资料比较少,大部分人在用Adafruit的库,感觉这个不是很稳定,经常出UNKNOW错误码,而且封装的函数也比较少。
于是刚学Arduino2天的小白我就自己写了个库(之前是Android程序猿),测试还比较稳定,也封装了好多函数。
各种返回值都有宏定义,比较规范(我是个强迫癌症患者→_→)
理论上FPMxx系列通用,已测试FPM10a

下面是已经封装好的函数,应该满足大部分需求了吧:
      /*设置模块地址,用于通讯。不设置默认为0xFFFFFFFF*/
      void setCurrentAddress(uint8_t address[]);
      /*获取指纹库容量*/
      uint16_t getFingerStoreSize(uint16_t *num);
      /*获取已有指纹个数*/
      uint16_t getFingerNum(uint16_t *num);
      /*设置模块安全等级*/
      uint8_t setSecurityLevel(uint8_t level);
      /*设置模块密码*/
      uint8_t setPassword(uint8_t password[]);
      /*验证模块密码(非初始密码必须先验证)*/
      uint8_t verifyPassword();
      uint8_t verifyPassword(uint8_t password[]);
      /*录入指纹图像*/
      uint8_t getFingerImage();
      /*图像生成指纹特征*/
      uint8_t image2tz(uint8_t bufferId);
      /*2个特征合成指纹模板*/
      uint8_t buildTemplate();
      /*保存指纹*/
      uint8_t storeFinger(uint8_t bufferId, uint16_t pageId);
      /*从指纹库读取指纹特征*/
      uint8_t loadFinger(uint8_t bufferId, uint16_t pageId);
      /*删除指纹*/
      uint8_t deleteFinger(uint16_t pageId, uint16_t count);
      /*清空指纹库*/
      uint8_t emptyFinger();
      /*精确比对2个指纹*/
      uint8_t contrastFinger(uint16_t * score);
      /*搜索指纹库*/
      uint8_t searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t *pageId, uint16_t *score);
      uint8_t searchFinger(uint8_t bufferId, uint16_t startPage, uint16_t endPage, uint16_t *pageId);

      /*以下方法为发送自定义数据及获得响应数据。不推荐使用,尽量用上面封装好的方法。*/
      void sendCmd(uint16_t length, uint8_t *content);
      uint8_t getReply(uint8_t pkg[], uint16_t timeout);
      uint8_t getReply(uint8_t pkg[]);


整个库有中文注释可以参考,例程实现了 清空指纹库→录入指纹→保存指纹→循环搜索匹配指纹 的整个流程。
具体使用说明请移步github:FPMxx-Fingerprint-Sensor4Arduino https://github.com/liangchenhe55/FPMxx-Fingerprint-Sensor4Arduino(弱弱地求star)
只想要库的见附件。

0晨鹤0 发表于 2017-11-3 15:36

Davidwxj 发表于 2017-11-3 11:03
亲我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...

把串口类换成HardwareSerial,其他应该都一样的。

0晨鹤0 发表于 2017-10-27 11:20

本帖最后由 0晨鹤0 于 2017-10-27 11:26 编辑

Davidwxj 发表于 2017-10-27 11:06
uint8_t FPMXX::getReply(uint8_t pkg[], uint16_t timeout)
{
      uint16_t timer = 0;

你连复制都复制错了。。正确的代码应该是:                for (i = 0; i < len; i++) //从确认码开始返回
                        pkg = reply;
                return len;

返回的数据已经由参数pkg带回了。
因为C++中数组参数是默认传地址的,所以在getReply()函数中修改参数pkg的值,可以把值带回去。

返回len是帮助判断这个返回数据是不是正常。
一般模块的对于某个命令,返回数据的长度大多是固定的,通过长度可以高效地初步判断这个返回数据是否正常,否则要比对返回的字节数组,效率差。

关于定义,这个是随便的。因为TIME_OUT和BAD_PACKAGE并不是正常的返回,甚至模块可能根本没有收到我们是请求。所以就自己定义了2个常量用来标识这种错误。

Zoologist 发表于 2017-5-31 08:38

很棒~后面我试试

mark301600 发表于 2017-5-31 08:58

:victory:..................

O_oYYQ 发表于 2017-5-31 09:27

本帖最后由 O_oYYQ 于 2017-6-1 09:38 编辑

顶一个~~支持一哈

86852335 发表于 2017-6-1 08:52

谢谢分享,收藏保存一个。

9527huang 发表于 2017-6-1 08:59

帮顶帮顶,,哈哈哈哈

Davidwxj 发表于 2017-10-11 11:07

本帖最后由 Davidwxj 于 2017-10-11 11:30 编辑

楼主您好,为什么我库导入后示例编译失败啦,提示FPMXX.h第95.96行有问题

0晨鹤0 发表于 2017-10-13 11:29

Davidwxj 发表于 2017-10-11 11:07
楼主您好,为什么我库导入后示例编译失败啦,提示FPMXX.h第95.96行有问题

麻烦贴一下具体的错误log

Davidwxj 发表于 2017-10-14 08:07

0晨鹤0 发表于 2017-10-13 11:29
麻烦贴一下具体的错误log运行的是你的示例,错误提示如下


In file included from FPMXX_Example.ino:2:
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: a brace-enclosed initializer is not allowed here before '{' token
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: ISO C++ forbids initialization of member 'Pack_Head'
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: making 'Pack_Head' static
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:95: error: invalid in-class initialization of static data member of non-integral type 'uint8_t '
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: a brace-enclosed initializer is not allowed here before '{' token
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: ISO C++ forbids initialization of member 'Adder'
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: making 'Adder' static
C:\Users\3358\Documents\Arduino\libraries\FPMXX/FPMXX.h:96: error: invalid in-class initialization of static data member of non-integral type 'uint8_t '

0晨鹤0 发表于 2017-10-22 19:24

Davidwxj 发表于 2017-10-14 08:07
运行的是你的示例,错误提示如下




不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。
页: [1] 2 3
查看完整版本: 分享一个刚写完的FPM10光学指纹识别库