Paket Program Absensi RFID
1. 💾 Database (MySQL)
Anda harus membuat database bernama db_absensi dan dua tabel utama di dalamnya: karyawan dan log_absensi.
SQL
-- 1. Buat Database
CREATE DATABASE IF NOT EXISTS db_absensi;
USE db_absensi;
-- 2. Tabel Karyawan (Untuk mendaftarkan UID dan data personil)
CREATE TABLE karyawan (
id INT AUTO_INCREMENT PRIMARY KEY,
uid_rfid VARCHAR(20) NOT NULL UNIQUE, -- Contoh: 'A1 B2 C3 D4'
nama VARCHAR(100) NOT NULL,
nik VARCHAR(50) NOT NULL
);
-- Contoh Data Karyawan
INSERT INTO karyawan (uid_rfid, nama, nik) VALUES
('A1 B2 C3 D4', 'Budi Santoso', '2025001'),
('E5 F6 G7 H8', 'Citra Dewi', '2025002');
-- 3. Tabel Log Absensi (Untuk menyimpan catatan waktu absen)
CREATE TABLE log_absensi (
id INT AUTO_INCREMENT PRIMARY KEY,
uid_rfid VARCHAR(20) NOT NULL,
nama VARCHAR(100) NOT NULL, -- Kolom nama ditambahkan untuk kemudahan rekap
waktu_absen DATETIME NOT NULL,
status_absen VARCHAR(10) NOT NULL -- 'Masuk' atau 'Pulang'
);
💻 Kode Program ESP32 (Arduino IDE)
Ini adalah kode firmware yang diperbarui untuk ESP32. Pastikan Anda sudah menginstal library MFRC522 dan menyesuaikan detail koneksi Wi-Fi Anda.
#include <WiFi.h>
#include <HTTPClient.h>
#include <MFRC522.h>
#include <SPI.h>
// --- KONFIGURASI WIFI ---
const char* ssid = "NAMA_WIFI_ANDA";
const char* password = "PASSWORD_WIFI_ANDA";
// --- KONFIGURASI RFID (PINS) ---
#define RST_PIN 21
#define SS_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);
// --- KONFIGURASI SERVER WEB ---
// Ganti IP address sesuai IP lokal komputer/server Anda (misalnya 192.168.1.10)
const char* serverName = "http://192.168.1.10/absensi_rfid/simpan_absensi.php";
void setup() {
Serial.begin(115200);
SPI.begin();
mfrc522.PCD_Init();
Serial.println("\nRFID Reader siap.");
// Koneksi ke WiFi
Serial.print("Menghubungkan ke WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Terhubung!");
Serial.print("Alamat IP ESP32: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Cek kartu baru
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Pilih kartu dan dapatkan UID-nya
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
// Konversi UID ke format String (HEX dengan spasi pemisah)
String uidString = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
// Format agar selalu dua digit dengan spasi di tengah
if (mfrc522.uid.uidByte[i] < 0x10) {
uidString += "0";
}
uidString += String(mfrc522.uid.uidByte[i], HEX);
if (i < mfrc522.uid.size - 1) {
uidString += " ";
}
}
uidString.toUpperCase();
Serial.print("\nKartu Ditemukan! UID: ");
Serial.println(uidString);
// Kirim data ke Web Server (asumsi status awal selalu 'masuk')
// Anda bisa menambahkan logika 'masuk'/'pulang' di sini jika diperlukan
kirimDataAbsensi(uidString, "Masuk");
// Hentikan pembacaan kartu saat ini
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
delay(1500); // Tunggu sebentar
}
void kirimDataAbsensi(String uid, String status) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
// Siapkan data POST
String postData = "uid=" + uid + "&status=" + status;
http.begin(serverName);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
Serial.print("Mengirim data absensi...");
int httpResponseCode = http.POST(postData);
if (httpResponseCode > 0) {
Serial.print("Kode Respon: ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.print("Pesan Server: ");
Serial.println(response);
} else {
Serial.print("Gagal mengirim. Kode Respon: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi terputus!");
}
}
🌐 Skrip PHP (Aplikasi Web)
Buat folder di web server Anda (misalnya: C:\xampp\htdocs\absensi_rfid). Di dalam folder tersebut, buat dua file: simpan_absensi.php dan rekap_absensi.php.
A. File: simpan_absensi.php (Penerima Data dari ESP32)
Skrip ini menerima UID dari ESP32, mencari nama karyawan, dan mencatat log absensi.
<?php
// Konfigurasi Database
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "db_absensi";
// Buat Koneksi
$conn = new mysqli($servername, $username, $password, $dbname);
// Cek Koneksi
if ($conn->connect_error) {
http_response_code(500);
die("Koneksi gagal: " . $conn->connect_error);
}
// Cek data POST
if (isset($_POST['uid']) && isset($_POST['status'])) {
$uid_rfid = $conn->real_escape_string($_POST['uid']);
$status_absen = $conn->real_escape_string($_POST['status']);
// 1. Cari Nama Karyawan berdasarkan UID
$check_sql = "SELECT nama FROM karyawan WHERE uid_rfid = '$uid_rfid'";
$result = $conn->query($check_sql);
if ($result->num_rows > 0) {
// UID Ditemukan
$row = $result->fetch_assoc();
$nama_karyawan = $row['nama'];
// 2. Simpan Log Absensi
$log_sql = "INSERT INTO log_absensi (uid_rfid, nama, waktu_absen, status_absen)
VALUES ('$uid_rfid', '$nama_karyawan', NOW(), '$status_absen')";
if ($conn->query($log_sql) === TRUE) {
http_response_code(200);
echo "SUCCESS: Absensi $nama_karyawan dicatat.";
} else {
http_response_code(500);
echo "ERROR: Gagal menyimpan log: " . $conn->error;
}
} else {
// UID TIDAK DITEMUKAN
http_response_code(403); // Forbidden
echo "ERROR: Kartu tidak terdaftar. UID: $uid_rfid";
}
} else {
// Data POST tidak lengkap
http_response_code(400);
echo "ERROR: Data tidak lengkap.";
}
$conn->close();
?>
B. File: rekap_absensi.php (Tampilan Rekap Absensi)
Skrip ini menampilkan semua data absensi dalam bentuk tabel di browser.
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Rekap Absensi RFID ESP32</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h2 { color: #333; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; }
.masuk { color: green; font-weight: bold; }
.pulang { color: red; font-weight: bold; }
</style>
</head>
<body>
<h2>📝 Rekap Data Absensi Real-Time</h2>
<p>Data terbaru akan muncul secara otomatis setelah *tapping* kartu.</p>
<?php
// Konfigurasi Database (Sama seperti sebelumnya)
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "db_absensi";
// Buat Koneksi
$conn = new mysqli($servername, $username, $password, $dbname);
// Cek Koneksi
if ($conn->connect_error) {
die("Koneksi Database Gagal: " . $conn->connect_error);
}
// Ambil data absensi
$sql = "SELECT id, uid_rfid, nama, waktu_absen, status_absen FROM log_absensi ORDER BY waktu_absen DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<table>";
echo "<tr><th>No</th><th>UID RFID</th><th>Nama Karyawan</th><th>Waktu Absen</th><th>Status</th></tr>";
$no = 1;
// Tampilkan setiap baris data
while($row = $result->fetch_assoc()) {
$status_class = (strtolower($row["status_absen"]) == 'masuk') ? 'masuk' : 'pulang';
echo "<tr>";
echo "<td>" . $no++ . "</td>";
echo "<td>" . htmlspecialchars($row["uid_rfid"]) . "</td>";
echo "<td>" . htmlspecialchars($row["nama"]) . "</td>";
echo "<td>" . htmlspecialchars($row["waktu_absen"]) . "</td>";
echo "<td class='$status_class'>" . htmlspecialchars($row["status_absen"]) . "</td>";
echo "</tr>";
}
echo "</table>";
} else {
echo "<p>Belum ada data absensi yang tercatat.</p>";
}
$conn->close();
?>
</body>
</html>
Cara Menjalankan Sistem:
- Siapkan Server: Aktifkan Apache dan MySQL di XAMPP/WAMP/server Anda.
- Siapkan Database: Buat database db_absensi dan jalankan skrip SQL di atas (MySQL).
- Deploy PHP: Letakkan simpan_absensi.php dan rekap_absensi.php di folder web server Anda (misalnya absensi_rfid).
- Daftarkan Kartu: Tap kartu RFID Anda, catat UID yang muncul di Serial Monitor ESP32, lalu masukkan UID tersebut ke Tabel karyawan di MySQL.
- Upload Firmware: Sesuaikan ssid, password, dan serverName di kode ESP32, lalu upload ke board ESP32 Anda.
- Uji Coba: Tap kartu Anda ke modul RFID. Cek Serial Monitor untuk melihat respons success dari server.
- Cek Rekap: Buka browser dan akses alamat http://alamat_server_anda/absensi_rfid/rekap_absensi.php untuk melihat data absensi yang tercatat.
0 komentar
Posting Komentar