查看: 9899|回复: 27

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

[复制链接]
  • TA的每日心情
    慵懒
    2017-11-29 22:43
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    发表于 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, 下载次数: 257)
  • TA的每日心情
    慵懒
    2017-11-29 22:43
  • 签到天数: 22 天

    [LV.4]偶尔看看III

     楼主| 发表于 2017-11-3 15:36 | 显示全部楼层
    Davidwxj 发表于 2017-11-3 11:03
    亲  我把你的软串口换成了硬串口Serial1,我应该怎么改呢,我试了下,发包收包有错 ...

    把串口类换成HardwareSerial,其他应该都一样的。
  • TA的每日心情
    慵懒
    2017-11-29 22:43
  • 签到天数: 22 天

    [LV.4]偶尔看看III

     楼主| 发表于 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;

    你连复制都复制错了。。正确的代码应该是:

    kittenblock中小学创客名师推荐的图形化编程软件

                    for (i = 0; i < len; i++) //从确认码开始返回
                            pkg = reply[9 + i];
                    return len;


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

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

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

    该用户从未签到

    发表于 2017-5-31 08:38 | 显示全部楼层
    很棒~  后面我试试
    打赏作者鼓励一下!
  • TA的每日心情
    慵懒
    2019-5-23 08:55
  • 签到天数: 495 天

    [LV.9]以坛为家II

    发表于 2017-5-31 09:27 | 显示全部楼层
    本帖最后由 O_oYYQ 于 2017-6-1 09:38 编辑

    顶一个~~支持一哈
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    无聊
    2019-5-18 11:41
  • 签到天数: 45 天

    [LV.5]常住居民I

    发表于 2017-6-1 08:52 | 显示全部楼层
    谢谢分享,收藏保存一个。
  • TA的每日心情
    开心
    2018-3-18 16:07
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2017-6-1 08:59 | 显示全部楼层
    帮顶帮顶,,哈哈哈哈
  • TA的每日心情
    难过
    2018-7-25 09:18
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2017-10-11 11:07 | 显示全部楼层
    本帖最后由 Davidwxj 于 2017-10-11 11:30 编辑

    楼主您好,为什么我库导入后示例编译失败啦,提示FPMXX.h第95.96行有问题
  • TA的每日心情
    慵懒
    2017-11-29 22:43
  • 签到天数: 22 天

    [LV.4]偶尔看看III

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

    麻烦贴一下具体的错误log
  • TA的每日心情
    难过
    2018-7-25 09:18
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 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]'
  • TA的每日心情
    慵懒
    2017-11-29 22:43
  • 签到天数: 22 天

    [LV.4]偶尔看看III

     楼主| 发表于 2017-10-22 19:24 | 显示全部楼层
    Davidwxj 发表于 2017-10-14 08:07
    运行的是你的示例,错误提示如下

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

    本版积分规则

    热门推荐

    请问一下微动开关 4X4矩阵键盘 16按键  怎么接ardiuno的 接口?
    请问一下微动开关 4X4矩阵
    请问下这款微动开关 4X4矩阵键盘 16按键的 8个接口分别接单片机的什么口,我
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    Nano 一直显示上传,不显示上传成功。
    Nano 一直显示上传,不显
    前面用的还好好的,突然就传不上程序了。一直停留在上传状态中,就是不限显示上传成功
    【项目】基于Arduino Nano的多功能桌面感应垃圾桶
    【项目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感应垃圾桶随着大学生活不断往前迈进,宿舍桌面上的杂物
    Arduino板接74HC拓展接驱动器接多个四项电机
    Arduino板接74HC拓展接驱
    一个Arduino板能不能接多个74HC595来得到多个拓展? 如果能的话要怎么接啊? 如果接
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表