框架图


硬件连接,指纹传感器使用串口与树莓派Pico连接,这里连接到树莓派Pico的串口1(GP0,GP1),并且将指纹传感器的4、6脚短接起来,接到3.3V的电源口上;5脚是指纹传感器的额输出端,这里没有使用,悬空处理。舵机使用5V供电,信号脚接到GP28脚。
代码
#include <Arduino.h>
#include <DFRobot_ID809.h>
#define COLLECT_NUMBER 2 //指纹采样次数,可设置2-3
#define FPSerial Serial1
DFRobot_ID809 fingerprint;
void setup()
{
Serial.begin(115200);
FPSerial.begin(115200);
fingerprint.begin(FPSerial);
while (fingerprint.isConnected() == false) {
Serial.println("与设备通讯失败,请检查接线");
Serial.println(fingerprint.getErrorDescription());
delay(1000);
}
fingerprint.delFingerprint(DELALL); //删除所有指纹
}
uint8_t ID, i, ret;
void loop()
{
/*获取一个未注册编号,用来保存指纹 获取成功返回ID号, 获取失败返回ERR_ID809 */
if ((ID = fingerprint.getEmptyID()) != ERR_ID809) {
Serial.print("未注册编号,ID=");
Serial.println(ID);
i = 0; //采样计数清零 /*指纹采样2次*/
while (i < COLLECT_NUMBER) {
fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eBreathing, /*LEDColor = */ fingerprint.eLEDBlue, /*blinkCount = */ 0);
Serial.print("正在进行第");
Serial.print(i + 1);
Serial.println("次指纹采样");
Serial.println("请按下手指");
/*采集指纹图像,超过10S没按下手指则采集超时,如果timeout=0,关闭采集超时功能 如果获取成功返回0,否则返回ERR_ID809 */
if ((fingerprint.collectionFingerprint(/*timeout = */ 10)) != ERR_ID809) {
fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eFastBlink, /*LEDColor = */ fingerprint.eLEDYellow, /*blinkCount = */ 3); /*设置指纹灯环为黄色快闪3次*/
Serial.println("采集成功");
i++; //采样计数+1
}
else{
Serial.println("采集失败");
}
Serial.println("请松开手指");
/*等待手指松开 检测到手指返回1,否则返回0 */
while (fingerprint.detectFinger());
}
/*将指纹信息保存到一个未注册的编号中*/
if (fingerprint.storeFingerprint(/*Empty ID = */ ID) != ERR_ID809) {
Serial.print("保存成功,ID=");
Serial.println(ID);
Serial.println("-----------------------------");
/*设置指纹灯环为绿色常亮*/
fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eKeepsOn, /*LEDColor = */ fingerprint.eLEDGreen, /*blinkCount = */ 0);
delay(1000);
/*关闭指纹灯环*/
fingerprint.ctrlLED(/*LEDMode = */ fingerprint.eNormalClose, /*LEDColor = */ fingerprint.eLEDBlue, /*blinkCount = */ 0);
delay(1000);
}
else {
Serial.println("保存失败");
}
}
}
#include <Arduino.h>
#include <Servo.h>
#include <DFRobot_ID809.h>
#define LOCKPIN 28
#define FPSerial Serial1
Servo servo; // 控制舵机
DFRobot_ID809 fingerprint; //指纹
// 控制锁的开关
void lock_action(bool lock){
if(lock){
servo.write(0);
}else{
servo.write(180);
}
}
void setup() {
Serial.begin(115200);
servo.attach(LOCKPIN); //初始化舵机,初始化后置于锁状态
lock_action(false);
FPSerial.begin(115200);
fingerprint.begin(FPSerial);
while(fingerprint.isConnected() == false){
Serial.println("与设备通讯失败,请检查接线");
delay(1000);
}
//设置指纹采集器 等待模式 处于蓝色呼吸灯状态
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}
void loop() {
uint8_t fingerid=0;
// 采集指纹图像,关闭采集超时功能 如果获取成功返回0,否则返回ERR_ID809
if((fingerprint.collectionFingerprint(/*timeout=*/0)) != ERR_ID809){
/*设置指纹灯环为黄色快闪2次*/
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDYellow, /*blinkCount = */2);
Serial.println("采集成功");
Serial.println("请松开手指");
// 等待手指松开 检测到手指返回1,否则返回0
while(fingerprint.detectFinger());
// 将采集到的指纹与指纹库中的所有指纹对比, 成功返回指纹编号(1-80),失败返回0
fingerid = fingerprint.search();
// 将采集到的指纹与指定编号指纹对比 成功返回指纹编号(1-80),失败返回0
if(fingerid != 0){
// 指纹匹配,设置指纹灯环为绿色闪亮 并且开锁
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDGreen, /*blinkCount = */3);
Serial.print("匹配成功,ID=");
Serial.println(fingerid);
lock_action(true);
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eKeepsOn, /*LEDColor = */fingerprint.eLEDCyan, /*blinkCount = */0);
delay(10000); //保持开门状态10秒
lock_action(false);
}else{
// 指纹不匹配,设置指纹灯环为红色闪亮 不开锁
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eFastBlink, /*LEDColor = */fingerprint.eLEDRed, /*blinkCount = */3);
Serial.println("匹配失败");
lock_action(false);
}
}else{
Serial.println("采集失败");
}
delay(2000);
fingerprint.ctrlLED(/*LEDMode = */fingerprint.eBreathing, /*LEDColor = */fingerprint.eLEDBlue, /*blinkCount = */0);
}实现效果



我要赚赏金
