아두이노 지문인식 안전구역: 안드로이드/iOS/윈도우10 기기 자동 잠금해제
부품 및 소모품
| 부품 | 수량 | 비고 |
| HC-05 블루투스 시리얼 모듈 | 1 | 기기 페어링용 |
| Arduino Nano R3 | 1 | 메인 컨트롤러 |
| R301T 반도체 지문 인식 모듈 | 1 | 시리얼 통신 방식 |
| 5mm RGB 4핀 LED | 1 | 상태 표시용 |
소프트웨어
프로젝트 소개
스마트폰, 태블릿, 노트북 등 스마트 기기 사용이 늘면서 개인정보(채팅, 연락처, 사진, 메모 등) 보호가 필수가 되었습니다. 하지만 집이나 개인 사무실처럼 안전한 공간에서도 매번 비밀번호/지문/얼굴 인증을 거쳐야 하는 건 번거롭습니다.
이 프로젝트는 지문으로 인증된 '안전구역(Safe Zone)' 장치를 만들어, 장치가 활성화되어 있는 동안 근처의 모든 페어링된 기기를 자동으로 잠금해제 상태로 유지합니다.
완성 후 할 수 있는 것
- 지문 센서(R301T) 사용법 익히기
- 스마트 기기들과 안전구역 장치 페어링하기
- 지문 한 번으로 모든 기기 잠금해제하는 쿨한 가젯 만들기
작동 원리: 기기 잠금/해제
장치에 등록된 지문을 인식하면 → 블루투스(HC-05) 켜짐 → 미리 페어링된 기기들(윈도우10, 안드로이드, iOS)이 '신뢰할 수 있는 장치' 감지 → 자동 잠금해제. 장치가 범위를 벗어나거나 지문 인증 해제 시 → 블루투스 꺼짐 → 기기 자동 잠금.
R301T 지문 모듈
컨트롤러(아두이노)와 시리얼 통신으로 데이터 교환. 지문 등록 후 아두이노 TX/RX 핀에 연결. HC-05 블루투스 모듈과 기기들을 1회 페어링. 아두이노 코드에서 '유효한 지문 감지 시 블루투스 켜기' 로직 구현.
회로도
프로젝트 페이지의 'Circuit' 섹션에서 상세 배선도 확인 가능.
코드 업로드 방법
- Arduino IDE 다운로드 및 설치
- IDE 실행 후 아래 코드 복사 붙여넣기
- Tools → Board → Arduino Nano 선택
- USB 연결 후 Tools → Port에서 COM 포트 선택
- 업로드 버튼(화살표) 클릭
메인 코드 (지문 라이브러리 필요: Adafruit_Fingerprint)
#include "Adafruit_Fingerprint.h"
#include "SoftwareSerial.h"
SoftwareSerial mySerial(2, 3); // RX, TX
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int cc = 0;
void setup() {
Serial.begin(9600);
while (!Serial); delay(100);
Serial.println("\n\nAdafruit finger detect test");
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { pinMode(13,OUTPUT); digitalWrite(13,LOW); pinMode(9,OUTPUT); digitalWrite(9,HIGH); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}
void loop() {
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;
}
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;
}
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; }
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
for (int i=255; i>1; i--) { analogWrite(9,i); delay(10); }
if (cc%2==0) digitalWrite(13,HIGH); else digitalWrite(13,LOW);
cc++;
return finger.fingerID;
}
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;
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
조립 및 기기 페어링
- 윈도우10: 설정 → 로그인 옵션 → 동적 잠금 활성화 → 블루투스 장치 페어링
- 안드로이드: 설정 → 디스플레이 → 잠금화면 → 스마트 잠금 활성화 → 블루투스 페어링
- iOS: 설정 → Touch ID 및 암호 → 거기서 설정
자동 페어링 안 될 경우: 최초 페어링 시도 시 장치로 문자 하나 전송하는 트릭 사용.
향후 개선 아이디어
- 특정 위치(예: 집 Wi-Fi 범위 내)에서만 작동하도록 GPS/Wi-Fi 연동
- 다른 사용자용 제한적 접근 권한 추가 (가족 구성원 등)