โปรเจกต์ ระบบเช็คชื่อ RFID ที่ใช้ Arduino Uno R4 Wi-Fi
ระบบเช็คชื่อ RFID แบบอัตโนมัติและชาญฉลาด ขับเคลื่อนด้วย Arduino Uno R4 Wi-Fi ที่ติดตามการเข้างาน เวลา และสรุปผลแบบ Real-time!
ระบบเช็คชื่อ RFID แบบอัตโนมัติและชาญฉลาด ขับเคลื่อนด้วย Arduino Uno R4 Wi-Fi ที่ติดตามการเข้างาน เวลา และสรุปผลแบบ Real-time!
Project Supporter Team
โพสต์โดย

แม้ว่าจะเป็นส่วนประกอบสำคัญของการดำเนินงานในแต่ละวันในที่ทำงาน โรงเรียน และมหาวิทยาลัย แต่การเช็คชื่อเข้าเรียนหรือเข้างานมักจะน่าเบื่อและอาจเกิดข้อผิดพลาดจากมนุษย์ได้ง่าย ด้วยระบบอัตโนมัติและการบันทึกข้อมูลแบบ real-time ระบบเช็คชื่อด้วย RFID บนพื้นฐานของ Arduino UNO R4 Wi-Fi จึงเป็นทางเลือกที่ทันสมัยและมีประสิทธิภาพ
เทคนิคนี้ช่วยให้การเช็คชื่อทำได้ง่ายขึ้นโดยใช้เทคโนโลยี RFID (Radio Frequency Identification) นักเรียนทุกคนจะได้รับบัตร RFID ซึ่งระบบจะประทับตราว่าเป็น "Present - On Time" (มาเรียน - ตรงเวลา) หากมีการสแกนภายในสิบนาทีแรกหลังจากเปิดเครื่อง ส่วนนักเรียนที่ไม่สแกนจะถูกทำเครื่องหมายว่าขาดเรียนทันที ในขณะที่ผู้ที่สแกนหลังจากผ่านไปสิบนาทีจะถูกเปลี่ยนสถานะเป็น "Present - Late" (มาเรียน - สาย)
นอกจากนี้ ระบบยังมีบัตร Master Card ของครู ซึ่งเมื่อสแกนแล้วจะแสดงสรุปการเช็คชื่อของนักเรียนทุกคนที่ลงทะเบียนไว้บนหน้าจอ 20x4 I2C LCD
โปรเจกต์นี้เป็นการรวมกันของระบบอัตโนมัติและ electronics เพื่อมอบโซลูชันการเช็คชื่ออัจฉริยะที่ใช้งานได้จริง ซึ่งเหมาะสำหรับ:
1. Arduino UNO R4 Wi-Fi: Arduino รุ่นล่าสุดที่มีประสิทธิภาพการประมวลผลเพิ่มขึ้นและมี Wi-Fi ในตัว ช่วยให้ขยายขีดความสามารถได้ง่าย เพิ่มความเร็ว และความเสถียรสำหรับการรวมระบบ IoT ในอนาคต
2. MFRC522 RFID Module: ใช้การเชื่อมต่อแบบ SPI เพื่อค้นหาและอ่าน UID บนบัตร RFID เป็นวิธีการระบุบัตรแต่ละใบที่รวดเร็วและประหยัดค่าใช้จ่าย
3. RFID Tags: แต่ละใบแทน ID ของนักเรียนที่แตกต่างกัน เป็นวิธีการระบุตัวตนที่ง่าย ทนทาน และนำกลับมาใช้ใหม่ได้
4. 20x4 I2C LCD: แสดงการอัปเดตตัวนับเวลาแบบ real-time, ข้อความ และชื่อนักเรียน อินเทอร์เฟซแบบ I2C ช่วยเพิ่มความน่าเชื่อถือและลดความยับเยินของสายไฟ
5. Jumper Wires: เชื่อมต่อส่วนประกอบทั้งหมดเข้าด้วยกันอย่างปลอดภัย รับประกันการไหลของสัญญาณที่คงที่โดยไม่จำเป็นต้องบัดกรี

