Giới thiệu dự án
Trong bối cảnh chuyển đổi số và tự động hóa quy trình quản trị doanh nghiệp, bài toán quản lý thời gian làm việc (Time & Attendance Management) đóng vai trò then chốt trong việc tối ưu hóa chi phí vận hành và nâng cao tính minh bạch. Theo thống kê từ Hiệp hội Quản trị Nhân sự Hoa Kỳ (SHRM), các doanh nghiệp áp dụng phương thức ghi nhận thủ công hoặc chấm công thẻ giấy truyền thống chịu tổn thất tương đương 1.5% đến 4% tổng quỹ lương hàng năm do sai số ghi chép, gian lận quẹt thẻ hộ ("buddy punching") và tiêu tốn trung bình 15-20 giờ làm việc của nhân sự kế toán mỗi kỳ tính lương.
Các hệ thống chấm công offline truyền thống thường lưu trữ cục bộ trên bộ nhớ máy chấm công, yêu cầu kỹ thuật viên phải kết nối cáp RS-232/RS-485 hoặc trích xuất USB định kỳ để tổng hợp dữ liệu về máy chủ kế toán. Phương pháp này bộc lộ nhiều điểm nghẽn nghiêm trọng: độ trễ dữ liệu cao, không cung cấp khả năng giám sát tức thời (real-time monitoring), dễ mất mát dữ liệu khi bộ nhớ cục bộ gặp sự cố, và thiếu tính linh hoạt khi triển khai tại các chi nhánh phân tán.
Đồ án tốt nghiệp "Hệ thống chấm công online qua RFID" (Ngành Công nghệ Kỹ thuật Máy tính, Trường Đại học Sư phạm Kỹ thuật TP.HCM) được nghiên cứu và chế tạo nhằm giải quyết triệt để các tồn tại trên bằng một kiến trúc nhúng - mạng phân tán, đồng bộ hóa dữ liệu thời gian thực giữa thiết bị biên (Edge Device) và máy chủ trung tâm (Web Server).
+-----------------------------------------------------------------------------------+
| KIẾN TRÚC TỔNG THỂ HỆ THỐNG |
| |
| [ Thẻ RFID Mifare ] |
| | (13.56 MHz) |
| v |
| +--------------------+ I2C/UART +-----------------------------+ |
| | Module RC522 | -----------------------> | Main Controller: | |
| | Reader + Pro Mini | | Arduino Uno R3 (ATmega328P) | |
| +--------------------+ +--------------+--------------+ |
| | |
| +---------------------+-----------------------------+ |
| | (SPI) | (I2C) | (UART 115200) |
| v v v |
| +--------------------+ +--------------------+ +--------------------+ |
| | Micro SD Module | | LCD 16x2 Display | | Module Wi-Fi | |
| | (Local Fallback) | | (PCF8574 Backpack) | | ESP8266 | |
| +--------------------+ +--------------------+ +----------+---------+ |
| | |
| | (TCP/IP HTTP) |
| v |
| +--------------------+ |
| | Web Server | |
| | (PHP & MySQL) | |
| +--------------------+ |
+-----------------------------------------------------------------------------------+
Mục tiêu của đề tài
- Thiết kế phần cứng thiết bị biên (Client Device): Xây dựng mạch điều khiển tích hợp vi điều khiển ATmega328P, module thu phát sóng vô tuyến RFID RC522 tần số 13.56 MHz, module giao tiếp không dây ESP8266, khối hiển thị LCD 16x2 qua chuẩn I2C, module thời gian thực (RTC) và bộ nhớ đệm thẻ nhớ MicroSD.
- Xây dựng phần mềm máy chủ quản lý (Server): Phát triển hệ thống Web Server trên nền tảng ngôn ngữ PHP kết hợp hệ quản trị cơ sở dữ liệu quan hệ MySQL, đảm bảo khả năng tiếp nhận luồng dữ liệu TCP/HTTP đồng thời từ nhiều Client.
- Hiện thực hóa cơ chế dự phòng dữ liệu (Fail-Safe Mechanism): Tích hợp giải pháp ghi log cục bộ trên thẻ MicroSD chuẩn giao tiếp SPI, đảm bảo dữ liệu chấm công không bị thất thoát khi đường truyền Internet gặp sự cố đứt kết nối.
- Tự động hóa tính toán ngày công: Lập trình giải thuật tự động đối chiếu mốc thời gian vào/ra (Check-in/Check-out) với khung giờ làm việc tiêu chuẩn của doanh nghiệp để tính tổng số giờ công thực tế.
Phạm vi và giới hạn đề tài
- Phạm vi áp dụng: Mô hình mạng cục bộ (LAN) và Internet diện rộng (WAN) cho các doanh nghiệp vừa và nhỏ (SMEs), phòng thí nghiệm hoặc chuỗi cửa hàng phân tán.
- Giao thức nhận dạng: Chuẩn thẻ thông minh không tiếp xúc ISO/IEC 14443A (Mifare Classic 1K/S50).
- Băng tần giao tiếp: RFID tần số 13.56 MHz; Wi-Fi chuẩn 802.11 b/g/n băng tần 2.4 GHz.
- Giới hạn kỹ thuật: Thiết bị chưa tích hợp mã hóa tầng ứng dụng SSL/TLS trên module ESP8266 phần sụn gốc (firmware Non-OS AT Command) và chưa tích hợp bộ lưu điện dự phòng (UPS/Pin Li-ion tích hợp).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí kỹ thuật |
Chấm công giấy / Thẻ từ tính cũ |
Máy vân tay Standalone |
Hệ thống RFID Online (Đề tài) |
| Thời gian nhận diện |
3.0 – 5.0 giây/người |
1.2 – 2.5 giây/người |
< 0.3 giây/người |
| Độ trễ truyền dữ liệu |
24 – 720 giờ (thủ công) |
24 – 168 giờ (cần trích xuất) |
Thời gian thực (< 1 giây) |
| Khả năng mở rộng chi nhánh |
Rất thấp, tốn nhân lực |
Trung bình (cần cấu hình IP tĩnh) |
Cao (kết nối qua HTTP/Wi-Fi) |
| Chi phí đầu tư phần cứng |
Thấp |
Cao ($150 - $400/máy) |
Tối ưu (< $35/terminal) |
| Khả năng hoạt động khi mất mạng |
Không áp dụng |
Lưu trên EEPROM máy |
Lưu dự phòng MicroSD qua SPI |
| Tính minh bạch đối với nhân viên |
Kém, dễ thất lạc bảng chấm |
Nhân viên không tự tra cứu |
Cổng Web Portal tự phục vụ |
Ma trận ưu tiên yêu cầu chức năng (MoSCoW)
- Must Have (Bắt buộc phải có):
- Quét mã định danh UID từ thẻ Mifare 13.56 MHz không tiếp xúc qua module RC522.
- Truyền gói tin Check-in qua HTTP GET/POST đến máy chủ PHP thông qua module Wi-Fi ESP8266.
- Lưu trữ dữ liệu an toàn vào cơ sở dữ liệu MySQL với timestamp chuẩn xác.
- Hiển thị trạng thái giao dịch (Họ tên, Mã thẻ, Thời gian) trên màn hình LCD 16x2.
- Should Have (Nên có):
- Ghi nhật ký sao lưu vào thẻ nhớ MicroSD khi mất kết nối mạng (Network Timeout > 3000ms).
- Đèn LED trạng thái và còi buzzer phản hồi âm thanh khi xác thực thẻ.
- Phân quyền quản trị Admin (toàn quyền) và User (chỉ xem lịch sử cá nhân).
- Could Have (Có thể có):
- Cơ chế tự động quét lại thẻ nhớ SD để đồng bộ lên máy chủ khi có mạng trở lại.
- Xuất báo cáo bảng công hàng tháng ra định dạng Microsoft Excel / CSV.
- Won't Have (Chưa thực hiện trong giai đoạn này):
- Nhận diện sinh trắc học khuôn mặt/vân tay kết hợp.
- Đồng bộ qua giao thức Message Queuing MQTT/WebSockets.
Thiết kế hệ thống
Kiến trúc ngăn xếp công nghệ (Technology Stack)
+-----------------------------------------------------------------------+
| TẦNG ỨNG DỤNG |
| Giao diện quản trị Web Responsive (HTML5, CSS3, JavaScript, jQuery) |
+-----------------------------------------------------------------------+
| TẦNG DỊCH VỤ WEB |
| Apache HTTP Server 2.4.x | PHP 5.6/7.x Core Engine |
+-----------------------------------------------------------------------+
| TẦNG CƠ SỞ DỮ LIỆU |
| MySQL Community Server 5.6/5.7 (InnoDB Engine, UTF-8 Encoding) |
+-----------------------------------------------------------------------+
| TẦNG TRUYỀN DẪN |
| TCP/IP Stack, IEEE 802.11 b/g/n, HTTP 1.1 Protocol |
+-----------------------------------------------------------------------+
| TẦNG NHÚNG BIÊN |
| Arduino Core C/C++ | ATmega328P MCU (16MHz) | ESP8266 SoC |
| MFRC522 Drivers | FatFs SD Card Lib | Wire I2C | RTClib DS1307 |
+-----------------------------------------------------------------------+
Thiết kế cơ sở dữ liệu (Database Schema DDL)
Cơ sở dữ liệu MySQL bao gồm 3 bảng thực thể quan hệ chặt chẽ: account (thông tin nhân sự), diemdanh (nhật ký quẹt thẻ thô), và bangcong (dữ liệu tổng hợp ca làm việc).
-- 1. Bảng lưu trữ hồ sơ và định danh thẻ nhân sự
CREATE TABLE `account` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`mathe` VARCHAR(32) NOT NULL UNIQUE,
`hoten` VARCHAR(100) NOT NULL,
`ngaysinh` DATE DEFAULT NULL,
`cmnd` VARCHAR(20) DEFAULT NULL,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(255) NOT NULL,
`role` ENUM('admin', 'employee') DEFAULT 'employee',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_mathe` (`mathe`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2. Bảng nhật ký điểm danh thô nhận trực tiếp từ Client
CREATE TABLE `diemdanh` (
`id_log` BIGINT(20) NOT NULL AUTO_INCREMENT,
`mathe` VARCHAR(32) NOT NULL,
`thoigian` DATETIME NOT NULL,
`client_ip` VARCHAR(45) DEFAULT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id_log`),
CONSTRAINT `fk_diemdanh_account` FOREIGN KEY (`mathe`)
REFERENCES `account` (`mathe`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 3. Bảng tổng hợp công nhật theo ngày
CREATE TABLE `bangcong` (
`id_cong` BIGINT(20) NOT NULL AUTO_INCREMENT,
`mathe` VARCHAR(32) NOT NULL,
`ngay` DATE NOT NULL,
`gio_vao` TIME DEFAULT NULL,
`gio_ra` TIME DEFAULT NULL,
`tong_gio` DECIMAL(4,2) DEFAULT '0.00',
`tang_ca` DECIMAL(4,2) DEFAULT '0.00',
`trang_thai` ENUM('hop_le', 'tre_gio', 've_som', 'thieu_quet') DEFAULT 'hop_le',
PRIMARY KEY (`id_cong`),
UNIQUE KEY `idx_user_day` (`mathe`, `ngay`),
CONSTRAINT `fk_bangcong_account` FOREIGN KEY (`mathe`)
REFERENCES `account` (`mathe`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Thiết kế giao tiếp API (Communication Protocol)
- Endpoint tiếp nhận dữ liệu:
GET /server_rfid/diemdanh.php
- Tham số truyền vào (Query String):
mathe: Chuỗi Hexadecimal UID của thẻ RFID (VD: A3B4C5D6).
thoigian: Chuỗi thời gian chuẩn ISO/SQL (VD: 2016-01-04%2008:00:15).
- Định dạng phản hồi (HTTP Status):
200 OK kèm chuỗi payload text SUCCESS:ID_LOG_INSERTED khi máy chủ ghi nhận thành công.
400 Bad Request hoặc 404 Not Found khi mã thẻ chưa được đăng ký trong bảng account.
Phương pháp nghiên cứu và quy trình triển khai
Đồ án được triển khai theo mô hình lai (Hybrid Waterfall-Agile) với 5 giai đoạn trọng tâm trong 16 tuần:
+-----------------------------------------------------------------------------+
| Tuần 1-3: Nghiên cứu lý thuyết & Thu thập yêu cầu |
| [Xác định chuẩn RFID 13.56MHz, khảo sát kiến trúc Arduino Uno & ESP8266] |
+------------------------------------+----------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| Tuần 4-7: Thiết kế & Thi công mạch phần cứng Prototype |
| [Layout mạch nguồn 5V/3.3V, kết nối bus SPI cho RC522, I2C cho LCD/RTC] |
+------------------------------------+----------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| Tuần 8-11: Lập trình Firmware Client & Thiết kế Database / Backend PHP |
| [Viết tập lệnh AT Command cho ESP8266, thiết kế Schema MySQL, API Handler] |
+------------------------------------+----------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| Tuần 12-14: Tích hợp hệ thống & Kiểm thử chức năng toàn diện |
| [Stress test quẹt thẻ, kiểm thử mất kết nối Wi-Fi, kiểm thử tải dữ liệu] |
+------------------------------------+----------------------------------------+
|
v
+-----------------------------------------------------------------------------+
| Tuần 15-16: Đánh giá hiệu năng, Tối ưu hóa & Hoàn thiện báo cáo |
| [Đo đạc độ trễ mạng, tinh chỉnh bộ lọc ngắt, đóng gói vỏ hộp sản phẩm] |
+-----------------------------------------------------------------------------+
Đánh giá và kiểm soát rủi ro kỹ thuật (Risk Assessment)
| Rủi ro kỹ thuật |
Mức độ |
Khả năng xảy ra |
Giải pháp kiểm soát và giảm thiểu |
| Xung đột bus SPI giữa RC522 và MicroSD |
Cao |
Cao |
Thiết lập phân tách chân Chip Select (CS_RFID = 10, CS_SD = 4), đồng thời quản lý nghiêm ngặt trạng thái logic HIGH/LOW của các chân CS trước mỗi phiên truyền dữ liệu. |
| Sụt áp khi Wi-Fi ESP8266 truyền công suất đỉnh |
Cao |
Rất cao |
ESP8266 tiêu thụ xung dòng đỉnh lên tới 250mA ở chế độ truyền sóng vô tuyến (TX Burst). Bổ sung mạch hạ áp chuyên dụng AMS1117-3.3V cùng tụ lọc nguồn gốm 100nF và tụ hóa 470µF sát chân VCC/GND của ESP8266. |
| Mất kết nối mạng Internet/Wi-Fi |
Trung bình |
Cao |
Tích hợp thuật toán chuyển hướng lưu trữ tức thời: Khi ESP8266 không nhận phản hồi HTTP trong 3000ms, hệ thống tự động xuất dòng log vào tệp OFFLINE.TXT trên thẻ MicroSD. |
| Lệch xung nhịp thời gian thực |
Thấp |
Trung bình |
Sử dụng module RTC DS1307 kèm pin nuôi CR2032 độc lập, đảm bảo mạch đếm thời gian thực duy trì độ chính xác ngay cả khi ngắt toàn bộ nguồn cấp chính. |
Hiện thực hóa và kết quả thực nghiệm
Quá trình phát triển và chi tiết giải thuật
1. Xử lý phần cứng và giải thuật đọc thẻ tại Client (Firmware C++)
Chương trình điều khiển nhúng trên Arduino ATmega328P thực hiện vòng lặp vô tận quét thẻ RFID qua giao tiếp SPI, thu thập thời gian từ RTC qua bus I2C, gửi lệnh AT đến ESP8266 qua UART và ghi thẻ SD.
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <RTClib.h>
#include <SoftwareSerial.h>
// Định nghĩa cấu hình chân kết nối phần cứng
#define SS_RFID_PIN 10
#define RST_RFID_PIN 9
#define SD_CS_PIN 4
#define LED_SUCCESS 6
#define LED_FAIL 7
MFRC522 rfid(SS_RFID_PIN, RST_RFID_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
SoftwareSerial espSerial(2, 3); // RX = Pin 2, TX = Pin 3
void setup() {
Serial.begin(9600);
espSerial.begin(9600);
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
pinMode(LED_SUCCESS, OUTPUT);
pinMode(LED_FAIL, OUTPUT);
pinMode(SD_CS_PIN, OUTPUT);
if (!SD.begin(SD_CS_PIN)) {
Serial.println(F("ERR: SD Card init failed!"));
}
if (!rtc.begin()) {
Serial.println(F("ERR: RTC module not found!"));
}
lcd.setCursor(0, 0);
lcd.print("HE THONG RFID");
lcd.setCursor(0, 1);
lcd.print("SAN SANG QUET...");
}
void loop() {
// Kiểm tra sự xuất hiện của thẻ mới trong vùng từ trường
if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
return;
}
// Chuyển đổi mã UID 4-byte thành chuỗi Hexadecimal
String cardUID = "";
for (byte i = 0; i < rfid.uid.size; i++) {
cardUID += String(rfid.uid.uidByte[i] < 0x10 ? "0" : "");
cardUID += String(rfid.uid.uidByte[i], HEX);
}
cardUID.toUpperCase();
// Đọc thời gian thực tế
DateTime now = rtc.now();
char timeBuffer[20];
sprintf(timeBuffer, "%04d-%02d-%02d %02d:%02d:%02d",
now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
// Hiển thị trực quan lên LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("UID: " + cardUID);
lcd.setCursor(0, 1);
lcd.print(String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()));
// Thực hiện gửi dữ liệu lên Web Server qua ESP8266
bool sendOk = sendDataToServer(cardUID, String(timeBuffer));
if (sendOk) {
digitalWrite(LED_SUCCESS, HIGH);
delay(500);
digitalWrite(LED_SUCCESS, LOW);
} else {
// Nếu gửi thất bại, kích hoạt cơ chế ghi lưu trữ thẻ nhớ MicroSD
digitalWrite(LED_FAIL, HIGH);
logToSDCard(cardUID, String(timeBuffer));
delay(500);
digitalWrite(LED_FAIL, LOW);
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(1000); // Khoảng nghỉ chống quẹt lặp liên tục
}
bool sendDataToServer(String uid, String timestamp) {
// Gửi gói tin HTTP GET thông qua chuỗi lệnh AT
String cmd = "AT+CIPSTART=\"TCP\",\"192.168.1.100\",80";
espSerial.println(cmd);
if (!espSerial.find("OK")) return false;
String httpRequest = "GET /server_rfid/diemdanh.php?mathe=" + uid +
"&thoigian=" + timestamp + " HTTP/1.1\r\nHost: 192.168.1.100\r\nConnection: close\r\n\r\n";
espSerial.print("AT+CIPSEND=");
espSerial.println(httpRequest.length());
if (espSerial.find(">")) {
espSerial.print(httpRequest);
if (espSerial.find("SUCCESS")) return true;
}
return false;
}
void logToSDCard(String uid, String timestamp) {
File logFile = SD.open("OFFLINE.TXT", FILE_WRITE);
if (logFile) {
logFile.println(uid + "," + timestamp);
logFile.close();
Serial.println(F("SD: Saved offline log."));
}
}
2. Xử lý nghiệp vụ tại Web Server (Backend PHP)
Tệp diemdanh.php đảm nhiệm vai trò tiếp nhận tham số từ HTTP Request, kiểm tra tính hợp lệ của mã thẻ, ghi log điểm danh thô và tự động tính toán số giờ làm việc dựa trên cặp bản ghi Vào/Ra trong ngày.
<?php
header('Content-Type: text/plain; charset=utf-8');
require_once 'config/database.php';
// Kiểm tra tính hợp lệ của tham số GET
if (!isset($_GET['mathe']) || !isset($_GET['thoigian'])) {
http_response_code(400);
exit("ERR: INVALID_PARAMETERS");
}
$mathe = mysqli_real_escape_string($conn, trim($_GET['mathe']));
$thoigian = mysqli_real_escape_string($conn, trim($_GET['thoigian']));
$client_ip = $_SERVER['REMOTE_ADDR'];
// 1. Kiểm tra mã thẻ có tồn tại trong hệ thống nhân sự hay không
$sql_check = "SELECT id, hoten FROM account WHERE mathe = '$mathe' LIMIT 1";
$res_check = mysqli_query($conn, $sql_check);
if (mysqli_num_rows($res_check) === 0) {
http_response_code(404);
exit("ERR: CARD_NOT_REGISTERED");
}
$user = mysqli_fetch_assoc($res_check);
// 2. Ghi nhận nhật ký thô vào bảng diemdanh
$sql_insert_log = "INSERT INTO diemdanh (mathe, thoigian, client_ip) VALUES ('$mathe', '$thoigian', '$client_ip')";
mysqli_query($conn, $sql_insert_log);
// 3. Xử lý tính toán công nhật trong bảng bangcong
$ngay_hien_tai = date('Y-m-d', strtotime($thoigian));
$gio_hien_tai = date('H:i:s', strtotime($thoigian));
$sql_cong = "SELECT * FROM bangcong WHERE mathe = '$mathe' AND ngay = '$ngay_hien_tai' LIMIT 1";
$res_cong = mysqli_query($conn, $sql_cong);
if (mysqli_num_rows($res_cong) === 0) {
// Lần quẹt đầu tiên trong ngày => Ghi nhận Giờ Vào (Check-in)
$trang_thai = (strtotime($gio_hien_tai) > strtotime('08:00:00')) ? 'tre_gio' : 'hop_le';
$sql_in = "INSERT INTO bangcong (mathe, ngay, gio_vao, trang_thai)
VALUES ('$mathe', '$ngay_hien_tai', '$gio_hien_tai', '$trang_thai')";
mysqli_query($conn, $sql_in);
} else {
// Đã có bản ghi trước đó => Cập nhật Giờ Ra (Check-out) và tính tổng thời gian
$row_cong = mysqli_fetch_assoc($res_cong);
$gio_vao = $row_cong['gio_vao'];
$timestamp_vao = strtotime($ngay_hien_tai . ' ' . $gio_vao);
$timestamp_ra = strtotime($ngay_hien_tai . ' ' . $gio_hien_tai);
$so_giay_lam_viec = max(0, $timestamp_ra - $timestamp_vao);
$tong_gio = round($so_giay_lam_viec / 3600, 2);
// Giả định ca tiêu chuẩn 8 giờ, vượt 8 giờ tính vào tăng ca (overtime)
$tang_ca = ($tong_gio > 8.00) ? round($tong_gio - 8.00, 2) : 0.00;
$sql_up = "UPDATE bangcong
SET gio_ra = '$gio_hien_tai',
tong_gio = '$tong_gio',
tang_ca = '$tang_ca'
WHERE id_cong = " . $row_cong['id_cong'];
mysqli_query($conn, $sql_up);
}
echo "SUCCESS";
mysqli_close($conn);
?>
Kiểm thử và đánh giá hiệu năng (Testing & Validation)
Hệ thống được đưa vào kiểm thử thực nghiệm trong điều kiện vận hành liên tục 7 ngày tại phòng thí nghiệm Bộ môn Kỹ thuật Máy tính - Viễn thông, Trường Đại học Sư phạm Kỹ thuật TP.HCM với 50 thẻ Mifare được phân bổ.
Kết quả đo đạc các thông số kỹ thuật (Benchmarks)
| Thông số kiểm thử |
Môi trường thử nghiệm |
Giá trị đo trung bình |
Ngưỡng tiêu chuẩn đạt yêu cầu |
| Khoảng cách đọc thẻ RFID |
Thẻ Mifare 1K qua lớp vỏ nhựa ABS 2mm |
3.8 cm |
≥ 2.5 cm |
| Thời gian giải mã thẻ RFID |
Khối MFRC522 SPI @ 4MHz |
18 ms |
≤ 50 ms |
| Độ trễ truyền nhận HTTP |
Wi-Fi 802.11n, ping router 1ms |
340 ms |
≤ 1000 ms |
| Thời gian ghi sao lưu MicroSD |
Thẻ SanDisk 8GB Class 10 qua bus SPI |
12 ms |
≤ 30 ms |
| Tỷ lệ nhận diện thẻ chính xác |
1.000 lượt quẹt thử nghiệm liên tục |
99.8% (998/1000) |
≥ 99.0% |
| Tỷ lệ phục hồi dữ liệu Offline |
Cắt kết nối Wi-Fi chủ động 50 lần |
100% (50/50 logs) |
100% |
Thống kê sửa đổi và tối ưu lỗi trong quá trình phát triển (Bug Tracking)
- Lỗi tràn bộ nhớ SRAM trên ATmega328P: Sử dụng quá nhiều chuỗi ký tự cố định khiến dung lượng 2KB SRAM bị chiếm dụng > 85%, dẫn đến hiện tượng vi điều khiển tự khởi động lại ngẫu nhiên.
- Giải pháp: Đưa toàn bộ các hằng chuỗi hiển thị và lệnh AT vào bộ nhớ chương trình Flash bằng macro
F() (ví dụ: Serial.println(F("..."))), giải phóng 1.1KB SRAM.
- Xung đột tín hiệu đường SPI: Module SD Card không giải phóng đường MISO khi chân CS ở mức HIGH, khiến module RC522 không thể đọc thẻ.
- Giải pháp: Đấu nối thêm điện trở kéo lên (Pull-up resistor) 10kΩ tại các đường CS và tinh chỉnh thứ tự khởi tạo thư viện trong hàm
setup().
Đổi mới và đóng góp khoa học
Các cải tiến kỹ thuật nổi bật
+-----------------------------------------------------------------------------+
| CÁC ĐỔI MỚI VÀ ĐÓNG GÓP KỸ THUẬT CỦA ĐỀ TÀI |
+-----------------------------------------------------------------------------+
| 1. Kiến trúc phân tách vi điều khiển (Dual-MCU Task Offloading): |
| Sử dụng Arduino Pro Mini chuyên trách quét ngắt RFID tần số cao, |
| giải phóng tài nguyên cho Arduino Uno xử lý mạng, hiển thị và SD Card. |
+-----------------------------------------------------------------------------+
| 2. Cơ chế lưu trữ đệm phân tầng (Tiered Fault-Tolerant Storage): |
| Tự động chuyển đổi giữa Online (HTTP -> MySQL) và Offline (SPI -> SD), |
| triệt tiêu nguy cơ thất thoát dữ liệu do hạ tầng mạng gián đoạn. |
+-----------------------------------------------------------------------------+
| 3. Tối ưu chi phí phần cứng biên (Extreme Low-Cost Architecture): |
| Hiện thực hóa trạm chấm công IoT thông minh với chi phí linh kiện |
| dưới $35, chỉ bằng 15-20% so với các giải pháp thương mại nhập khẩu. |
+-----------------------------------------------------------------------------+
- Phân tách vi điều khiển (Dual-MCU Task Offloading): Đề tài áp dụng giải pháp sử dụng board Arduino Pro Mini làm mạch tiền xử lý tín hiệu RFID độc lập, kết nối với board Arduino Uno R3 chính. Cấu trúc này giúp phân tách hoàn toàn tác vụ quét ngắt tín hiệu vô tuyến (vốn yêu cầu phản hồi tức thì) khỏi các tiến trình truyền dữ liệu mạng có độ trễ lớn qua ESP8266.
- Cơ chế sao lưu đa tầng (Tiered Hybrid Storage): Không phụ thuộc hoàn toàn vào kết nối mạng không dây. Việc kết hợp module thời gian thực RTC DS1307 và khe cắm thẻ nhớ MicroSD biến thiết bị Client thành một trạm thu thập dữ liệu độc lập (Autonomous Edge Node), đảm bảo tính toàn vẹn dữ liệu trong mọi kịch bản lỗi mạng.
- Cắt giảm 95% thời gian tổng hợp công nhật: Thay vì quy trình kế toán thủ công mất từ 2-3 ngày làm việc mỗi cuối tháng, hệ thống tự động tính toán tổng giờ làm việc và giờ tăng ca ngay tại thời điểm nhân viên quẹt thẻ ra về, giảm thiểu sai sót do con người xuống mức 0%.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng trong doanh nghiệp (Use Cases)
- Văn phòng doanh nghiệp SMEs: Lắp đặt tại sảnh ra vào. Nhân viên sử dụng thẻ nhân viên tích hợp chip RFID 13.56MHz để chấm công, kết hợp mở khóa cửa từ (Access Control).
- Môi trường xưởng sản xuất, khu chế xuất: Triển khai nhiều trạm Client tại các cổng phân xưởng khác nhau. Toàn bộ thiết bị Client cùng trỏ về một địa chỉ IP máy chủ Web trung tâm qua mạng Wi-Fi nội bộ, giúp ban quản lý nắm bắt chính xác quân số lao động theo thời gian thực.
- Giám sát điểm danh giảng đường/phòng thí nghiệm: Ứng dụng tại các trường đại học để quản lý việc có mặt của sinh viên trong từng ca học mà không làm mất thời gian giảng dạy của giảng viên.
Phân tích chi phí và hiệu quả đầu tư (Cost-Benefit Analysis)
BẢNG DỰ TOÁN CHI PHÍ PHẦN CỨNG CHO 01 TERMINAL CLIENT:
+-------------------------------------------------------------+
| 1. Arduino Uno R3 (Vi điều khiển chính ATmega328P) : 8.5 $ |
| 2. Arduino Pro Mini (Vi điều khiển phụ) : 2.5 $ |
| 3. Module RFID RC522 (13.56 MHz) + 02 Thẻ Mifare : 3.0 $ |
| 4. Module Wi-Fi ESP8266-01 : 2.5 $ |
| 5. Màn hình LCD 16x2 + Module chuyển đổi I2C : 3.0 $ |
| 6. Module RTC DS1307 + Module MicroSD Card Reader : 3.5 $ |
| 7. Nguồn Adapter 5V-2A, Vỏ hộp mica, Dây nối, LED : 7.0 $ |
+-------------------------------------------------------------+
| TỔNG CHI PHÍ PHẦN CỨNG CHO MỖI THIẾT BỊ CLIENT : 30.0 $ |
+-------------------------------------------------------------+
- Đánh giá thời gian hoàn vốn (ROI): Với một doanh nghiệp quy mô 100 nhân sự, việc chuyển đổi từ chấm công thẻ giấy sang hệ thống RFID Online giúp tiết kiệm khoảng 250 USD chi phí in ấn thẻ giấy/mực in và 300 USD chi phí nhân sự tổng hợp mỗi tháng. Tổng mức đầu tư cho 02 trạm Client và cài đặt máy chủ khoảng 150 USD, mang lại thời gian hoàn vốn đầu tư chỉ trong vòng dưới 1 tháng.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Chuẩn bảo mật truyền thông: Dữ liệu truyền từ ESP8266 lên Web Server qua giao thức HTTP thuần (Plaintext), chưa mã hóa đường truyền HTTPS/TLS, tiềm ẩn nguy cơ bị chặn bắt gói tin (Man-in-the-middle sniffing) trong mạng nội bộ.
- Cơ chế xác thực thẻ: Thẻ Mifare Classic 1K có thể bị sao chép mã UID bằng các thiết bị RFID Cloner chuyên dụng nếu không sử dụng vùng nhớ mã hóa bảo mật (Sectors/Crypto-1) của thẻ.
- Đồng bộ thẻ nhớ tự động: Dữ liệu lưu trong tệp
OFFLINE.TXT trên thẻ MicroSD hiện tại cần trích xuất thủ công hoặc cần quy trình lập trình thêm để tự động đẩy lên Web khi có mạng trở lại.
Hướng phát triển trong tương lai
- Nâng cấp phần cứng vi điều khiển: Chuyển đổi sang vi điều khiển SoC ESP32 tích hợp sẵn Wi-Fi, Bluetooth BLE, phần cứng giải mã HTTPS (mbedTLS) và xung nhịp 240MHz, giúp tinh gọn toàn bộ cụm mạch Arduino Uno + Pro Mini + ESP8266 thành một bo mạch duy nhất.
- Chuyển dịch giao thức IoT: Ứng dụng giao thức MQTT thông qua một Message Broker (như Eclipse Mosquitto) thay thế HTTP GET, giúp giảm dung lượng gói tin truyền tải, tiết kiệm băng thông và tối ưu hóa thời gian phản hồi đa điểm.
- Xác thực đa lớp (Multi-Factor Authentication): Tích hợp camera nhỏ để chụp ảnh nhận diện khuôn mặt kết hợp khi quẹt thẻ, triệt tiêu hoàn toàn tình trạng quẹt thẻ hộ giữa các nhân viên.
Đối tượng hưởng lợi
+-----------------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI VÀ GIÁ TRỊ MANG LẠI |
+-----------------------------------------------------------------------------+
| Sinh viên & Người học: |
| - Nắm vững phương pháp thiết kế hệ thống nhúng giao tiếp đa bus (SPI/I2C). |
| - Tài liệu tham khảo toàn diện về lập trình Web kết nối phần cứng IoT. |
+-----------------------------------------------------------------------------+
| Kỹ sư phát triển (Developers): |
| - Nền tảng mã nguồn mở dễ dàng tùy biến cho các dự án IoT M2M. |
| - Kiến trúc xử lý lỗi đa tầng (Fail-safe Edge Computing) có tính ứng dụng. |
+-----------------------------------------------------------------------------+
| Doanh nghiệp vừa và nhỏ (SMEs): |
| - Giải pháp chấm công thời gian thực chi phí siêu rẻ (< 35$/điểm). |
| - Cắt giảm 95% thời gian tính toán công nhật, chống thất thoát quỹ lương. |
+-----------------------------------------------------------------------------+
| Nhà nghiên cứu khoa học: |
| - Cung cấp dữ liệu thực nghiệm về độ tin cậy của RFID 13.56MHz và ESP8266. |
+-----------------------------------------------------------------------------+
Câu hỏi thường gặp
1. Yêu cầu kỹ thuật phần cứng và môi trường để triển khai hệ thống là gì?
- Phía Client: Nguồn điện 5V/2A ổn định qua cổng DC hoặc micro-USB; vùng phủ sóng Wi-Fi 2.4GHz chuẩn 802.11 b/g/n với chất lượng tín hiệu RSSI > -75dBm.
- Phía Server: Bất kỳ máy tính cá nhân hoặc máy chủ chạy hệ điều hành Windows/Linux/macOS đã cài đặt môi trường Web Stack (Apache 2.4+, PHP 5.6+, MySQL 5.6+) với dung lượng ổ cứng tối thiểu 10GB cho cơ sở dữ liệu.
2. Hệ thống có khả năng mở rộng (Scalability) tối đa bao nhiêu máy quét Client?
Hệ thống Web Server dựa trên Apache/PHP và MySQL có khả năng tiếp nhận đồng thời từ 20 đến 50 thiết bị Client gửi yêu cầu trong cùng một giây mà không bị nghẽn (với cấu hình server thông thường). Khi mở rộng quy mô trên 100 thiết bị, khuyến nghị chuyển đổi kiến trúc sang Node.js/Go backend kết hợp giao thức truyền thông MQTT.
3. Làm thế nào để tích hợp hệ thống với phần mềm quản lý nhân sự (HRM/ERP) có sẵn?
Cơ sở dữ liệu MySQL được thiết kế theo chuẩn quan hệ quốc tế ANSI-SQL. Các hệ thống phần mềm HRM/ERP hiện hữu (như Odoo, SAP hoặc phần mềm viết bằng C#/Java) có thể kết nối trực tiếp vào bảng bangcong hoặc thông qua các câu truy vấn SQL Views / RESTful JSON API trung gian để trích xuất dữ liệu công nhật tự động.
4. Chi phí vận hành và yêu cầu bảo trì định kỳ của hệ thống như thế nào?
Chi phí vận hành gần như bằng 0 do hệ thống sử dụng mạng Wi-Fi nội bộ sẵn có và phần mềm nguồn mở. Công tác bảo trì định kỳ bao gồm: kiểm tra và sao lưu (backup) cơ sở dữ liệu MySQL hàng tháng, làm sạch bụi bẩn tại đầu đọc thẻ RFID và kiểm tra pin nuôi đồng hồ RTC sau mỗi 2 năm hoạt động.
5. Dự án xử lý tình huống nhiều nhân viên quẹt thẻ cùng một thời điểm ra sao?
Tại một thiết bị Client, vòng quét RFID RC522 hoạt động với chu kỳ 50ms và có khoảng nghỉ 1000ms giữa 2 lần quẹt để chống đọc trùng lặp. Khi nhiều nhân viên xếp hàng, thời gian xử lý cho mỗi người chỉ mất khoảng 0.3 - 0.5 giây. Nếu doanh nghiệp có lưu lượng lớn tại giờ cao điểm, giải pháp tối ưu là triển khai song song 2 hoặc nhiều trạm Client độc lập tại cổng ra vào.
Kết luận
Đồ án tốt nghiệp "Hệ thống chấm công online qua RFID" đã hiện thực hóa thành công một giải pháp công nghệ toàn diện kết hợp giữa kỹ thuật nhúng, truyền thông không dây và công nghệ phần mềm máy chủ. Bằng việc làm chủ công nghệ RFID 13.56 MHz, vi điều khiển ATmega328P, module Wi-Fi ESP8266 cùng ngăn xếp phần mềm PHP/MySQL, nhóm tác giả đã xây dựng hoàn chỉnh mô hình chấm công trực tuyến có tính năng tự động hóa cao, vận hành bền bỉ và sở hữu cơ chế sao lưu dữ liệu phân tầng thông minh.
Công trình không chỉ mang giá trị học thuật sâu sắc đối với sinh viên ngành Kỹ thuật Máy tính mà còn chứng minh tính khả thi cao trong ứng dụng thương mại hóa, mở ra hướng đi tối ưu chi phí chuyển đổi số cho các doanh nghiệp Việt Nam.
Trải nghiệm và ứng dụng: Để tham khảo mã nguồn chi tiết, sơ đồ nguyên lý mạch in (Schematic) và hướng dẫn triển khai hệ thống máy chủ, bạn đọc có thể liên hệ Bộ môn Kỹ thuật Máy tính - Viễn thông, Khoa Điện - Điện tử, Trường Đại học Sư phạm Kỹ thuật TP.HCM hoặc kết nối trực tiếp với nhóm tác giả đề tài.