Hệ thống khóa cửa thông minh sử dụng RFID RC-522 và Arduino

Hệ thống khóa cửa thông minh sử dụng RFID RC-522 và Arduino

Nội dung bài viết hôm nay mình sẽ hướng dẫn cho các bạn cách làm một hệ thống khóa cửa thông minh với RFID RC-522 sử dụng Arduino để bảo vệ ngôi nhà của mình.

Để hiểu hơn về cấu tạo và cách hoạt động của tất cả cảm biến có trong dự án .Các bạn có thể tìm đọc bài viết về Arduino miễn phí dành cho người mới nhập môn.

Module đọc thẻ RFID RC-522

RFID RC-522 là một module đọc thẻ RFID được sử dụng phổ biến trong các ứng dụng như đóng mở cửa, kiểm soát truy cập, hệ thống quản lý thời gian chấm công… Module này sử dụng kỹ thuật truyền thông không dây RFID (Radio Frequency Identification) để đọc và ghi dữ liệu trên các thẻ có chứa thông tin về ID, dữ liệu cá nhân hoặc thông tin sản phẩm. Module khoá cửa điện tử RFID RC522 có khả năng đọc thẻ RFID ở tần số 13.56 MHz và giao tiếp với vi điều khiển thông qua giao tiếp SPI.

Cấu tạo của RFID RC522

RFID RC-522 là một module RFID được sử dụng để đọc và ghi dữ liệu từ các thẻ RFID. Module này được kết nối với vi điều khiển bằng giao tiếp SPI (Serial Peripheral Interface).

RFID RC-522 bao gồm một số chân quan trọng như sau:

  • Chân VCC: là nguồn cấp cho module, đây là chân có điện áp 3.3V.
  • Chân GND: là chân mát của module, được kết nối với đất.
  • Chân RST: được sử dụng để thiết lập lại trạng thái của module, và có thể được điều khiển bởi vi điều khiển.
  • Chân IRQ: được sử dụng để giám sát các sự kiện của module nhưng không bắt buộc phải sử dụng.
  • Chân MISO: là chân đầu ra của module và được sử dụng để truyền dữ liệu từ module đến vi điều khiển.
  • Chân MOSI: là chân đầu vào của module và được sử dụng để truyền dữ liệu từ vi điều khiển đến module.
  • Chân SCK: là chân tạo xung tín hiệu cho giao tiếp SPI

Nguyên lý hoạt động của RFID RC-522

RFID RC-522 hoạt động dựa trên nguyên lý sử dụng sóng radio tần số cao để truyền thông tin giữa thiết bị đọc và thẻ RFID.

Khi một thẻ RFID được đưa vào vùng đọc của RC-522, một sóng tần cao được phát ra từ anten trên RC-522. Sóng tần này sẽ tương tác với anten trên thẻ RFID, tạo ra một trường từ và kích hoạt thẻ RFID. Thẻ RFID sẽ phản hồi bằng cách phát ra một tín hiệu chứa thông tin cần thiết.

RC-522 sẽ nhận tín hiệu này thông qua anten của nó và chuyển tiếp tín hiệu đó đến vi điều khiển trên mạch. Vi điều khiển này sẽ giải mã tín hiệu và lấy ra thông tin cần thiết trên thẻ RFID. Sau đó, vi điều khiển sẽ gửi thông tin này đến bộ xử lý để xử lý hoặc lưu trữ vào bộ nhớ.

Quá trình này diễn ra rất nhanh và đơn giản, cho phép RC-522 đọc thông tin trên thẻ RFID một cách dễ dàng và chính xác.

Đọc ngay: RFID là gì? Hướng dẫn sử dụng Module RFID RC522 với Arduino

Sơ đồ đấu nối

Các linh kiện cần thiết cho dự án

Tên linh kiện Số lượng Shopee
Arduino Uno R3 1 Mua ngay
Cáp nạp 1 Mua ngay
RFID RC522 1 Mua ngay
Loa 1 Mua ngay
Relay 5V/1 kênh 1 Mua ngay
Dây cắm (Đực – Cái) 2 Mua ngay
LCD16X2 1 Mua ngay
Board I2C LCD16X2 1 Mua ngay
Khóa Chốt Điện 12V 1 Mua ngay
Nguồn Adapter 12V/2A 1 Mua ngay
Jack nguồn DC 1 Mua ngay

Bạn sẽ học được gì

  • Có kiến thức cơ bản về Robotics
  • Chế tạo Robot dò đường thông minh
  • Đánh thức nhà khoa học bên trong bạn
  • Tìm hiểu thêm về Robotics, các thuật toán Robot tự động
  • Kiến thức nền tảng để chế tạo các máy móc tự động phục vụ đời sống sinh hoạt, lao động sản xuất
  • Kiến thức để chế tạo sản phẩm, tham gia các cuộc thi khoa học công nghệ trong nước và quốc tế

KHÓA HỌC
CHẾ TẠO ROBOT DÒ ĐƯỜNG

Đã có 284 học viên đăng ký

Code

#include <RFID.h>
#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //Memanggil i2C LCD Library
LiquidCrystal_I2C lcd(0x3F, 16, 2);
/*
Sambungan Module RFID RC-522 ke Arduino
* MOSI: Pin 11
* MISO: Pin 12
* SCK : Pin 13
* SS/SDA: Pin 10
* RST: Pin 9
* RQ: Tidak digunakan
*/
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN,RST_PIN);

const int buzzer = 7;   //Passive buzzer ke Pin D7 dan GND
const int doorLock = 8; //Driver Selenoid Door Lock/Relay input ke pin D8
int serNum[5];          //Variable buffer Scan Card

int cards[][5] = {      //ID Kartu yang diperbolehkan masuk
  {141,125,2,197,55}
  
};

bool access = false;

int alarm = 0;
uint8_t alarmStat = 0;
uint8_t maxError = 5;
void setup(){
    Serial.begin(9600);
    lcd.begin();
    SPI.begin();
    rfid.init();

    pinMode(doorLock, OUTPUT);
    digitalWrite(doorLock, HIGH);

  tone (buzzer,1200);
  lcd.setCursor (0,0);
  lcd.print(F("  RFID System   "));
  lcd.setCursor (0,1);
  lcd.print(F(" Control Access "));
  delay (2000);
  lcd.clear();
  noTone (buzzer);
}

void loop(){
  if (alarm >= maxError){
    alarmStat = 1;    }
  
  if (alarmStat == 0){
  lcd.setCursor (0,0);
  lcd.print(F(" -System Ready- "));
  lcd.setCursor (0,1);
  lcd.print(F(" Scan Your Card "));

    if(rfid.isCard()){
    
        if(rfid.readCardSerial()){
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
            
            for(int x = 0; x < sizeof(cards); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != cards[x][i]) {
                      access = false;
                      break;
                  } else {
                      access = true;
                  }
              }
              if(access) break;
            }   
        }
        
       if(access){
          Serial.println("Welcome!");
          lcd.setCursor (0,0);
          lcd.print(F(" Akses diterima "));
          lcd.setCursor (0,1);
          lcd.print("ID:");
          lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
          lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
          lcd.print(rfid.serNum[4]);
           digitalWrite(doorLock, LOW);
           tone (buzzer,900);
           delay(100);
           tone (buzzer,1200);
           delay(100);
           tone (buzzer,1800);
           delay(200);
           noTone(buzzer);  
           delay(600);
           lcd.setCursor (0,0);
           lcd.print(F(" Silahkan Masuk "));
           lcd.setCursor (0,1);
           lcd.print(F("AutoLock after "));
           for(int i=5; i>0; i--){
            lcd.setCursor (15,1); lcd.print(i);
            delay (1000);
           }
           digitalWrite(doorLock, HIGH);
           lcd.clear();
      } else {
           alarm = alarm+1;
           Serial.println("Not allowed!"); 
           lcd.setCursor (0,0);
           lcd.print(F(" Akses ditolak  "));
           lcd.setCursor (0,1);
           lcd.print("ID:");
           lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
           lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
           lcd.print(rfid.serNum[4]);
           tone (buzzer,900);
           delay(200);
           noTone(buzzer);
           delay(200);
           tone (buzzer,900);
           delay(200);
           noTone (buzzer);  
           delay(500);
           lcd.clear();      
       }        
    }

    rfid.halt();
}
else {
  lcd.setCursor (0,0);
  lcd.print(F("-System LOCKED- "));
  lcd.setCursor (0,1);
  lcd.print(F(" Please Wait "));
for(int i=60; i>0; i--){
tone (buzzer,1800);
lcd.setCursor (13,1); lcd.print(i);
lcd.print(F("  "));delay (1000);}
noTone (buzzer);
alarmStat = 0;
alarm = 0;
  }
}

Giải thích code RFID RC-522

bool access = false;
int alarm = 0;
uint8_t alarmStat = 0;
uint8_t maxError = 5;
  • Biến access kiểm tra quyền truy cập của người dùng được xác định bằng thẻ RFID.
  • Biến alarm lưu số lần truy cập bị từ chối và sẽ kích hoạt chế độ khóa hệ thống nếu vượt quá maxError.
  • Biến alarmStat đánh dấu trạng thái khóa hệ thống, khi bằng 0, hệ thống sẵn sàng cho người dùng quét thẻ. Khi bằng 1, hệ thống đã bị khóa.
  • Biến maxError là giá trị tối đa cho phép số lần truy cập bị từ chối trước khi hệ thống bị khóa.
void setup(){
    Serial.begin(9600);
    lcd.begin();
    SPI.begin();
    rfid.init();

    pinMode(doorLock, OUTPUT);
    digitalWrite(doorLock, HIGH);

  tone (buzzer,1200);
  lcd.setCursor (0,0);
  lcd.print(F("  RFID System   "));
  lcd.setCursor (0,1);
  lcd.print(F(" Control Access "));
  delay (2000);
  lcd.clear();
  noTone (buzzer);
}

