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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 20314|回复: 28

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

[复制链接]
发表于 2017-5-31 01:12 | 显示全部楼层 |阅读模式
本帖最后由 0晨鹤0 于 2017-5-31 01:31 编辑

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

下面是已经封装好的函数,应该满足大部分需求了吧:
[kenrobot_code]        /*设置模块地址,用于通讯。不设置默认为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[]);[/kenrobot_code]


整个库有中文注释可以参考,例程实现了 清空指纹库→录入指纹→保存指纹→循环搜索匹配指纹 的整个流程。
具体使用说明请移步github:FPMxx-Fingerprint-Sensor4Arduino https://github.com/liangchenhe55/FPMxx-Fingerprint-Sensor4Arduino(弱弱地求star)
只想要库的见附件。 FPMXX.zip (6.28 KB, 下载次数: 341)
 楼主| 发表于 2017-11-3 15:36 | 显示全部楼层
Davidwxj 发表于 2017-11-3 11:03
亲  我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...

把串口类换成HardwareSerial,其他应该都一样的。
 楼主| 发表于 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;

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

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

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

关于定义,这个是随便的。因为TIME_OUT和BAD_PACKAGE并不是正常的返回,甚至模块可能根本没有收到我们是请求。所以就自己定义了2个常量用来标识这种错误。
发表于 2017-5-31 08:38 | 显示全部楼层
很棒~  后面我试试
发表于 2017-5-31 09:27 | 显示全部楼层
本帖最后由 O_oYYQ 于 2017-6-1 09:38 编辑

顶一个~~支持一哈
发表于 2017-6-1 08:52 | 显示全部楼层
谢谢分享,收藏保存一个。
发表于 2017-6-1 08:59 | 显示全部楼层
帮顶帮顶,,哈哈哈哈
发表于 2017-10-11 11:07 | 显示全部楼层
本帖最后由 Davidwxj 于 2017-10-11 11:30 编辑

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

麻烦贴一下具体的错误log
发表于 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 [2]'
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 [4]'
 楼主| 发表于 2017-10-22 19:24 | 显示全部楼层
Davidwxj 发表于 2017-10-14 08:07
运行的是你的示例,错误提示如下

不知道你是用的什么ide,我测试使用arduino和visual studio均编译正常。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:32 , Processed in 0.098017 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表