Unlockdoor
Unlockdoor
h>
#include <Keypad.h>
#include <Adafruit_Fingerprint.h>
#include <HardwareSerial.h>
#define RX_PIN 16 // Chân RX của ESP32 nối với TX của cảm biến vân tay
#define TX_PIN 17 // Chân TX của ESP32 nối với RX của cảm biến vân tay
#define relayPin 23//mới thêm
uint8_t id ; // Khai báo biến id
boolean mode = 0; // Khai báo biến mode (0: chế độ quét, 1: chế độ lưu)
const byte ROWS = 4; // Số hàng của keypad
const byte COLS = 4; // Số cột của keypad
// Khởi tạo mySerial (Serial2) với chân RX, TX được khai báo ở trên
Serial2.begin(57600, SERIAL_8N1, RX_PIN, TX_PIN); // Khai báo tốc độ baud rate và
chân RX, TX
void loop() {
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
switch (customKey) {
case 'A': // Add fingerprint
Serial.println("Add fingerprint mode selected.");
mode = 0;
delay(3000);
addFingerprint();
mode = 1;
break;
DeleteChooseFingerprint();
delay(3000);
break;
default:
// Serial.println("Waiting key pressed...");
// delay(2000);
break;
if (mode == 0) {
getFingerprintID();
}
}
void DeleteChooseFingerprint() {
Serial.println("Enter the ID to delete (1-127):");
// Đọc ID từ keypad
uint8_t deleteID = readIDFromKeypad();
// Thực hiện xóa ID
int p = finger.deleteModel(deleteID);
if (p == FINGERPRINT_OK) {
Serial.print("Fingerprint with ID ");
Serial.print(deleteID);
Serial.println(" deleted successfully.");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error while deleting fingerprint.");
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not delete fingerprint at this location.");
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash.");
} else {
Serial.println("Unknown error.");
}
}
void eraseFingerprints() {
Serial.println("Erasing all fingerprints...");
finger.emptyDatabase();
Serial.println("All fingerprints erased.");
}
uint8_t addFingerprint() {
int p = -1;
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...");
// Bắt đầu quá trình thêm vân tay
id = readIDFromKeypad(); // Nhập ID từ keypad
Serial.print("Waiting for valid finger to enroll as #");
Serial.println(id);
delay(2000);
// Lấy ảnh lần đầu tiên
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;
}
}
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;
}
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
return p;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
return p;
}
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence "); Serial.println(finger.confidence);
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Fingerprint not found");
} else {
Serial.println("Error reading fingerprint");
}
return finger.fingerID;
}
void checkFingerprint() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
Serial.println("No finger detected. Please try again.");
return;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
Serial.println("Failed to convert image. Please try again.");
return;
}
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.print("Fingerprint exists in the database with ID #");
Serial.print(finger.fingerID);
Serial.print(" and confidence ");
Serial.println(finger.confidence);
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Fingerprint not found in the database.");
} else {
Serial.println("Error while searching for fingerprint.");
}
}
void checkFingerprintAndUnlock() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
Serial.println("No finger detected. Please try again.");
return;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
Serial.println("Failed to convert image. Please try again.");
return;
}
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.print("Fingerprint exists in the database with ID #");
Serial.print(finger.fingerID);
Serial.print(" and confidence ");
Serial.println(finger.confidence);
Serial.println("Unlocking the door...");
digitalWrite(relayPin, LOW); // Bật relay để mở cửa
Serial.println(" Door unlocked! ");
delay(100); // Giữ relay bật trong 100ms (cửa mở)
digitalWrite(relayPin, HIGH); // Tắt relay để đóng cửa
Serial.println("Door locked.");}
}
uint8_t readIDFromKeypad() {
String input = ""; // Chuỗi lưu giá trị nhập
char key;
Serial.println("Enter the ID using keypad (1-127), press # to confirm:");
while (true) {
key = customKeypad.getKey(); // Đọc phím bấm từ keypad
if (key) {//ktra dk phím được nhấn
if (key == '#') { // Xác nhận bằng phím #
if (input.length() > 0) {
uint8_t idValue = input.toInt(); // Chuyển chuỗi sang số
if (idValue >= 1 && idValue <= 127) { // Kiểm tra giới hạn ID
Serial.print("ID entered: ");
Serial.println(idValue);
return idValue; // Trả về giá trị ID
} else {
Serial.println("Invalid ID! Enter a number between 1 and 127.");
input = ""; // Reset input
}
}
} else if (isdigit(key)) { // Kiểm tra nếu là số
if (input.length() < 3) { // Chỉ nhận tối đa 3 ký tự
input += key; // Thêm ký tự vào chuỗi
Serial.print(key); // In ký tự ra Serial Monitor
}
} else {
Serial.println("\nInvalid key pressed. Use numbers or # to confirm.");
}
}
}
}