Trong hàm setup(), các chức năng cần thiết được khởi tạo, bao gồm:

  • Khởi tạo kết nối Serial với baudrate là 9600.
  • Khởi tạo kết nối SPI.
  • Khởi tạo module RFID.
  • Cấu hình chân điều khiển khóa cửa là chân đầu ra.
  • Thiết lập giá trị mặc định cho chân điều khiển khóa cửa.
  • Phát ra âm thanh cảnh báo với tần số 1200 Hz.
  • Hiển thị thông tin trên màn hình LCD trong khoảng thời gian 2 giây.
  • Xóa màn hình LCD.
  • Tắt âm thanh cảnh báo.
void loop(){
  if (alarm >= maxError){
    alarmStat = 1;    }
  
  if (alarmStat == 0){
  lcd.setCursor (0,0);
  lcd.print(F(" -System Ready- "));
  lcd.setCursor (0,1);
  lcd.print(F(" Scan Your Card "));

    if(rfid.isCard()){
    
        if(rfid.readCardSerial()){
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
            
            for(int x = 0; x < sizeof(cards); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != cards[x][i]) {
                      access = false;
                      break;
                  } else {
                      access = true;
                  }
              }
              if(access) break;
            }   
        }
        
       if(access){
          Serial.println("Welcome!");
          lcd.setCursor (0,0);
          lcd.print(F(" Akses diterima "));
          lcd.setCursor (0,1);
          lcd.print("ID:");
          lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
          lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
          lcd.print(rfid.serNum[4]);
           digitalWrite(doorLock, LOW);
           tone (buzzer,900);
           delay(100);
           tone (buzzer,1200);
           delay(100);
           tone (buzzer,1800);
           delay(200);
           noTone(buzzer);  
           delay(600);
           lcd.setCursor (0,0);
           lcd.print(F(" Silahkan Masuk "));
           lcd.setCursor (0,1);
           lcd.print(F("AutoLock after "));
           for(int i=5; i>0; i--){
            lcd.setCursor (15,1); lcd.print(i);
            delay (1000);
           }
           digitalWrite(doorLock, HIGH);
           lcd.clear();
      } else {
           alarm = alarm+1;
           Serial.println("Not allowed!"); 
           lcd.setCursor (0,0);
           lcd.print(F(" Akses ditolak  "));
           lcd.setCursor (0,1);
           lcd.print("ID:");
           lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
           lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
           lcd.print(rfid.serNum[4]);
           tone (buzzer,900);
           delay(200);
           noTone(buzzer);
           delay(200);
           tone (buzzer,900);
           delay(200);
           noTone (buzzer);  
           delay(500);
           lcd.clear();      
       }        
    }

    rfid.halt();
}
else {
  lcd.setCursor (0,0);
  lcd.print(F("-System LOCKED- "));
  lcd.setCursor (0,1);
  lcd.print(F(" Please Wait "));
for(int i=60; i>0; i--){
tone (buzzer,1800);
lcd.setCursor (13,1); lcd.print(i);
lcd.print(F("  "));delay (1000);}
noTone (buzzer);
alarmStat = 0;
alarm = 0;
  }
}

Phần loop() là phần chính của chương trình, nó sẽ kiểm tra các thẻ được đưa vào và xác định liệu chúng có hợp lệ để truy cập hay không. Nếu thẻ được xác định là hợp lệ, hệ thống sẽ mở khóa và cho phép người dùng truy cập vào khu vực đã được cài đặt. Nếu thẻ không được xác định là hợp lệ, hệ thống sẽ tính toán số lần truy cập không hợp lệ và phát ra tín hiệu cảnh báo. Nếu số lần truy cập không hợp lệ vượt quá giới hạn cho phép, hệ thống sẽ bị khóa và không cho phép truy cập trong một khoảng thời gian nhất định.

Thư viện

  • Các bạn có thể tải code tìm địa chỉ bus ở đây: Tải ngay.
  • Thư viện LiquidCrystal_I2C.h: Tải ngay.

Kết luận

Trong bài viết này, các bạn đã tìm hiểu về hệ thống khóa cửa thông minh sử dụng RFID RC-522 sử dụng Arduino. Việc ứng dụng công nghệ RFID vào trong các hệ thống khóa cửa thông minh là rất cần thiết và mang lại nhiều lợi ích. Với khả năng đọc và xác thực thẻ nhanh chóng, độ chính xác cao hệ thống này sẽ là một giải pháp an toàn và tiện lợi trong việc quản lý cửa ra vào. Vì vậy, nếu bạn đang tìm kiếm một giải pháp khóa cửa thông minh an toàn, dễ sử dụng và hiệu quả, hệ thống khóa cửa RFID Arduino là một lựa chọn tuyệt vời dành cho bạn.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments