KVG製作-【Arduino指紋解鎖 智能家居系列-01】DIY自制的智能門禁,AS608指紋解鎖+紅外線遙控解鎖。附演示視頻。

指紋解鎖電磁鎖

DIY自制的智能門禁,指紋解鎖+紅外線遙控解鎖。

    對於上大學的的同學來講,困擾的問題就是回宿舍發現沒鑰匙,
    
    指紋解鎖的面世,便是其中一種的解決方案。
    
    另外,平時躺在牀上玩手機,
    
    我真的懶得下去幫同學開門!
    
    還有玩遊戲玩到一半也總有人來敲門,別擔心,我用遙控,成就你的夢想~。

電磁鎖

材料準備

1. AS608指紋模塊 (45元)在這裏插入圖片描述
2. 12V電磁鎖 (28元)(可替換成5V電磁鎖,也就六塊錢)在這裏插入圖片描述
3. 3. Arduino UNO(官方進口版100左右,國產版12元)在這裏插入圖片描述
4. Lcd1602 I2c(次要)在這裏插入圖片描述
5. 紅外接收頭+小LED燈+ 紅外遙控器+一個三腳的按鍵開關(幾塊錢)在這裏插入圖片描述
6. 其他模塊:麪包板,杜邦線,220V轉12V的變壓器,必要的220V家用電源

7.三極管 tip122 用這個才能控制12V 1A的電源

接下來是接線

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

5.紅外接頭和按鈕差不多 vcc-vcc,gnd-gnd,out-7

6.LED小燈泡正極接8,負極gnd

對於嶺師的同學的煩惱,就是忘記帶鑰匙,宿友也在外面忙,進不去宿舍門,苦苦等待(慘),如今一個人工智能電磁鎖的問世,解決嶺師同胞的忘記帶鑰匙而導致的腦殼痛的病。然後另一個問題,我們男同胞,或者女同胞,平時在宿舍,不是在牀上的,多半是在下面打遊戲,實在是不想在有人來的時候,撥開椅子,跳下梯子,去開門,於是,紅外遙控的門鎖也誕生了,朋友再也不用擔心在門後等太久,只需一個按鍵,門馬上開,當然,這是僅限於室內有人,纔可以用紅外線控制,不然外面的人也可以紅外線遙控開鎖,那就不行了,通過按鍵開關,改變室內是否 有人 的狀態。

接下來是

庫文件

添加庫中搜索
指紋庫 fingerprint
紅外線庫 IRremote
LCD庫 LiquidCrystal_I2C

代碼

註冊指紋的代碼

#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/av93886822

製作 ByKVG

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章