Skip to content

Instantly share code, notes, and snippets.

@woorimlee
Last active September 26, 2023 07:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save woorimlee/a05a2c0317ab0b3e67071ea661ba9c80 to your computer and use it in GitHub Desktop.
Save woorimlee/a05a2c0317ab0b3e67071ea661ba9c80 to your computer and use it in GitHub Desktop.

DIY 지문 인식 도어락

  • 지문 인식 센서 jm-101B를 이용해 출입이 허가된 사람과 아닌 사람을 구분하고, 서보 모터로 경첩을 열고 닫음.
  • 라이브러리의 기초 예제 파일인 delete, enroll은 그대로 사용했으며, fingerprint.ino만 아래의 소스 코드처럼 수정했습니다.
  1. 지문 인식 센서에 사용자 지문 등록
  2. 지문 등록 과정이 끝나면 아래의 아두이노 파일을 업로드
  3. 작동중인 프로그램에 지문 검사를 하면 끝.
  4. 출입 불허된 사람 LED, 부저 울리는 코드와, 서보모터 각도 조종하는 코드만 추가함.

사용한 라이브러리 :

사용한 센서 :

보완점 :

  • 서보 모터로 구현한 출입 허용 및 차단 기능을 더 적합한 물체로 보완해야(경첩과 솔레노이드 등) 실 사용이 가능함
  • 지문 인식 센서가 지문을 잘 인식하지 못함. 어쩔수 없는듯

연결 완성 사진

/***************************************************
This is an example sketch for our optical Fingerprint sensor
Designed specifically to work with the Adafruit BMP085 Breakout
----> http://www.adafruit.com/products/751
These displays use TTL Serial to communicate, 2 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
/*****************************************************************************
<DIY 지문 인식 장치. (원래는 방 문, 교실 문 잠그려고 만듦)>
1. 미리 학급에 출입해도 되는 학생들의 지문을 등록한다.
2. 지문 인식 센서를 통해 출입이 허가된 학생들은 서보 모터의 각도를 바꿔 잠금 장치를 연다.
3. 등록되지 않은 학생의 지문이 인식되면 경고 부저와 LED가 반짝이게 된다.
*****************************************************************************/
#include <Adafruit_Fingerprint.h>
#include<Servo.h> //Servo 라이브러리를 추가
Servo servo; //Servo 클래스로 servo객체 생성
//핀 정의
int touchSensor = 8; // 터치센서 핀 설정
int ledPin = 9;
int buzzerPin = 11;
int servoPin = 7; //0도에 열고 180도에 닫고
//서보 모터 각도 조절을 위한 변수
bool flag = false;
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
servo.attach(servoPin);
servo.write(180);
pinMode(touchSensor, INPUT);
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}
void loop() // run over and over again
{
getFingerprintIDez();
if(flag) {
servo.write(1);
delay(1000);
}
//이미 출입한 학생이 학급안에서 바깥에 있는 잠금 장치를 잠그기 위해 터치 센서를
//교실 안쪽에 따로 설치해둠.
//터치 센서 동작시 문을 닫음.
int touchValue = digitalRead(touchSensor);
if (touchValue == HIGH){
servo.write(179);
Serial.println("문을 닫습니다.");
flag = false;
}
delay(300); //don't need 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.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!
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) {
Serial.println("Waiting");
return -1;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
Serial.println("22");
return -1;
}
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {
Serial.println("Denied");
tone(buzzerPin, 261.63, 500);
flag = false;
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
servo.write(179);
return -1;
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
if(finger.confidence >= 100){
Serial.println("문이 열립니다.");
flag=true;
}
else{
Serial.println("retouch");
}
return finger.fingerID;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment