新品应用测试—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]