网上刷到很多视频,看见很多和我一样的大学生自己用单片机给自己宿舍安装指纹锁,我们宿舍经常忘带钥匙,而且随身携带钥匙也很麻烦,所以我选择像网上的一样自己给自己做一个指纹锁,刚好实验室有3D打印机,也正好用三维建模软件给指纹模块做一个外壳,和一些用机械结构来实现开门的结构件,建模时预留了RFID的安装位置,后续在增加,实物如下所示:

​​​​​​​


根据自己的实际情况连接好各模块后可以参考以下程序编程,注意指纹模块RX,TX脚位和舵机控制脚位需要和你连接模块的脚位对应。

舵机各引脚代表意思:

橙色信号线

红色5V电源线

棕色GND地线

AS608指纹模块引脚:

(图片来源于网络)


1.在此之前,我们先要下好<Adafruit_Findgerprint.h>的库文件,将下载好的库解压到项目文件中的lib目录下,后续程序中需要用到此头文件:

  Adafruit-Fingerprint-Sensor-Library-master(单击跳转)

2.主程序代码如下:

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <Servo.h>Servo myservo;
//软件串口模拟通信,用来指定RX,TX引脚
SoftwareSerial mySerial(2, 3);//定义全局变量pos(舵机旋转度数)
int pos=0;//初始化
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int fingerprintID = 0;
int getFingerprintIDez();void setup() {//舵机信号口myservo.attach(5);//指纹传感器模块设置Serial.begin(9600);//设置传感器串行端口的数据速率finger.begin(57600);//下列语句识别是否安装指纹模块if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");}else {Serial.println("Did not find fingerprint sensor :(");while (1) { delay(1); }}
}void loop() {//初始化舵机度数(通电时舵机默认角度)//myservo.write(100);fingerprintID = getFingerprintIDez();delay(50);//如果找到下列指纹序号if(fingerprintID >= 0){pos=0;myservo.write(pos);delay(3800);pos=100;myservo.write(pos);delay(15);}delay(15);
}//指纹匹配函数,返回值为ID号
int getFingerprintIDez() {uint8_t p = finger.getImage();if (p != FINGERPRINT_OK)  return -1;p = finger.image2Tz();if (p != FINGERPRINT_OK)  return -1;p = finger.fingerFastSearch();if (p != FINGERPRINT_OK)  return -1;return finger.fingerID;
}

3.主程序写完后,新建一个程序文件,编写以下程序用来添加指纹数据,该文件可在Adafruit库的官方示例程序中找到:

(添加指纹的操作在串口监视器中进行)

/***************************************************This is an example sketch for our optical Fingerprint sensorDesigned specifically to work with the Adafruit BMP085 Breakout----> http://www.adafruit.com/products/751These displays use TTL Serial to communicate, 2 pins are required tointerfaceAdafruit invests time and resources providing this open source code,please support Adafruit and open-source hardware by purchasingproducts from Adafruit!Written by Limor Fried/Ladyada for Adafruit Industries.BSD license, all text above must be included in any redistribution****************************************************/#include <Adafruit_Fingerprint.h>#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1#endifAdafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);uint8_t id;
uint8_t getFingerprintEnroll();void setup()
{Serial.begin(9600);while (!Serial);  // For Yun/Leo/Micro/Zero/...delay(100);Serial.println("\n\nAdafruit Fingerprint sensor enrollment");// set the data rate for the sensor serial portfinger.begin(57600);if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :(");while (1) { delay(1); }}Serial.println(F("Reading sensor parameters"));finger.getParameters();Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);Serial.print(F("Capacity: ")); Serial.println(finger.capacity);Serial.print(F("Security level: ")); Serial.println(finger.security_level);Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
}uint8_t readnumber(void) {uint8_t num = 0;while (num == 0) {while (! Serial.available());num = Serial.parseInt();}return num;
}void loop()                     // run over and over again
{Serial.println("Ready to enroll a fingerprint!");Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");id = readnumber();if (id == 0) {// ID #0 not allowed, try again!return;}Serial.print("Enrolling ID #");Serial.println(id);while (!  getFingerprintEnroll() );
}uint8_t getFingerprintEnroll() {int p = -1;Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);while (p != FINGERPRINT_OK) {p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.println(".");break;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");break;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");break;default:Serial.println("Unknown error");break;}}// OK success!p = finger.image2Tz(1);switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}Serial.println("Remove finger");delay(2000);p = 0;while (p != FINGERPRINT_NOFINGER) {p = finger.getImage();}Serial.print("ID "); Serial.println(id);p = -1;Serial.println("Place same finger again");while (p != FINGERPRINT_OK) {p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.print(".");break;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");break;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");break;default:Serial.println("Unknown error");break;}}// OK success!p = finger.image2Tz(2);switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}// OK converted!Serial.print("Creating model for #");  Serial.println(id);p = finger.createModel();if (p == FINGERPRINT_OK) {Serial.println("Prints matched!");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_ENROLLMISMATCH) {Serial.println("Fingerprints did not match");return p;} else {Serial.println("Unknown error");return p;}Serial.print("ID "); Serial.println(id);p = finger.storeModel(id);if (p == FINGERPRINT_OK) {Serial.println("Stored!");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_BADLOCATION) {Serial.println("Could not store in that location");return p;} else if (p == FINGERPRINT_FLASHERR) {Serial.println("Error writing to flash");return p;} else {Serial.println("Unknown error");return p;}return true;
}

