fork download
  1. /*
  2.  * ESP32 + MFRC522 (RFID) + Adafruit Fingerprint + Servo (ESP32Servo) + Buzzer
  3.  * ระบบควบคุมการเข้า-ออกด้วยการยืนยันตัวตนแบบหลายปัจจัย
  4.  */
  5.  
  6. #include <SPI.h>
  7. #include <MFRC522.h>
  8. #include <Adafruit_Fingerprint.h>
  9. #include <ESP32Servo.h>
  10.  
  11. // -------------------- พินและพอร์ต --------------------
  12. // MFRC522 (RFID)
  13. #define SS_PIN 5
  14. #define RST_PIN 27
  15.  
  16. // Fingerprint
  17. #define FP_RX 16 // RX2
  18. #define FP_TX 17 // TX2
  19.  
  20. // อุปกรณ์ขับเคลื่อน
  21. #define SERVO_PIN 13
  22. #define BUZZER_PIN 12
  23.  
  24. // -------------------- อ็อบเจ็กต์ --------------------
  25. MFRC522 mfrc522(SS_PIN, RST_PIN);
  26. HardwareSerial FINGERPRINT_SERIAL(2); // ใช้ UART2
  27. Adafruit_Fingerprint finger = Adafruit_Fingerprint(&FINGERPRINT_SERIAL);
  28. Servo doorLock;
  29.  
  30. // -------------------- การอนุญาต --------------------
  31. byte knownCardId[4] = {0x4E, 0x31, 0xA9, 0x04};
  32. int knownFingerId = 1;
  33.  
  34. // -------------------- โปรโตไทป์ฟังก์ชัน --------------------
  35. bool checkCard();
  36. bool checkFingerprint();
  37. void openDoor();
  38. void closeDoor();
  39. void buzzSuccess();
  40. void buzzFail();
  41.  
  42. void setup() {
  43. Serial.begin(115200);
  44. delay(100);
  45.  
  46. // --- RFID ---
  47. SPI.begin();
  48. mfrc522.PCD_Init();
  49. Serial.println("RFID Reader Initialized");
  50.  
  51. // --- Fingerprint ---
  52. FINGERPRINT_SERIAL.begin(57600, SERIAL_8N1, FP_RX, FP_TX);
  53. finger.begin(57600);
  54.  
  55. if (finger.verifyPassword()) {
  56. Serial.println("Fingerprint sensor found and OK!");
  57. } else {
  58. Serial.println("Error: Did not find fingerprint sensor or incorrect password.");
  59. }
  60.  
  61. // --- Servo ---
  62. doorLock.attach(SERVO_PIN);
  63. closeDoor();
  64.  
  65. // --- Buzzer ---
  66. pinMode(BUZZER_PIN, OUTPUT);
  67. digitalWrite(BUZZER_PIN, LOW);
  68.  
  69. Serial.println("System Ready.");
  70. }
  71.  
  72. void loop() {
  73. // ตรวจสอบการ์ดก่อน
  74. if (checkCard()) {
  75. buzzSuccess();
  76. openDoor();
  77. delay(5000);
  78. closeDoor();
  79. }
  80.  
  81. // ถ้าไม่พบการ์ด ให้ลองสแกนนิ้ว
  82. if (checkFingerprint()) {
  83. buzzSuccess();
  84. openDoor();
  85. delay(5000);
  86. closeDoor();
  87. }
  88. }
  89.  
  90. // -------------------- ฟังก์ชันตรวจคีย์การ์ด --------------------
  91. bool checkCard() {
  92. if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
  93. return false;
  94. }
  95.  
  96. Serial.print("Card UID:");
  97. for (byte i = 0; i < mfrc522.uid.size; i++) {
  98. Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  99. Serial.print(mfrc522.uid.uidByte[i], HEX);
  100. }
  101. Serial.println();
  102.  
  103. bool granted = false;
  104. if (mfrc522.uid.size >= 4) {
  105. if (memcmp(mfrc522.uid.uidByte, knownCardId, 4) == 0) {
  106. granted = true;
  107. }
  108. }
  109.  
  110. if (granted) {
  111. Serial.println("Access Granted (Card)!");
  112. } else {
  113. Serial.println("Access Denied (Card)!");
  114. buzzFail();
  115. }
  116.  
  117. mfrc522.PICC_HaltA();
  118. mfrc522.PCD_StopCrypto1();
  119. return granted;
  120. }
  121.  
  122. // -------------------- ฟังก์ชันตรวจลายนิ้วมือ --------------------
  123. bool checkFingerprint() {
  124. Serial.println("Waiting for valid finger...");
  125.  
  126. int p = finger.getImage();
  127. if (p != FINGERPRINT_OK) return false;
  128.  
  129. p = finger.image2Tz();
  130. if (p != FINGERPRINT_OK) return false;
  131.  
  132. p = finger.fingerSearch();
  133. if (p != FINGERPRINT_OK) {
  134. Serial.println("No match found or sensor busy.");
  135. buzzFail();
  136. return false;
  137. }
  138.  
  139. if (finger.fingerID == knownFingerId) {
  140. Serial.print("Access Granted (Fingerprint)! ID: ");
  141. Serial.println(finger.fingerID);
  142. return true;
  143. } else {
  144. Serial.print("Access Denied (Fingerprint)! Found ID: ");
  145. Serial.println(finger.fingerID);
  146. buzzFail();
  147. return false;
  148. }
  149. }
  150.  
  151. // -------------------- ควบคุมประตู --------------------
  152. void openDoor() {
  153. Serial.println("Door Opening...");
  154. doorLock.write(90);
  155. }
  156.  
  157. void closeDoor() {
  158. Serial.println("Door Closing...");
  159. doorLock.write(0);
  160. }
  161.  
  162. // -------------------- Buzzer --------------------
  163. void buzzSuccess() {
  164. digitalWrite(BUZZER_PIN, HIGH);
  165. delay(150);
  166. digitalWrite(BUZZER_PIN, LOW);
  167. }
  168.  
  169. void buzzFail() {
  170. for (int i = 0; i < 2; i++) {
  171. digitalWrite(BUZZER_PIN, HIGH);
  172. delay(200);
  173. digitalWrite(BUZZER_PIN, LOW);
  174. delay(200);
  175. }
  176. }