Arduino Uno R4 Wi-Fi จะเริ่มต้นการทำงานของ LCD และ RFID Module เมื่อเปิดเครื่อง ระบบจะเริ่มจับเวลาถอยหลัง 10 นาทีเพื่อระบุช่วงเวลาที่เปิดให้เช็คชื่อ
นี่คือคำอธิบายโดยละเอียดเกี่ยวกับการทำงานของระบบ:
1. System Initialization: "Ready for Attendance" คือข้อความทักทายที่ปรากฏบน LCD เมื่อเปิดระบบ Arduino จะบันทึกเวลาปัจจุบัน ณ เริ่มต้นเซสชัน
2. RFID Tag Scanning: Arduino จะเปรียบเทียบ Unique Identifier (UID) ที่ Module RC522 อ่านได้จากบัตร RFID ของนักเรียนกับรายการ UID ที่ลงทะเบียนไว้ซึ่งจัดเก็บไว้ในหน่วยความจำ
3. Update on Attendance Status:
นักเรียนจะถูกทำเครื่องหมายเป็น "Present – On Time" หากสแกนบัตรภายในสิบนาที
จะถูกบันทึกเป็น "Present – Late" หากทำการสแกนหลังจากผ่านไปสิบนาที
เมื่อสแกนบัตรของครูแล้ว นักเรียนที่ไม่ได้สแกนจะถูกระบุว่าขาดเรียนโดยอัตโนมัติ
4. Teacher Summary Card: สรุปการเช็คชื่อจะถูกเปิดใช้งานโดยบัตร RFID ของครู หน้าจอ LCD จะแสดงชื่อนักเรียนแต่ละคนและสถานะการเข้าเรียน (ขาด, สาย หรือ ตรงเวลา) ตามลำดับ
5. Wi-Fi Extension (Optional): การตรวจสอบการเช็คชื่อจากระยะไกลแบบ real-time สามารถทำได้ด้วย Arduino Uno R4 Wi-Fi ซึ่งช่วยให้สามารถส่งข้อมูลไปยัง Cloud server, ฐานข้อมูลออนไลน์ หรือแม้แต่ Google Sheets ในภายหลัง
ด้วยการกำจัดการใช้แผ่นรายชื่อแบบเขียนด้วยมือ โซลูชันนี้จึงรับประกันความแม่นยำ ความโปร่งใส และประสิทธิภาพ

เชื่อมต่อ MFRC522 RFID Module เข้ากับ Arduino Uno R4 Wi-Fi
เชื่อมต่อหน้าจอ 20x4 I2C LCD
Upload Code ของคุณโดยใช้ Arduino IDE ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Library ต่อไปนี้แล้ว:
/* ระบบเช็คชื่อด้วย RFID สำหรับผู้เริ่มต้น (RC522 + 20x4 I2C LCD)
สำหรับ Arduino Uno R4 Wi-Fi (pinout เหมือนกับบอร์ดที่รองรับ UNO)
การต่อสาย (Arduino UNO/R4):
RC522: SDA(SS)=D10, SCK=D13, MOSI=D11, MISO=D12, RST=D9, 3.3V, GND
I2C LCD: SDA=A4, SCL=A5, VCC=5V, GND=GND
การเปลี่ยนแปลงในเวอร์ชันนี้:
- ลบ UID ที่ซ้ำกันออก
- อัปเดตรายชื่อนักเรียนเป็นชื่อใหม่
*/
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 10 // SDA/SS สำหรับ RC522
#define RST_PIN 9 // RST สำหรับ RC522
#define LCD_ADDR 0x27
#define LCD_COLS 20
#define LCD_ROWS 4
MFRC522 rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);
// UID ของครู (ตัวพิมพ์ใหญ่, ไม่มีช่องว่าง)
const char TEACHER_UID[] = "2A7E17B1";
// 10 นาที = 10 * 60 * 1000 มิลลิวินาที
const unsigned long ATTENDANCE_LENGTH = 10UL * 60UL * 1000UL;
// เวลา debounce เพื่อป้องกันการอ่านบัตรใบเดิมซ้ำหลายครั้งอย่างรวดเร็ว
const unsigned long DEBOUNCE = 1000UL;
// ระยะเวลาแสดงข้อมูลนักเรียน (ms)
const unsigned long SHOW_MS = 1500UL;
// อัตราการรีเฟรชสำหรับตัวนับเวลา (ms)
const unsigned long REFRESH_MS = 500UL;
// --- รายการ UID นักเรียนและชื่อที่ตรงกัน ---
// ลบ UID ที่ซ้ำกันแล้ว — ตรวจสอบให้แน่ใจว่า UID ทั้งหมดที่นี่ไม่ซ้ำกัน (ตัวพิมพ์ใหญ่, ไม่มีช่องว่าง)
const char* uids[] = {
"E2D2D500",
"49F1DF00",
"5C55D500",
"827ED600",
"310AF400",
"D7CFE000",
"23370EAA",
"7EB6F300",
"D784D500"
};
const char* names[] = {
"Amanjeet Kaur",
"Siddharth Verma",
"Meera Patel",
"Arjun Khanna",
"Neha Rathi",
"Vikram Singh",
"Simran Kaur",
"Ritik Sharma",
"Kavya Menon"
};
const int NUM = sizeof(uids) / sizeof(uids[0]);
// สถานะการเช็คชื่อ: 0=ขาด, 1=ตรงเวลา, 2=สาย
uint8_t attendance[NUM];
// ตัวแปรสำหรับเวลา
unsigned long startTime = 0;
bool windowStarted = false;
// ตัวช่วยสำหรับ debounce และการรีเฟรชหน้าจอ
String lastUID = "";
unsigned long lastUIDTime = 0;
unsigned long lastRefresh = 0;
void setup() {
Serial.begin(9600);
while (!Serial) { } // รอ Serial บนบางบอร์ด ไม่มีผลกับ UNO/R4
SPI.begin();
rfid.PCD_Init();
lcd.init();
lcd.backlight();
lcd.clear();
// ข้อความต้อนรับ
lcd.setCursor(0, 0);
lcd.print("Welcome to the");
lcd.setCursor(0, 1);
lcd.print("RFID attendance");
lcd.setCursor(0, 2);
lcd.print("system");
delay(2000);
// เริ่มช่วงเวลาเช็คชื่อ
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ready for attendance");
startTime = millis();
windowStarted = true;
// กำหนดให้ทุกคนขาดเรียนในตอนเริ่มต้น
for (int i = 0; i < NUM; i++) attendance[i] = 0;
// แสดงตัวนับเวลาเริ่มต้นทันที
updateTimerOnLCD();
Serial.println("Attendance started.");
}
void loop() {
unsigned long now = millis();
// อัปเดตตัวนับเวลาถอยหลังเป็นระยะ
if (now - lastRefresh >= REFRESH_MS) {
updateTimerOnLCD();
lastRefresh = now;
}
// ตรวจสอบว่ามีการสแกนบัตรใหม่หรือไม่
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
// สร้าง String ของ UID (HEX ตัวพิมพ์ใหญ่, ไม่มีช่องว่าง)
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) uid += "0";
uid += String(rfid.uid.uidByte[i], HEX);
}
uid.toUpperCase();
// การทำ debounce แบบง่าย: เพิกเฉยหากสแกนบัตรเดิมภายในเวลา DEBOUNCE ms
if (uid == lastUID && (now - lastUIDTime) < DEBOUNCE) {
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return;
}
lastUID = uid;
lastUIDTime = now;
Serial.print("Card scanned: ");
Serial.println(uid);
// บัตรครู -> แสดงสรุปของนักเรียนทุกคน
if (uid == String(TEACHER_UID)) {
showSummary();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
updateTimerOnLCD();
return;
}
// ค้นหาลำดับของนักเรียน
int idx = findIndex(uid.c_str());
if (idx < 0) {
// บัตรที่ไม่รู้จัก
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Unknown card:");
lcd.setCursor(0,1);
lcd.print(uid);
lcd.setCursor(0,3);
lcd.print("Not registered");
Serial.println("Unknown UID - not registered.");
delay(SHOW_MS);
updateTimerOnLCD();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return;
}
// หากเช็คชื่อไปแล้ว ให้แสดงสถานะอีกครั้ง
if (attendance[idx] != 0) {
showStudent(idx);
delay(SHOW_MS);
updateTimerOnLCD();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return;
}
// ตรวจสอบว่าสแกนภายในช่วงเวลาเช็คชื่อหรือไม่
bool onTime = windowStarted && ((now - startTime) <= ATTENDANCE_LENGTH);
if (onTime) attendance[idx] = 1; // ตรงเวลา
else attendance[idx] = 2; // สาย
// แสดงข้อมูลนักเรียน
showStudent(idx);
delay(SHOW_MS);
updateTimerOnLCD();
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
// ค้นหาลำดับของ uid ใน uids[]; คืนค่า -1 หากไม่พบ
int findIndex(const char* uid) {
for (int i = 0; i < NUM; i++) {
if (strcmp(uids[i], uid) == 0) return i;
}
return -1;
}
// แสดงหน้าจอพร้อมเช็คชื่อและเวลาที่เหลือ
void updateTimerOnLCD() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ready for attendance");
if (windowStarted) {
long elapsed = (long)(millis() - startTime);
long remaining = (long)ATTENDANCE_LENGTH - elapsed;
if (remaining > 0) {
unsigned long seconds = remaining / 1000UL;
unsigned int mins = seconds / 60UL;
unsigned int secs = seconds % 60UL;
lcd.setCursor(0,1);
// พิมพ์ "Time left: mm:ss" พร้อมเลขศูนย์นำหน้าสำหรับวินาที
lcd.print("Time left: ");
if (mins < 10) lcd.print('0');
lcd.print(mins);
lcd.print(':');
if (secs < 10) lcd.print('0');
lcd.print(secs);
} else {
lcd.setCursor(0,1);
lcd.print("Attendance closed");
}
} else {
lcd.setCursor(0,1);
lcd.print("Window not set");
}
// เคลียร์บรรทัดล่างเพื่อความสะอาดตา
lcd.setCursor(0,2); lcd.print(" ");
lcd.setCursor(0,3); lcd.print(" ");
}
// แสดงข้อมูลนักเรียนหนึ่งคนบน LCD
void showStudent(int i) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(names[i]); // ชื่อ
lcd.setCursor(0,1);
lcd.print("Present");
lcd.setCursor(0,2);
if (attendance[i] == 1) {
lcd.print("ON time");
Serial.print(names[i]); Serial.println(" -> ON time");
} else {
lcd.print("Came late");
Serial.print(names[i]); Serial.println(" -> Came late");
}
}
// แสดงสรุปทีละคนสำหรับครู (ชื่อ + มา/ขาด + ตรงเวลา/สาย)
void showSummary() {
for (int i = 0; i < NUM; i++) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(names[i]);
if (attendance[i] == 0) {
lcd.setCursor(0,1);
lcd.print("Absent");
Serial.print(names[i]); Serial.println(": Absent");
} else if (attendance[i] == 1) {
lcd.setCursor(0,1);
lcd.print("Present");
lcd.setCursor(0,2);
lcd.print("ON time");
Serial.print(names[i]); Serial.println(": Present (ON time)");
} else {
lcd.setCursor(0,1);
lcd.print("Present");
lcd.setCursor(0,2);
lcd.print("Late");
Serial.print(names[i]); Serial.println(": Present (Late)");
}
delay(2500); // หยุดรอ 2.5 วินาทีต่อคน
}
}
นักเรียนทุกคนจะได้รับ RFID tag ใน Code ให้ทำการอัปเดตชื่อและ UID ของพวกเขา
ระบบจะเริ่มตัวนับเวลา 10 นาทีทันทีที่เปิดเครื่อง ในช่วงเวลานี้ ให้สแกนบัตรเพื่อรับสถานะ "On Time" การสแกนหลังจากนั้นจะถูกติดสถานะว่าสายตามความเหมาะสม
หากต้องการดูสรุปการเช็คชื่อโดยละเอียดของนักเรียนทุกคนบนหน้าจอ LCD ให้ใช้บัตรของครูสแกน

