查看: 2484|回复: 0

新品应用测试—M5StickC指纹模块

[复制链接]

该用户从未签到

发表于 2019-9-20 15:43 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2019-9-23 18:22 编辑

6.jpg
指纹认证技术现在已经很成熟了,从移动支付到智能门锁各种应用场景无处不在,方便的解决了密码泄露、密码遗忘等问题,今天我们看到的是M5StickC的指纹HAT,它内置了FPC1020A指纹识别模块,先来了解一下相关参数:
unit_finger_03_zh_CN-2.png
从上表中我们可以看出它以uart进行通信,最高存储指纹3000组,输出三种格式,这意味着使用这款指纹模块开发市面常见的考勤机没有任何问题,开发的重点在于数据结构的建构和指纹图像的处理。

IMG_8878_cut.jpg
下面展示一个简单的远程指纹验证的小案例。本案例通过MQTT服务器进行远程通信,M5StickC用于发布指定主题(success)的消息,M5Stack用于订阅指定主题(fail)的消息,为了简化处理流程这里只发送验证比对后的结果。验证成功那么M5Stack会亮起绿灯提示,验证失败M5Stack亮红灯。在实际应用场景中,可以将LED修改配置为GPIO来控制外接设备
关于串口协议还是比较简单的,具体使用查看附件
字节
1
2
3
4
5
6
7
8
命令
0xF5
CMD
P1
P2
P3
0
CHK
0xF5
应答
0xF5
CMD
Q1
Q2
Q3
0
CHK
0xF5
固定的0XF5数据头+CMD指令+P1命令参数+P2命令参数+P3命令参数+0+校验位(2字节到第6字节的异或值),最后一位是固定的0XF5,应答一般有三种情况,成功/失败/超时。根据协议,封装一下常用的添加指纹、删除指纹、验证指纹就可以使用了。本文重点在于MQTT的收发。
先添加必要的头文件、变量
[mw_shl_code=arduino,true]#include <M5StickC.h>
#include "finger.h"
#include "EspMQTTClient.h"
uint8_t userNum;           //User number
FingerPrint FP_M;[/mw_shl_code]


在arduino中添加EspMQTTClient这个库,这个库使用起来非常简单,一看就能学会。
[mw_shl_code=arduino,true]EspMQTTClient client(
  "M5-5G",//WIFI名称
  "Office@888888",//WIFI密码
  "3.81.179.172",  // MQTT服务器IP地址,我用的是cloudmqtt
  "apimgqyr",   // MQTT用户名
  "XXXXXXXX",   // MQTT用户密码
  "fingerClient",     // 设备名称
  19801              // MQTT服务端口号
);[/mw_shl_code]

[mw_shl_code=arduino,true]// 回调函数,当发布或者订阅消息时执行,不可省略这里我没有执行任何操作但是仍然要添加。
void onConnectionEstablished()
{
  // Subscribe to "mytopic/test" and display received message to Serial
//client.subscribe("mytopic/test", [](const String & payload) {
//Serial.println(payload);
//});

  // Publish a message to "mytopic/test"
//client.publish("mytopic/test", "This is a message"); // You can activate the retain flag by setting the third parameter to true

  // Execute delayed instructions
//client.executeDelayed(5 * 1000, []() {
//client.publish("mytopic/test", "This is a message sent 5 seconds later");
//});
}[/mw_shl_code]

[mw_shl_code=arduino,true]void setup() {
    M5.begin();
    Serial2.begin(19200, SERIAL_8N1, 26, 0);//指纹模块对应(26, 0)默认波特率
    M5.Lcd.setRotation(3);
    //M5.Lcd.clear(BLACK);
    //M5.Lcd.setTextColor(YELLOW);
    //M5.Lcd.setTextFont(2);
    //M5.Lcd.setTextSize(3);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.println("Finger example");
   
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setCursor(0, 50);
    userNum = FP_M.fpm_getUserNum(); //获取指纹模块内指纹数量
    M5.Lcd.print("userNum:");
    M5.Lcd.println(userNum);
//client.enableDebuggingMessages(); // MQTT开启debug打印到串口
//client.enableHTTPWebUpdater(); // 更新MQTT的用户名和密码可重载为 enableHTTPWebUpdater("user", "password").
    client.enableLastWillMessage("TestClient/lastwill", "I am going offline");设备掉线发送最后信息
}[/mw_shl_code]