Success #stdin #stdout 0.03s 25464KB
stdin
Standard input is empty
stdout
/*
 * ESP32 + MFRC522 (RFID) + Adafruit Fingerprint + Servo (ESP32Servo) + Buzzer
 * ระบบควบคุมการเข้า-ออกด้วยการยืนยันตัวตนแบบหลายปัจจัย
 */

#include <SPI.h>
#include <MFRC522.h>
#include <Adafruit_Fingerprint.h>
#include <ESP32Servo.h>

// -------------------- พินและพอร์ต --------------------
// MFRC522 (RFID)
#define SS_PIN 5
#define RST_PIN 27

// Fingerprint
#define FP_RX 16     // RX2
#define FP_TX 17     // TX2

// อุปกรณ์ขับเคลื่อน
#define SERVO_PIN 13
#define BUZZER_PIN 12

// -------------------- อ็อบเจ็กต์ --------------------
MFRC522 mfrc522(SS_PIN, RST_PIN);
HardwareSerial FINGERPRINT_SERIAL(2);  // ใช้ UART2
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&FINGERPRINT_SERIAL);
Servo doorLock;

// -------------------- การอนุญาต --------------------
byte knownCardId[4] = {0x4E, 0x31, 0xA9, 0x04}; 
int knownFingerId = 1;

// -------------------- โปรโตไทป์ฟังก์ชัน --------------------
bool checkCard();
bool checkFingerprint();
void openDoor();
void closeDoor();
void buzzSuccess();
void buzzFail();

void setup() {
  Serial.begin(115200);
  delay(100);

  // --- RFID ---
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println("RFID Reader Initialized");

  // --- Fingerprint ---
  FINGERPRINT_SERIAL.begin(57600, SERIAL_8N1, FP_RX, FP_TX);
  finger.begin(57600);

  if (finger.verifyPassword()) {
    Serial.println("Fingerprint sensor found and OK!");
  } else {
    Serial.println("Error: Did not find fingerprint sensor or incorrect password.");
  }

  // --- Servo ---
  doorLock.attach(SERVO_PIN);
  closeDoor();

  // --- Buzzer ---
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  Serial.println("System Ready.");
}

void loop() {
  // ตรวจสอบการ์ดก่อน
  if (checkCard()) { 
    buzzSuccess(); 
    openDoor(); 
    delay(5000); 
    closeDoor(); 
  } 

  // ถ้าไม่พบการ์ด ให้ลองสแกนนิ้ว
  if (checkFingerprint()) { 
    buzzSuccess(); 
    openDoor(); 
    delay(5000); 
    closeDoor(); 
  } 
}

// -------------------- ฟังก์ชันตรวจคีย์การ์ด -------------------- 
bool checkCard() { 
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) { 
    return false; 
  } 

  Serial.print("Card UID:");
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();

  bool granted = false; 
  if (mfrc522.uid.size >= 4) { 
    if (memcmp(mfrc522.uid.uidByte, knownCardId, 4) == 0) {
      granted = true;
    } 
  } 

  if (granted) { 
    Serial.println("Access Granted (Card)!"); 
  } else { 
    Serial.println("Access Denied (Card)!"); 
    buzzFail();
  } 

  mfrc522.PICC_HaltA(); 
  mfrc522.PCD_StopCrypto1(); 
  return granted; 
} 

// -------------------- ฟังก์ชันตรวจลายนิ้วมือ -------------------- 
bool checkFingerprint() { 
  Serial.println("Waiting for valid finger...");
  
  int p = finger.getImage();
  if (p != FINGERPRINT_OK) return false;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK) return false;

  p = finger.fingerSearch();
  if (p != FINGERPRINT_OK) {
    Serial.println("No match found or sensor busy."); 
    buzzFail(); 
    return false; 
  }

  if (finger.fingerID == knownFingerId) { 
    Serial.print("Access Granted (Fingerprint)! ID: ");
    Serial.println(finger.fingerID);
    return true; 
  } else { 
    Serial.print("Access Denied (Fingerprint)! Found ID: ");
    Serial.println(finger.fingerID);
    buzzFail(); 
    return false; 
  } 
} 

// -------------------- ควบคุมประตู -------------------- 
void openDoor() { 
  Serial.println("Door Opening..."); 
  doorLock.write(90); 
} 

void closeDoor() { 
  Serial.println("Door Closing..."); 
  doorLock.write(0); 
} 

// -------------------- Buzzer -------------------- 
void buzzSuccess() { 
  digitalWrite(BUZZER_PIN, HIGH); 
  delay(150); 
  digitalWrite(BUZZER_PIN, LOW); 
} 

void buzzFail() { 
  for (int i = 0; i < 2; i++) { 
    digitalWrite(BUZZER_PIN, HIGH); 
    delay(200); 
    digitalWrite(BUZZER_PIN, LOW); 
    delay(200); 
  } 
}