新品应用测试—M5StickC指纹模块-Arduino中文社区 - Powered by Discuz! Archiver

vany5921 发表于 2019-9-20 15:43

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

本帖最后由 vany5921 于 2019-9-23 18:22 编辑


指纹认证技术现在已经很成熟了,从移动支付到智能门锁各种应用场景无处不在,方便的解决了密码泄露、密码遗忘等问题,今天我们看到的是M5StickC的指纹HAT,它内置了FPC1020A指纹识别模块,先来了解一下相关参数:

从上表中我们可以看出它以uart进行通信,最高存储指纹3000组,输出三种格式,这意味着使用这款指纹模块开发市面常见的考勤机没有任何问题,开发的重点在于数据结构的建构和指纹图像的处理。


下面展示一个简单的远程指纹验证的小案例。本案例通过MQTT服务器进行远程通信,M5StickC用于发布指定主题(success)的消息,M5Stack用于订阅指定主题(fail)的消息,为了简化处理流程这里只发送验证比对后的结果。验证成功那么M5Stack会亮起绿灯提示,验证失败M5Stack亮红灯。在实际应用场景中,可以将LED修改配置为GPIO来控制外接设备
关于串口协议还是比较简单的,具体使用查看附件

字节12345678
命令0xF5CMDP1P2P30CHK0xF5
应答0xF5CMDQ1Q2Q30CHK0xF5
固定的0XF5数据头+CMD指令+P1命令参数+P2命令参数+P3命令参数+0+校验位(第2字节到第6字节的异或值),最后一位是固定的0XF5,应答一般有三种情况,成功/失败/超时。根据协议,封装一下常用的添加指纹、删除指纹、验证指纹就可以使用了。本文重点在于MQTT的收发。
先添加必要的头文件、变量
#include <M5StickC.h>
#include "finger.h"
#include "EspMQTTClient.h"
uint8_t userNum;         //User number
FingerPrint FP_M;


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

// 回调函数,当发布或者订阅消息时执行,不可省略这里我没有执行任何操作但是仍然要添加。
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");
//});
}

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");设备掉线发送最后信息
}

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();
   
}

以上是M5StickC的发布端,接下来是M5Stack的订阅端,指纹验证成功绿灯亮起,屏幕显示√。指纹验证失败红灯亮起,屏幕显示X,验证超时则不响应。
头文件多了显示的图片及LED灯带
#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);


void setup()
{
M5.begin();
pixels.begin();
M5.Lcd.clear(WHITE);
M5.Lcd.setTextDatum(MC_DATUM);
M5.Lcd.setTextColor(RED, WHITE);
M5.Lcd.drawString("FingerprintVerification", 160, 20, 4);
M5.Lcd.drawBitmap(110, 35, 100, 100, timg0);
}

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);
});


}

void loop()
{
client.loop();

}




页: [1]
查看完整版本: 新品应用测试—M5StickC指纹模块