[mw_shl_code=arduino,true]void loop(){
    client.loop();//轮询MQTT
    uint8_t res1;
    if(M5.BtnA.wasPressed()){
        CleanScreen();
        M5.Lcd.println("Fingerprint Typing");
        
        res1 = FP_M.fpm_addUser(userNum,1);//添加指纹
        if(res1 == ACK_SUCCESS){  
            M5.Lcd.println("Success");
        }
        else if(res1 == ACK_FAIL){
            M5.Lcd.println("Fail");
        }
        else if(res1 == ACK_FULL){
            M5.Lcd.println("Full");
        }
        else{
            M5.Lcd.println("Timeout");
        }
        userNum++;
    }

    if(M5.BtnB.wasPressed()){ //验证用户,这里采取了按键的形式
      CleanScreen();
      M5.Lcd.println("Matching");
      
      res1 = FP_M.fpm_compareFinger();
      if(res1 == ACK_SUCCESS){
          M5.Lcd.println("Success");
          client.publish("mytopic/finger", "success");
      }
      if(res1 == ACK_NOUSER){
          M5.Lcd.println("No Such User");
          client.publish("mytopic/finger", "fail");
      }
      if(res1 == ACK_TIMEOUT){
          M5.Lcd.println("Timeout");
      }
    }

    M5.update();
   
}[/mw_shl_code]

以上是M5StickC的发布端,接下来是M5Stack的订阅端,指纹验证成功绿灯亮起,屏幕显示√。指纹验证失败红灯亮起,屏幕显示X,验证超时则不响应。
头文件多了显示的图片及LED灯带
[mw_shl_code=arduino,true]#include <M5Stack.h>
#include "EspMQTTClient.h"
#include "timg.h"   //屏幕显示的图片
#include <Adafruit_NeoPixel.h> //LED

#define M5STACK_FIRE_NEO_NUM_LEDS 10
#define M5STACK_FIRE_NEO_DATA_PIN 15

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(M5STACK_FIRE_NEO_NUM_LEDS, M5STACK_FIRE_NEO_DATA_PIN, NEO_GRB + NEO_KHZ800);
[/mw_shl_code]

[mw_shl_code=arduino,true]void setup()
{
  M5.begin();
  pixels.begin();
  M5.Lcd.clear(WHITE);
  M5.Lcd.setTextDatum(MC_DATUM);
  M5.Lcd.setTextColor(RED, WHITE);
  M5.Lcd.drawString("Fingerprint  Verification", 160, 20, 4);
  M5.Lcd.drawBitmap(110, 35, 100, 100, timg0);
}[/mw_shl_code]

[mw_shl_code=arduino,true]void onConnectionEstablished()   //MQTT回调函数,当接收到订阅消息后执行
{

  client.subscribe("mytopic/finger", [](const String & payload) {
    if(payload == "success"){
      for(int i = 0; i < 9; i++){
        pixels.setPixelColor(i, pixels.Color(0, 255, 0));     
        pixels.show();
      }
      M5.Lcd.drawBitmap(120, 140, 80, 80, timg1);
      delay(2000);
    }
    if(payload == "fail"){
      for(int i = 0; i < 9; i++){
        pixels.setPixelColor(i, pixels.Color(255, 0, 0));     
        pixels.show();
      }
      M5.Lcd.drawBitmap(120, 140, 80, 80, timg2);
      delay(2000);
    }
      for(int i = 0; i < 9; i++){
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));     
        pixels.show();
      }
    M5.Lcd.fillRect(0, 140, 320 ,80, WHITE);
  });


}[/mw_shl_code]

[mw_shl_code=arduino,true]void loop()
{
  client.loop();

}[/mw_shl_code]
biovo_fingerprint_Protocol_zh_CN.DOC.zip (43.65 KB, 下载次数: 7)



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

blinker物联网教程——11、自动灌溉
blinker物联网教程——11
简介[hr] 农业是用水大户,近年来农业用水量约占经济社会用水总量的62%,部分地区高达
求助,st7735显示图片扭曲
求助,st7735显示图片扭曲
前段时间买了个st7735s驱动的0.96tft屏,这两天研究了一下st7735的驱动,在网上找了些
朱雀 是基于ESP32的开源焊台控制器
朱雀 是基于ESP32的开源焊
朱雀 是基于ESP32的开源焊台控制器 本控制器除了控制普通焊台以外,只需通过稍作修改
16度双足机器人舵机驱动板pca9685连接舵机,舵机没反应
16度双足机器人舵机驱动板
各位同为arduino爱好者的大佬们大家好!想请教一下大家有关舵机驱动板pca9685
Arduino IDE 2.0.0 RC3开发STM32遇到的问题
Arduino IDE 2.0.0 RC3开
问题求助: 安装了Arduino IDE 2.0.0 rc3,下载安装了来自stm32duino的库,截图1。然
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表