DIY自制的智能门禁,指纹解锁+红外线遥控解锁。
对于上大学的的同学来讲,困扰的问题就是回宿舍发现没钥匙,
指纹解锁的面世,便是其中一种的解决方案。
另外,平时躺在床上玩手机,
我真的懒得下去帮同学开门!
还有玩游戏玩到一半也总有人来敲门,别担心,我用遥控,成就你的梦想~。
材料准备
1. AS608指纹模块
2. 12V电磁锁 和 三极管(可替换成5V电磁锁)
3. Arduino UNO
3. Lcd1602 I2c(次要)
4. 红外接收头+小LED灯+ 红外遥控器
5. 其他模块:面包板,杜邦线,12V变压器,必要的电源**
接下来是接线
1. 指纹AS608:VCC-3.3 必须3.3不然会烧坏GND-GND
TX-RX ,RX-TX, 我分别是接的D2和D3
2. 显示屏LCD1602 I2c: VCC-5V GND-GND SDA-A4 SCL-A5
3. 12V变压器负极接arduino的GND,正极接电磁锁,
三极管上管接电磁锁负极,基极接D13,下管接GND。
(这里我运用了面包板来接线,面包板作用是让拓展电路并固定,
不用面包板也可以。)
4. 按钮是三脚高电平触发,vcc-vcc,gnd-gnd,out-4
红外接头和按钮差不多 vcc-vcc,gnd-gnd,out-7
LED小灯泡正极接8,负极gnd
接下来是
代码
注册指纹的代码
#include <Adafruit_Fingerprint.h>
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
uint8_t id;
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 port
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
}
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;
}
}
在arduino IDE 打开串口,输入一个数值 例如 1 或者2 ,29 ,不可以太多,录制个数有限,一百多个,具体看AS608的数据
输入以后开始录指纹,看串口提示,成功就有提示
接下来是直入正题,
寻找指纹并解锁
三极管的作用,便是作为锁的开关
//岭师宿舍指纹认证,红外解锁。
#include "IRremote.h"
#include <Adafruit_Fingerprint.h>//指纹库
#include <LiquidCrystal_I2C.h>//I2C转接的库
#include <Wire.h> //LCD的库
const int BUTTON=4; //声明变量,按钮接在第7针脚;
int sensorValue = digitalRead(4);
int RECV_PIN = 7;
int LED_PIN = 8;
IRrecv irrecv(RECV_PIN);
decode_results results;
LiquidCrystal_I2C lcd(0x3F,16,2); //显示屏的地址,我的是0x3F 我接的是 A4 A5
SoftwareSerial mySerial(2, 3);//2,3分别为RX,TX 这是设置接口
String Mingzi; //声明Mingzi(名字)为一个变量
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);//在之前的串行引脚上创建一个名为finger的Adafruit_Fingerprint对象
void setup()
{
pinMode(13,OUTPUT);//设置D13为输出
digitalWrite(13,LOW);//D13设置为低电平 因为要控制三极管低电平 锁才会锁住,如果为高 三极管通了,锁相当于通电,锁就开了,
lcd.init(); // 初始化
lcd.backlight(); // 调亮显示屏的背景
Serial.begin(9600);
while (!Serial);
delay(100);
Serial.println("\n\nAdafruit finger detect test");
pinMode(BUTTON,INPUT_PULLUP);//定义BUTTON为输出模式;
Serial.begin(9600);
irrecv.enableIRIn(); //红外线接收的初始化
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
lcd.setCursor(0,0);
lcd.print("Found fingerprint");
lcd.setCursor(0,1);
lcd.print(" sensor!");
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor ");
lcd.setCursor(0,0);
lcd.print("Unable to found");
lcd.setCursor(0, 1);
lcd.print("Sensor");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Check Connections");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Waiting for ");
lcd.setCursor(0, 1);
lcd.print("valid finger...");
}
void loop()
{
if (digitalRead(BUTTON) == HIGH) {
digitalWrite(LED_PIN, sensorValue);
sensorValue = !sensorValue;
while (digitalRead(BUTTON) == HIGH );
}
if (digitalRead(LED_PIN) == HIGH){
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value == 0xFFA25D||results.value == 0xE318261B ) //开锁
{
digitalWrite(13,HIGH);
} else if (results.value == 0xFF629D||results.value == 0x511DBB ) //关锁
{
digitalWrite(13,LOW);
}
irrecv.resume(); // Receive the next value
}
delay(100);
}
getFingerprintIDez();
delay(50);
}
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.fingerFastSearch();
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!
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);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Found ID #");lcd.print(finger.fingerID);
if(finger.fingerID == 1){
Mingzi ="MR.Zhang";}//名字系统
else if(finger.fingerID == 2){
Mingzi = "SHI";}
lcd.setCursor(0,1);
lcd.print("Welcome ");lcd.print(Mingzi);
digitalWrite(13,HIGH);//开锁
delay(3000);//延迟三秒
digitalWrite(13,LOW);//关锁
return finger.fingerID;
}
打开串口 按上小手,可以看见指纹被匹配到,和对匹配的指纹给出的相应的信心程度
名字系统是可以修改的,显示在lcd1602上,须自行添加
制作过程也出现了不少问题,如图片和视频中,我用的三极管其实已经烧坏了好几个,功率太小不能用,还是要买大功率的三极管或者达林顿管都可以。
视频演示地址
- b站视频演示:https://www.bilibili.com/video/av93386179/
制作 By—KVG