Selasa, 02 Desember 2025

Program Absensi RFID

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:

  1. Siapkan Server: Aktifkan Apache dan MySQL di XAMPP/WAMP/server Anda.
  2. Siapkan Database: Buat database db_absensi dan jalankan skrip SQL di atas (MySQL).
  3. Deploy PHP: Letakkan simpan_absensi.php dan rekap_absensi.php di folder web server Anda (misalnya absensi_rfid).
  4. Daftarkan Kartu: Tap kartu RFID Anda, catat UID yang muncul di Serial Monitor ESP32, lalu masukkan UID tersebut ke Tabel karyawan di MySQL.
  5. Upload Firmware: Sesuaikan ssid, password, dan serverName di kode ESP32, lalu upload ke board ESP32 Anda.
  6. Uji Coba: Tap kartu Anda ke modul RFID. Cek Serial Monitor untuk melihat respons success dari server.
  7. 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