แม้ว่าระบบเช็คชื่อ Arduino ของคุณจะทำงานได้อย่างสมบูรณ์แบบบน Breadboard แต่มันอาจจะดูไม่เป็นมืออาชีพเมื่อคุณนำไปแสดงในงานเดโม่สำหรับนักลงทุน งานแฟร์เทคโนโลยี หรือการแข่งขัน
การนำเสนอเป็นสิ่งสำคัญ และ JUSTWAY ช่วยคุณในเรื่องนี้ได้
JUSTWAY ช่วยให้คุณเปลี่ยนโปรเจกต์ DIY ของคุณให้กลายเป็นต้นแบบคุณภาพสูงที่ให้ความรู้สึกและรูปลักษณ์เหมือนผลิตภัณฑ์จริงที่พร้อมสำหรับตลาด
Rapid Prototyping
CNC Machining (Aluminum 6061 / Stainless Steel 304)
Sheet Metal Fabrication
Injection Molding
Urethane Casting
3D Printing (SLA & HPA-PA12)
Pro Tip: Resin แบบใสจะช่วยโชว์วงจรของคุณ ส่วนสีดำด้าน (Matte black) จะช่วยให้ดูทันสมัยและโฉบเฉี่ยว
เริ่มต้นด้วยการอัปโหลดไฟล์ STL หรือ STEP ของคุณ

เลือกจากพลาสติก เรซิน หรือโลหะ ขึ้นอยู่กับการออกแบบของคุณ

ตรวจสอบขนาดแบบ live เพื่อให้แน่ใจว่าพอดีก่อนการผลิตจริง

ราคาที่โปร่งใส จัดส่งรวดเร็ว และไม่มีค่าธรรมเนียมแอบแฝง

ระบบเช็คชื่อด้วย RFID บนพื้นฐานของ Arduino Uno R4 Wi-Fi เป็นการสาธิตที่ทรงพลังว่าระบบอัตโนมัติและ IoT สามารถทำให้งานบริหารจัดการในแต่ละวันง่ายขึ้นได้อย่างไร ด้วยการรวมเทคโนโลยี RFID, การแสดงผลผ่าน LCD และตรรกะตามเวลา ระบบนี้จะช่วยให้มั่นใจได้ถึงการเช็คชื่อที่แม่นยำและป้องกันการทุจริต ด้วย JUSTWAY คุณสามารถยกระดับโปรเจกต์นี้จากตัวต้นแบบไปสู่ผลิตภัณฑ์ระดับมืออาชีพที่ผสมผสานทั้งฟังก์ชันการทำงาน การออกแบบ และความทนทาน ไม่ว่าจะสำหรับโรงเรียน งานนิทรรศการ หรือสตาร์ทอัพ ระบบนี้คือประตูสู่การสร้างนวัตกรรมในโลกแห่งความเป็นจริงของคุณ
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย