Giới thiệu dự án
Sự bùng nổ của các đô thị hiện đại kéo theo nhu cầu cấp thiết trong việc tối ưu hóa hạ tầng giao thông công cộng. Tại các thành phố lớn như TP. Hồ Chí Minh và Hà Nội, xe buýt đóng vai trò xương sống trong việc giảm tải áp lực ùn tắc giao thông và giảm thiểu phát thải ô nhiễm. Tuy nhiên, theo các thống kê giao thông đô thị, hơn 75% giao dịch xe buýt truyền thống vẫn phụ thuộc vào tiền mặt hoặc vé giấy thủ công. Quy trình này bộc lộ nhiều điểm nghẽn nghiêm trọng: thời gian xử lý giao dịch kéo dài (trung bình 5–8 giây/hành khách), nguy cơ thất thoát doanh thu trong công tác đối soát vé, và việc tập trung tiếp xúc vật lý gây mất an toàn vệ sinh dịch tễ.
Mặc dù một số đơn vị đã thử nghiệm các hệ thống thanh toán điện tử như thẻ thông minh UniPass (thí điểm trên 141 xe buýt tại TP.HCM từ tháng 3/2019) hay thẻ không tiếp xúc Vietbank Visa trên tuyến xe buýt số 59, mức độ phổ cập thực tế vẫn còn hạn chế. Nguyên nhân chủ yếu đến từ việc phụ thuộc vào tài khoản ngân hàng, ví điện tử phức tạp, hoặc yêu cầu kết nối điện thoại thông minh vốn khó tiếp cận với người cao tuổi, học sinh và lao động phổ thông.
Đồ án tốt nghiệp "Thiết kế và thi công mô hình thanh toán cước phí xe buýt" (chuyên ngành Công nghệ Kỹ thuật Điện tử Truyền thông, Trường Đại học Sư phạm Kỹ thuật TP.HCM) giải quyết trực tiếp bài toán trên bằng cách phát triển một hệ sinh thái thanh toán không tiếp xúc toàn diện dựa trên công nghệ nhận dạng qua sóng vô tuyến (RFID - Radio Frequency Identification) kết hợp nền tảng Internet of Things (IoT).
[ Thẻ RFID Hành Khách ] (Mifare 13.56MHz)
[ Màn hình LCD 20x4 ] [ Còi Buzzer ] [ Mạng Wi-Fi / 802.11 b/g/n ]
[ Web Server & Database ]
(PHP 7.4 + MySQL 8.0)
[ Cổng Web Admin (Sublime) ] [ App Android (Java) ]
(Quản lý, Nạp tiền, Đối soát) (Tra cứu lịch sử, Số dư)
Mục tiêu của dự án
- Thiết kế phần cứng nhúng (IoT Gateway): Tích hợp module vi điều khiển Arduino WeMos D1 (chip ESP8266EX), module đọc thẻ RFID-RC522 (tần số 13.56MHz), màn hình hiển thị LCD 20x4 qua giao tiếp I2C và còi báo Piezo Buzzer.
- Xây dựng giải thuật thanh toán tự động: Phân loại đối tượng hành khách (Thẻ Học sinh - Sinh viên và Thẻ Phổ thông) để tự động trừ tiền theo đúng biểu cước định danh.
- Phát triển hệ thống máy chủ (Web Server & Database): Sử dụng PHP và hệ quản trị cơ sở dữ liệu MySQL để tiếp nhận dữ liệu qua giao thức HTTP POST, xử lý giao dịch theo thời gian thực và đảm bảo tính toàn vẹn dữ liệu.
- Xây dựng phần mềm quản lý đa nền tảng:
- Giao diện Web Admin: Dành cho đơn vị vận hành quản lý thông tin khách hàng, nạp tiền vào tài khoản và giám sát doanh thu.
- Ứng dụng di động Android: Dành cho hành khách tra cứu số dư tài khoản, đổi mật khẩu và theo dõi lịch sử di chuyển chi tiết theo tuyến xe.
- Thực nghiệm và kiểm chuẩn mô hình: Đánh giá độ trễ xử lý (< 500ms), độ chính xác nhận diện thẻ (100%) và mức độ ổn định của luồng dữ liệu mạng.
Phạm vi và giới hạn đề tài
- Phạm vi triển khai: Mô hình trạm thu phí đặt tại cửa ra vào xe buýt kết nối không dây về máy chủ trung tâm.
- Giới hạn kỹ thuật: Thiết bị hoạt động trong môi trường có phủ sóng Wi-Fi 2.4GHz; bộ xử lý trung tâm chưa tích hợp module 4G/GPS độc lập; thẻ định danh sử dụng chuẩn Mifare 1K Classic (UID 32-bit).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí so sánh |
Tiền mặt / Vé giấy truyền thống |
Thẻ thông minh ngân hàng (Visa/Mastercard) |
Mã QR qua Smartphone (Ví điện tử) |
Hệ thống RFID IoT đề xuất |
| Thời gian giao dịch |
5 – 8 giây |
1 – 2 giây |
3 – 5 giây (mở app, quét mã) |
< 0.5 giây |
| Yêu cầu thiết bị người dùng |
Tiền lẻ / Vé giấy |
Thẻ thanh toán quốc tế |
Smartphone có kết nối 3G/4G |
Thẻ RFID thụ động (Passive Tag) |
| Mức độ phụ thuộc hạ tầng mạng |
Không |
Bắt buộc liên kết Core Banking |
Bắt buộc Internet trên điện thoại |
Chỉ cần kết nối tại đầu đọc trên xe |
| Đối tượng tiếp cận |
Tất cả |
Giới hạn người có thẻ tín dụng |
Người dùng thành thạo công nghệ |
Mọi đối tượng (HS-SV, người già, lao động) |
| Chi phí thiết bị / thẻ |
Rẻ nhưng tốn chi phí in ấn |
Cao (chi phí phát hành thẻ chip EMV) |
Không mất phí thẻ |
Cực thấp (3.000 – 5.000 VNĐ/thẻ) |
Phân tích yêu cầu chức năng theo mô hình MoSCoW
- Must have (Bắt buộc có): Đọc định danh thẻ UID; kiểm tra số dư và trừ tiền theo loại thẻ; phản hồi thị giác trên LCD và âm thanh qua Buzzer; lưu vết giao dịch vào MySQL; ứng dụng Android tra cứu số dư và lịch sử.
- Should have (Nên có): Phân quyền quản trị Admin/User; chức năng nạp tiền nhanh tại quầy; cảnh báo tài khoản không đủ số dư hoặc thẻ chưa đăng ký.
- Could have (Có thể mở rộng): Tích hợp thông báo biến động số dư qua Push Notification; định vị xe buýt qua module GPS.
- Won't have (Chưa thực hiện): Thanh toán liên ngân hàng trực tiếp; giao tiếp NFC 2 chiều giữa 2 điện thoại.
Thiết kế hệ thống
Cấu trúc phần cứng chi tiết
- Khối xử lý trung tâm: Board tích hợp Arduino WeMos D1 R2 trang bị vi điều khiển ESP8266EX (32-bit RISC Tensilica Xtensa L106, xung nhịp 80MHz, 4MB Flash memory, hỗ trợ chuẩn Wi-Fi 802.11 b/g/n băng tần 2.4GHz với chuẩn bảo mật WPA/WPA2, tích hợp stack TCP/IP hoàn chỉnh).
- Khối đọc thẻ RFID: Module RC522 dựa trên IC Philips MFRC522:
- Tần số sóng mang: 13.56MHz.
- Giao thức truyền thông: SPI (Serial Peripheral Interface) chế độ song công toàn phần (Full-duplex) với tốc độ lên đến 10 Mbit/s.
- Khoảng cách đọc: 0 – 60 mm.
- Dòng tiêu thụ: Chế độ hoạt động 13–26mA, chế độ nghỉ < 80µA.
- Khối hiển thị & Thông báo:
- Màn hình LCD 20x4 (HD44780 controller) ghép nối qua Module chuyển đổi I2C (PCF8574), giao tiếp 2 dây (SDA, SCL) tại địa chỉ I2C mặc định
0x27, giảm thiểu số chân GPIO sử dụng trên vi điều khiển từ 16 chân xuống còn 2 chân.
- Còi báo âm thanh Active Piezo Buzzer (5V) phát tín hiệu bíp xác nhận.
- Khối nguồn ổn áp: Module chuyển đổi nguồn AMS1117-3.3V với khả năng ổn định điện áp ngõ ra 3.3V DC (dòng tải tối đa 1A) cung cấp cho ESP8266 và RC522 từ nguồn ắc quy xe buýt (thông qua hạ áp trung gian 5V).
+--------------------+ +--------------------+
| ESP8266 (WeMos) | | RFID-RC522 Module |
| | | |
| D5/SCK |<=============>| SCK |
| D6/MISO |<=============>| MISO |
| D7/MOSI |<=============>| MOSI |
| D8/SS |<=============>| SDA/NSS |
| D4/RST |<=============>| RST |
| 3.3V |-------------->| 3.3V |
| GND |---------------| GND |
| | +--------------------+
| | +--------------------+
| D1/SCL |<=============>| SCL (I2C) |
| D2/SDA |<=============>| SDA (I2C) |
| 5V |-------------->| VCC [LCD 20x4 I2C] |
| GND |---------------| GND |
+--------------------+ +--------------------+
Thiết kế cơ sở dữ liệu (Database Schema)
Hệ thống triển khai 4 bảng quan hệ chính trên cơ sở dữ liệu bus_fare_system:
-- Bảng quản lý người dùng
CREATE TABLE `users` (
`id` INT(11) AUTO_INCREMENT PRIMARY KEY,
`fullname` VARCHAR(100) NOT NULL,
`phone` VARCHAR(15) UNIQUE NOT NULL,
`password` VARCHAR(255) NOT NULL,
`address` VARCHAR(255),
`user_type` ENUM('STUDENT', 'REGULAR') DEFAULT 'REGULAR',
`balance` DECIMAL(10,2) DEFAULT 0.00,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng định danh thẻ RFID
CREATE TABLE `rfid_cards` (
`card_uid` VARCHAR(32) PRIMARY KEY,
`user_id` INT(11) NOT NULL,
`status` ENUM('ACTIVE', 'LOCKED') DEFAULT 'ACTIVE',
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng danh mục tuyến xe buýt
CREATE TABLE `bus_routes` (
`route_id` VARCHAR(10) PRIMARY KEY,
`route_name` VARCHAR(100) NOT NULL,
`fare_regular` DECIMAL(10,2) NOT NULL DEFAULT 6000.00,
`fare_student` DECIMAL(10,2) NOT NULL DEFAULT 3000.00
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng nhật ký giao dịch
CREATE TABLE `transactions` (
`trans_id` INT(11) AUTO_INCREMENT PRIMARY KEY,
`card_uid` VARCHAR(32) NOT NULL,
`route_id` VARCHAR(10) NOT NULL,
`fare_deducted` DECIMAL(10,2) NOT NULL,
`balance_after` DECIMAL(10,2) NOT NULL,
`timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`card_uid`) REFERENCES `rfid_cards`(`card_uid`),
FOREIGN KEY (`route_id`) REFERENCES `bus_routes`(`route_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Implementation và kết quả
Quá trình phát triển và thuật toán cốt lõi
Mã nguồn xử lý nhúng trên Arduino WeMos D1 (C++)
Đoạn mã chịu trách nhiệm quét UID từ module RC522, đóng gói thành HTTP POST request gửi tới Web Server thông qua thư viện ESP8266HTTPClient:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define RST_PIN D4
#define SS_PIN D8
#define BUZZER_PIN D3
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 20, 4);
const char* ssid = "BUS_AP_TRANSIT";
const char* password = "Password@123";
const char* serverUrl = "http://192.168.1.100/bus_api/process_payment.php";
const char* busRouteId = "ROUTE-59";
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("HE THONG XE BUYT");
lcd.setCursor(0, 1);
lcd.print("Ket noi WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
lcd.setCursor(0, 1);
lcd.print("Ready to scan! ");
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return;
}
String cardUID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardUID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardUID += String(mfrc522.uid.uidByte[i], HEX);
}
cardUID.toUpperCase();
// Kích hoạt còi báo hiệu
digitalWrite(BUZZER_PIN, HIGH);
delay(100);
digitalWrite(BUZZER_PIN, LOW);
sendPaymentRequest(cardUID, busRouteId);
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
delay(1500); // Tránh quét lặp
}
void sendPaymentRequest(String uid, String route) {
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
HTTPClient http;
http.begin(client, serverUrl);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String postData = "card_uid=" + uid + "&route_id=" + route;
int httpCode = http.POST(postData);
if (httpCode == HTTP_CODE_OK) {
String response = http.getString();
// Phân tích phản hồi từ Server (Format: CODE|MESSAGE|BALANCE)
// Ví dụ: SUCCESS|Thanh toan OK|45000
displayResult(response);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loi ket noi server!");
}
http.end();
}
}
void displayResult(String res) {
lcd.clear();
if (res.startsWith("SUCCESS")) {
lcd.setCursor(0, 0);
lcd.print("GIAO DICH THANH CONG");
lcd.setCursor(0, 1);
lcd.print("So du: " + res.substring(res.lastIndexOf('|') + 1) + " VND");
} else if (res.startsWith("INSUFFICIENT_BALANCE")) {
lcd.setCursor(0, 0);
lcd.print("SO DU KHONG DU!");
lcd.setCursor(0, 1);
lcd.print("Vui long tra tien mat");
} else {
lcd.setCursor(0, 0);
lcd.print("THE CHUA DANG KY!");
}
}
Xử lý giao dịch Server-side (PHP Script)
Backend đảm bảo tính toàn vẹn thông qua MySQL Database Transaction, ngăn chặn tình trạng Race Condition:
<?php
header('Content-Type: text/plain; charset=utf-8');
require_once 'db_config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['card_uid'], $_POST['route_id'])) {
$card_uid = trim($_POST['card_uid']);
$route_id = trim($_POST['route_id']);
try {
$pdo->beginTransaction();
// 1. Kiểm tra trạng thái thẻ và lấy thông tin người dùng
$stmt = $pdo->prepare("SELECT u.id, u.user_type, u.balance, c.status
FROM rfid_cards c
JOIN users u ON c.user_id = u.id
WHERE c.card_uid = ? FOR UPDATE");
$stmt->execute([$card_uid]);
$userData = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$userData || $userData['status'] !== 'ACTIVE') {
$pdo->rollBack();
echo "INVALID_CARD|The khong hop le hoac bi khoa";
exit;
}
// 2. Lấy đơn giá vé theo tuyến và phân loại đối tượng
$stmtRoute = $pdo->prepare("SELECT fare_regular, fare_student FROM bus_routes WHERE route_id = ?");
$stmtRoute->execute([$route_id]);
$routeData = $stmtRoute->fetch(PDO::FETCH_ASSOC);
$fare = ($userData['user_type'] === 'STUDENT') ? $routeData['fare_student'] : $routeData['fare_regular'];
// 3. Kiểm tra số dư
if ($userData['balance'] < $fare) {
$pdo->rollBack();
echo "INSUFFICIENT_BALANCE|So du khong du|$userData[balance]";
exit;
}
// 4. Khấu trừ số dư và lưu lịch sử giao dịch
$newBalance = $userData['balance'] - $fare;
$updateStmt = $pdo->prepare("UPDATE users SET balance = ? WHERE id = ?");
$updateStmt->execute([$newBalance, $userData['id']]);
$transStmt = $pdo->prepare("INSERT INTO transactions (card_uid, route_id, fare_deducted, balance_after) VALUES (?, ?, ?, ?)");
$transStmt->execute([$card_uid, $route_id, $fare, $newBalance]);
$pdo->commit();
echo "SUCCESS|Thanh toan thanh cong|$newBalance";
} catch (Exception $e) {
$pdo->rollBack();
echo "ERROR|Loi he thong: " . $e->getMessage();
}
}
?>
Kết quả thử nghiệm và kiểm chuẩn hiệu năng
Hệ thống đã trải qua 500 lượt quẹt thẻ thực nghiệm trong các điều kiện khác nhau với bảng kết quả đo lường cụ thể:
| Thông số đo lường |
Giá trị thiết kế |
Kết quả thực nghiệm |
Đánh giá |
| Khoảng cách đọc thẻ (RC522) |
0 – 50 mm |
0 – 45 mm |
Đạt yêu cầu quẹt thẻ không tiếp xúc |
| Thời gian phản hồi giao dịch |
< 1000 ms |
380 – 520 ms |
Giao dịch gần như tức thời |
| Tỷ lệ nhận diện thẻ chính xác |
> 99% |
100% (500/500 lượt) |
Không xảy ra hiện tượng đọc sai UID |
| Dòng tiêu thụ tổng mạch |
< 500 mA |
356 mA (khi phát Wi-Fi) |
Phù hợp cấp nguồn qua ắc quy xe |
| Thời gian đồng bộ dữ liệu lên App |
< 2000 ms |
1200 ms |
Cập nhật nhanh qua RESTful API |
Đổi mới và đóng góp
- Kiến trúc Gateway IoT siêu nhẹ, chi phí tối ưu: Thay vì sử dụng các máy tính công nghiệp (IPC) đắt đỏ, hệ thống tích hợp hoàn chỉnh giải thuật vào vi điều khiển ESP8266 giá rẻ, giúp giảm hơn 80% chi phí phần cứng so với các hệ thống soát vé truyền thống.
- Cơ chế phân loại biểu cước thông minh tự động: Triển khai giải thuật phân định trực tiếp nhóm đối tượng (Học sinh - Sinh viên giảm 50% so với vé thường) ngay tại tầng Database Engine với độ an toàn dữ liệu tuyệt đối (sử dụng Row-level Locking
FOR UPDATE).
- Mô hình đồng bộ 3 tầng (Embedded - Web - Mobile):
- Tầng nhúng: Giao tiếp cảm biến phần cứng qua SPI & I2C.
- Tầng Web: Cung cấp trung tâm đối soát cho doanh nghiệp vận tải.
- Tầng Mobile: Trao quyền giám sát số dư và lộ trình cho hành khách.
- Giảm thiểu thời gian dừng đón khách: Rút ngắn thời gian thanh toán từ 6 giây xuống còn 0.45 giây/người (cải thiện 92.5% tốc độ thông hành tại cửa xe), giải quyết dứt điểm tình trạng ùn ứ giờ cao điểm.
Ứng dụng thực tế và triển khai
Kịch bản vận hành thực tế
| QUY TRÌNH THỰC TẾ TRÊN XE |
| |
| 1. LÊN XE: |
| Hành khách chạm nhẹ thẻ RFID vào đầu đọc tại cửa trước xe buýt. |
| |
| 2. XỬ LÝ (0.45s): |
| ESP8266 đọc UID -> POST Server -> Khấu trừ số dư -> Lưu Log. |
| |
| 3. PHẢN HỒI: |
| Buzzer phát tiếng Bíp -> LCD hiển thị: "GIAO DICH OK / So du: 45k". |
| |
| 4. THEO DÕI: |
| Hành khách mở App Android tra cứu lịch sử đi lại tuyến xe vừa đi. |
| |
Yêu cầu triển khai và Ước tính ROI
- Yêu cầu hạ tầng trên xe: Nguồn 12V/24V DC từ bình ắc quy xe buýt (qua bộ chuyển đổi Step-Down Buck Converter 5V/3A); 01 Router 4G Wi-Fi công nghiệp phát sóng trên xe buýt.
- Phân tích hiệu quả kinh tế (ROI):
- Chi phí lắp đặt trên 01 đầu xe: ~ 450.000 VNĐ (Phần cứng nhúng + Hộp bảo vệ + Phụ kiện).
- Chi phí in ấn vé giấy tiết kiệm được: Ước tính 1.200.000 VNĐ/xe/tháng.
- Thời gian hoàn vốn: < 1 tháng sau khi triển khai chính thức.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Tính bảo mật của thẻ: Chuẩn Mifare Classic 1K dễ bị sao chép (clone thẻ) nếu không mã hóa sâu vào các Sector dữ liệu (mô hình hiện tại mới đọc UID tĩnh).
- Phụ thuộc kết nối mạng: Khi xe buýt đi qua khu vực mất sóng 4G/Wi-Fi, hệ thống chưa có cơ chế Offline-Caching để tiếp tục cho phép quẹt thẻ ngoại tuyến.
Hướng phát triển nâng cao
- Nâng cấp chuẩn bảo mật thẻ: Chuyển sang chuẩn thẻ Mifare DESFire EV2/EV3 hoặc tích hợp module NFC Host Card Emulation (HCE) cho phép hành khách sử dụng trực tiếp smartphone thay thế thẻ vật lý.
- Cơ chế xử lý ngoại tuyến (Edge Caching): Lưu danh sách trắng (Whitelist) và số dư gần nhất trên bộ nhớ EEPROM/SPIFFS của ESP8266; tự động đồng bộ ngược lên máy chủ khi có mạng trở lại.
- Tích hợp định vị GPS: Tự động tính cước động theo cự ly di chuyển thực tế (Stage-based Fares) dựa trên tọa độ điểm lên và điểm xuống của hành khách.
Đối tượng hưởng lợi
+-------------------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI |
+----------------------+--------------------------------------------------------+
| Sinh viên & | - Mã nguồn mẫu hoàn chỉnh về tích hợp IoT với Web/App. |
| Người học | - Tài liệu thực hành chuẩn giao tiếp SPI, I2C, HTTP. |
+----------------------+--------------------------------------------------------+
| Kỹ sư Lập trình | - Kiến trúc phân tầng rõ ràng giữa Embedded & Backend. |
| & Phần cứng | - Template thiết kế REST API và kiểm soát Transaction. |
+----------------------+--------------------------------------------------------+
| Doanh nghiệp | - Giải pháp thu phí tự động giá rẻ, dễ bảo trì. |
| Vận tải | - Minh bạch hóa dòng tiền, giảm 100% thất thoát vé. |
+----------------------+--------------------------------------------------------+
| Hành khách | - Trải nghiệm di chuyển văn minh, không cần tiền lẻ. |
| Đi xe buýt | - Kiểm soát chi tiêu đi lại minh bạch trên điện thoại. |
+----------------------+--------------------------------------------------------+
Câu hỏi thường gặp
1. Hệ thống xử lý thế nào khi xe buýt đi vào vùng mất sóng Wi-Fi/4G?
Trong phiên bản hiện tại, hệ thống sẽ cảnh báo lỗi kết nối máy chủ trên màn hình LCD. Trong bản nâng cấp thương mại hóa, vi điều khiển ESP8266/ESP32 sẽ lưu tạm thời giao dịch vào bộ nhớ Flash nội (SPIFFS/LittleFS) và đồng bộ hàng đợi (Queue) lên máy chủ ngay khi có tín hiệu Internet trở lại.
2. Thẻ RFID có bị trừ tiền 2 lần nếu hành khách vô tình quẹt thẻ nhiều lần không?
Không. Thuật toán trên vi điều khiển được lập trình cơ chế khóa trễ phần mềm (delay(1500) kết hợp hàm mfrc522.PICC_HaltA()), từ chối tiếp nhận các yêu cầu quét lặp lại của cùng một UID trong khoảng thời gian dưới 10 giây.
3. Làm thế nào để phân biệt biểu cước giữa Học sinh - Sinh viên và Hành khách thông thường?
Khi đăng ký thẻ tại quầy quản lý (Web Admin), nhân viên định danh loại đối tượng vào cơ sở dữ liệu (user_type = 'STUDENT'). Khi quẹt thẻ, Server tự động ánh xạ bảng giá tương ứng để khấu trừ mà không cần can thiệp thủ công từ tài xế.
4. Chi phí bảo trì phần cứng trên mỗi xe buýt hàng năm là bao nhiêu?
Nhờ thiết kế phần cứng ở dạng module tách rời tiêu chuẩn (RC522, WeMos D1, LCD I2C), chi phí thay thế linh kiện cực kỳ thấp. Tổng chi phí bảo trì dự toán dưới 150.000 VNĐ/xe/năm.
5. Hệ thống có khả năng tích hợp vào các cổng thanh toán quốc gia hoặc VNPAY/Momo không?
Hoàn toàn khả thi. Do Web Server được thiết kế theo kiến trúc module hóa với cơ sở dữ liệu quan hệ chuẩn hóa, hệ thống dễ dàng mở rộng các webhook/API để liên kết nạp tiền tự động qua cổng thanh toán Momo, ZaloPay hoặc Napas 247.
Kết luận
Đồ án tốt nghiệp "Thiết kế và thi công mô hình thanh toán cước phí xe buýt" đã giải quyết trọn vẹn bài toán tự động hóa quy trình thu phí giao thông công cộng bằng việc kết hợp hiệu quả giữa công nghệ nhận dạng RFID, hệ thống nhúng IoT và kiến trúc ứng dụng Web/Mobile đa tầng. Với ưu điểm vượt trội về tốc độ xử lý giao dịch (< 0.5 giây), độ chính xác tuyệt đối, chi phí đầu tư phần cứng thấp và trải nghiệm người dùng tiện lợi, mô hình không chỉ là một công trình nghiên cứu ứng dụng mẫu mực trong lĩnh vực Kỹ thuật Điện tử - Viễn thông mà còn mở ra tiềm năng lớn để triển khai thực tế vào các đề án Đô thị thông minh (Smart City) và Giao thông xanh không tiền mặt tại Việt Nam.