4.指纹添加完成后,再新建一个程序文件,编写以下代码,用来测试指纹是否添加成功,该文件可在Adafruit库的官方示例程序中找到:

(添加指纹的操作在串口监视器中进行)

/***************************************************This is an example sketch for our optical Fingerprint sensorDesigned specifically to work with the Adafruit BMP085 Breakout----> http://www.adafruit.com/products/751These displays use TTL Serial to communicate, 2 pins are required tointerfaceAdafruit invests time and resources providing this open source code,please support Adafruit and open-source hardware by purchasingproducts from Adafruit!Written by Limor Fried/Ladyada for Adafruit Industries.BSD license, all text above must be included in any redistribution****************************************************/#include <Adafruit_Fingerprint.h>#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1#endifAdafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);uint8_t getFingerprintID();void setup()
{Serial.begin(9600);while (!Serial);  // For Yun/Leo/Micro/Zero/...delay(100);Serial.println("\n\nAdafruit finger detect test");// set the data rate for the sensor serial portfinger.begin(57600);delay(5);if (finger.verifyPassword()) {Serial.println("Found fingerprint sensor!");} else {Serial.println("Did not find fingerprint sensor :(");while (1) { delay(1); }}Serial.println(F("Reading sensor parameters"));finger.getParameters();Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);Serial.print(F("Capacity: ")); Serial.println(finger.capacity);Serial.print(F("Security level: ")); Serial.println(finger.security_level);Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);finger.getTemplateCount();if (finger.templateCount == 0) {Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");}else {Serial.println("Waiting for valid finger...");Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");}
}void loop()                     // run over and over again
{getFingerprintID();delay(50);            //don't ned to run this at full speed.
}uint8_t getFingerprintID() {uint8_t p = finger.getImage();switch (p) {case FINGERPRINT_OK:Serial.println("Image taken");break;case FINGERPRINT_NOFINGER:Serial.println("No finger detected");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_IMAGEFAIL:Serial.println("Imaging error");return p;default:Serial.println("Unknown error");return p;}// OK success!p = finger.image2Tz();switch (p) {case FINGERPRINT_OK:Serial.println("Image converted");break;case FINGERPRINT_IMAGEMESS:Serial.println("Image too messy");return p;case FINGERPRINT_PACKETRECIEVEERR:Serial.println("Communication error");return p;case FINGERPRINT_FEATUREFAIL:Serial.println("Could not find fingerprint features");return p;case FINGERPRINT_INVALIDIMAGE:Serial.println("Could not find fingerprint features");return p;default:Serial.println("Unknown error");return p;}// OK converted!p = finger.fingerSearch();if (p == FINGERPRINT_OK) {Serial.println("Found a print match!");} else if (p == FINGERPRINT_PACKETRECIEVEERR) {Serial.println("Communication error");return p;} else if (p == FINGERPRINT_NOTFOUND) {Serial.println("Did not find a match");return p;} else {Serial.println("Unknown error");return p;}// found a match!Serial.print("Found ID #"); Serial.print(finger.fingerID);Serial.print(" with confidence of "); Serial.println(finger.confidence);return finger.fingerID;
}// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {uint8_t p = finger.getImage();if (p != FINGERPRINT_OK)  return -1;p = finger.image2Tz();if (p != FINGERPRINT_OK)  return -1;p = finger.fingerFastSearch();if (p != FINGERPRINT_OK)  return -1;// found a match!Serial.print("Found ID #"); Serial.print(finger.fingerID);Serial.print(" with confidence of "); Serial.println(finger.confidence);return finger.fingerID;
}

基于Arduino和AS608模块的指纹门禁锁--舵机控制相关推荐

  1. 51单片机课程设计 || 基于AS608模块的指纹锁

    知乎:Fragtex CSDN: 川明_Fragtex 代码 代码速览: 源码 [闲鱼]https://m.tb.cn/h.U1SDh0Z?tk=npyX2Dqp114 CZ0001 「我在闲鱼发布了 ...

  2. Arduino uno使用PCA9685模块实现16路舵机控制

    PCA9685模块 PCA9685是16路12位PWM信号发生器,可用于控制舵机.led.电机等设备,采用I2C通信.主机只需要I2C接口即可实现16路舵机控制. PCA9685的I2C地址默认0x4 ...

  3. Arduino教程 模拟输入输出以及电机和舵机控制

    一.模拟输入输出 0x01.输入: Arduino采用analogRead(analogInPin)函数读取0~5V的模拟信号,返回0~1023的整数 如:读入为500,那么测得电压为5×(500/1 ...

  4. 基于Arduino开发板的光学指纹识别模块(FPM10A)

    本篇文章主要介绍如何在Arduino开发板上使用指纹传感器模块FPM10A.我们将向您介绍如何注册新的指纹ID,以及如何查找匹配的指纹. 所需的硬件 Arduino UNO开发板 指纹传感器模块 跳线 ...

  5. 基于FPGA的指纹识别(使用AS608模块)

    项目介绍 硬件平台:正点原子新起点FPGA开发板或小脚丫MAX10 FPGA开发板.AS608指纹识别模块 软件平台:Quartusii13.1 功能定义 详细要求 key1:添加一个指纹 Key2: ...

  6. 基于树莓派实现AS608指纹识别

    基于树莓派实现AS608指纹识别 1.展示效果 1.1.按压手指 1.2.录入手指 1.3.匹配成功 注意:别人只是实现基本功能,还有许多的功能依葫芦画瓢自己加进去就行了. 2.具体过程 2.1.连接 ...

  7. 基于Arduino IDE开发的LD3320语音识别模块

    基于Arduino的LD3320语音识别模块设计详解 文章目录 基于Arduino的LD3320语音识别模块设计详解 前言 一.LD3320驱动编写 step 1.0 使用Arduino的SPI库,通 ...

  8. 【继电器模块教程基于Arduino】

    继电器模块教程基于Arduino 前言 介绍继电器模块 继电器引出线 示例:使用继电器模块和 PIR 运动传感器控制灯![在这里插入图片描述](https://img-blog.csdnimg.cn/ ...

  9. 红外测温枪,超进化 -- 智能温度传感器 基于 arduino 的智能测温模块

    红外测温枪,超进化!--智能温度传感器!基于 arduino 的智能测温模块. 前言 硬件选择 代码讲解 通过 SDDC 协议接入 Spirit 1 部分 配置设备信息 数据获取与发送流程 融合!特殊 ...

最新文章

  1. 【剑指Offer】23、二叉搜索树的后序遍历序列
  2. 服!AI 让兵马俑“活”起来,颜值惊艳!
  3. Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)...
  4. 散列表相关题目(线性探测再散列法)
  5. ObjectTive C语言语法,[译]理解 Objective-C 运行时(下篇)
  6. django创建新的项目、App与基本配置
  7. iOS开发——高级技术PassBook服务
  8. json for-in 来循环对象的属性
  9. flex布局 详细开发教程
  10. 刚刚,Google 官方发布了 2 份编程指南,干货十足!
  11. 自己动手美化博客园个人博客
  12. spring3.1.1与commons-dbcp1.2的冲突?
  13. Java实现PDF生成(Word文档转Pdf)
  14. 项目实习——《图书管理系统》需求分析
  15. 豆果美食APP,看一下都给[Python爬虫爱好者]提供了哪些接口
  16. 微信公众平台深度开发JAVA版
  17. [USACO18DEC]Fine Dining
  18. 台服天堂2更新服务器无响应,天堂2台服被限制怎么回事?该怎么解决?
  19. mysqladmin命令的用法
  20. html5网页流行色,Pantone 2018流行色:紫外光色(附紫色的UI设计作品)

热门文章

  1. Excel表计算两个时间段之间的总月数、折算年限公式
  2. [NOIP2001 普及组] 最大公约数和最小公倍数题解
  3. 一文读懂三种并发控制机制(封锁、时间戳、有效性确认,大量例子+证明)
  4. JavaScript实现京东轮播图效果——自动轮播,左右按钮切换图片,小圆圈跟随图片变化,点击小圆圈可跳转图片,无缝循环播放
  5. Linux 系统中 resolv.conf 文件详解
  6. 红外线发射与接收源程序
  7. 虚拟机开启及简单的系统命令
  8. UrlRewrite 是用来干什么的?
  9. SAP Fiori Elements SmartLink 创建实例的单步调试
  10. BI 是如何数据分析的?