查看: 3120|回复: 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)



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

本版积分规则

热门推荐

求助VSCode+PlatformIO Arduino怎么把文件包含到工程中
求助VSCode+PlatformIO Ar
请教一下论坛大佬 PlatformIO对文件进行编译过程中报错“undefined reference to xxx
一款基于Arduino平台的零代码就可驱动的串口彩屏分享
一款基于Arduino平台的零
多年前在论坛上看到一个帖子: 引起了我的共鸣:能不能有一种彩屏,可以像Arduino I
自制麦轮小车robomasterV4详细教程
自制麦轮小车robomasterV4
一 介绍 这个帖子中,我将介绍用arduino制作一台PID调制的麦轮小车底盘部分的方法 资
MS39233 无刷直流马达—完美替代 ST SPIN233
MS39233 无刷直流马达—完
MS39233 是一款低压三个半桥驱动器。完美替代ST SPIN233。它可应用于低电压及电池供电
用arduino nano 连接esp8266,代码写不进esp8266里面,有偿求解决
用arduino nano 连接esp82
哪位大佬能帮我解决下,发二十元红包请喝杯奶茶。+V:lcmazjq 接线图和错误信息在附件
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表