# Mesin Absensi RFID Ganda — pemasangan

ESP32 melayani dua pembaca sekaligus: **RDM6300** untuk kartu 125 kHz
(EM4100, kartu tebal yang biasa dipakai sekolah) dan **RC522** untuk kartu
13,56 MHz (Mifare, kartu tipis, juga kartu ber-NFC).

Siswa tidak perlu tahu bedanya — tempel saja, mesin yang memilih pembacanya.

## Hal yang paling sering merusak modul

**RDM6300 jalan di 5V. RC522 jalan di 3,3V.**

Memberi RC522 tegangan 5V akan merusaknya, seringkali langsung. Ini kesalahan
paling umum karena keduanya terpasang berdampingan dan kabelnya mirip.

Sebelum menyalakan, periksa sekali lagi: kabel merah RC522 harus menuju pin
**3V3**, bukan VIN.

## Peta kabel

### RC522 — jalur SPI, semuanya 3,3V

| RC522 | ESP32 |
|---|---|
| SDA / SS | GPIO 5 |
| SCK | GPIO 18 |
| MOSI | GPIO 23 |
| MISO | GPIO 19 |
| RST | GPIO 27 |
| 3.3V | **3V3** |
| GND | GND |

Pin IRQ dibiarkan kosong.

### RDM6300 — jalur serial, 5V

| RDM6300 | ESP32 |
|---|---|
| TX (pin ujung P1) | GPIO 16, **lewat pembagi tegangan** |
| Vcc | VIN (5V) |
| GND | GND |
| ANT (P2, 2 pin) | koil, bebas terbalik |

Keluaran TX modul bertegangan 5V sedangkan pin ESP32 hanya tahan 3,3V.
Pasang pembagi tegangan:

```
TX modul ──┬── R 1kΩ ──┬── GPIO 16
           │           │
           │          R 2kΩ
           │           │
          ( )         GND
```

Menyambungkannya langsung sering terlihat berhasil, tetapi pin melemah
pelan-pelan dan gejalanya menyesatkan: kartu jadi terbaca kadang-kadang saja.

### LCD dan RTC — jalur I2C bersama

| Modul | ESP32 |
|---|---|
| SDA | GPIO 21 |
| SCL | GPIO 22 |
| VCC | VIN (5V) |
| GND | GND |

RTC boleh menumpang jalur LCD: satu jalur I2C memang dirancang untuk dipakai
beberapa alat sekaligus.

### Buzzer

Kaki panjang ke GPIO 4, kaki pendek ke GND. Pakai buzzer **aktif** — buzzer
pasif tidak berbunyi hanya dengan sinyal HIGH.

## Daftar pin terpakai

| GPIO | Untuk |
|---|---|
| 4 | buzzer |
| 5 | RC522 SS |
| 16 | RDM6300 TX (lewat pembagi tegangan) |
| 18, 19, 23 | SPI RC522 |
| 21, 22 | I2C LCD dan RTC |
| 27 | RC522 RST |

GPIO 2 dan 15 tersedia bila ingin memasang LED penanda; setel `PAKAI_LED`
menjadi `true`.

## Memakai satu pembaca saja

Sekolah yang hanya punya satu jenis kartu tidak perlu memasang keduanya.
Matikan yang tidak dipakai di bagian konfigurasi:

```cpp
const bool PAKAI_RDM6300 = true;
const bool PAKAI_RC522   = false;
```

Mematikannya penting, bukan sekadar merapikan: tanpa itu mesin akan
melaporkan pembaca yang memang tidak ada sebagai kerusakan pada pemeriksaan
awal, dan itu membingungkan orang yang memperbaikinya kelak.

## Mode mandiri — merakit dulu, server belakangan

Saat baru merakit, server belum perlu disentuh. Biarkan baris ini apa adanya:

```cpp
const bool MODE_MANDIRI = true;
```

Dalam mode ini mesin membaca kartu, menampilkan nomornya di layar, dan
mencetaknya di Serial Monitor. WiFi tidak dinyalakan sama sekali, jadi
`WIFI_SSID`, `SERVER_URL`, dan kunci perangkat boleh dibiarkan kosong.

Keluaran tiap kali kartu ditempel:

```
[RC522] A1B2C3D4  07:14:22
    ------------------------------------
    Nomor kartu : A1B2C3D4
    Pembaca     : RC522
    Salin nomor di atas ke menu Kartu Siswa
    ------------------------------------
```

Bentuknya sama persis dengan yang diminta menu Kartu Siswa, jadi tinggal
disalin — bukan diketik ulang, yang justru sumber kesalahan paling sering
saat mendaftarkan ratusan kartu sekaligus.

Mode ini juga berguna untuk dua hal lain:

- **Memastikan kartu terbaca** sebelum memesan dalam jumlah besar. Tempel
  satu kartu contoh, lihat nomornya keluar
- **Mencari kartu yang bermasalah** ketika nanti ada siswa yang kartunya
  sering gagal. Bawa mesin ke meja, setel mandiri, tempel kartunya

### Beralih ke mode penuh

Setelah mesin terpasang di gerbang dan sekolah siap memakai absensinya:

1. Daftarkan mesin di menu **Absensi → Mesin RFID**, salin kode dan kuncinya
2. Isi `WIFI_SSID`, `WIFI_PASS`, `SERVER_URL`, `DEVICE_KODE`, `DEVICE_KEY`
3. Ubah satu baris:

```cpp
const bool MODE_MANDIRI = false;
```

Tidak ada yang lain yang perlu diubah. Kabel, pin, dan seluruh isi firmware
tetap sama.

## Pemeriksaan otomatis saat menyala

Setiap kali dinyalakan, mesin memeriksa enam hal dan menampilkan hasilnya di
Serial Monitor (115200) serta di layar:

```
  LCD        [ OK   ]
  RTC        [ OK   ]
  RDM6300    [ OK   ]
  RC522      [ OK   ]
  WiFi       [ ---- ]  mode mandiri, server tidak dipakai
  Server     [ ---- ]  mode mandiri, server tidak dipakai
```

Dua baris terakhir menjadi `[ OK ]` setelah mode penuh dinyalakan.

Tanpa pemeriksaan ini, komponen yang kabelnya lepas hanya terlihat sebagai
"kartu tidak terbaca" — gejala yang sama dengan sepuluh penyebab lain.

### Membaca hasilnya

**RC522 TIDAK MENJAWAB (versi 0x00 atau 0xFF)** — tidak ada jawaban sama
sekali dari modul. Kabel SPI putus, atau modul sudah rusak karena pernah
diberi 5V. Versi chip yang wajar adalah 0x91 atau 0x92.

**LCD tidak terdeteksi** — hampir selalu karena VCC tersambung ke 3V3.
LCD tidak menyala pada 3,3V.

**RDM6300, 0 byte derau terbaca** — belum tentu rusak. Modul yang diam
memang tidak mengirim apa-apa. Tetapi bila nanti kartu tidak pernah terbaca,
pindahkan kabel TX ke pin sebelahnya: TX dan RX bersebelahan dan mudah
tertukar.

**Server kode 401 atau 403** — server hidup dan terjangkau, tetapi mesin
belum terdaftar. Daftarkan di menu Absensi → Mesin RFID, lalu salin kode dan
kuncinya ke bagian konfigurasi.

## Kartu yang terbaca

| Pembaca | Bentuk UID | Contoh |
|---|---|---|
| RDM6300 | desimal 10 digit | `0006168273` |
| RC522 | heks huruf besar | `A1B2C3D4` |

Keduanya dikirim persis seperti yang dihasilkan pembaca USB di meja tata
usaha, sehingga kartu yang didaftarkan lewat komputer langsung cocok di
gerbang tanpa penyesuaian apa pun.

Server menyamakan keduanya lewat fungsi `normalUid()`, jadi satu siswa boleh
saja memiliki kartu 125 kHz dan kartu Mifare sekaligus.

## Saat jaringan putus

Tap yang gagal terkirim disimpan di flash ESP32 beserta jam kejadiannya,
sampai 60 tap. Begitu jaringan pulih, seluruhnya dikirim otomatis dengan jam
aslinya — bukan jam saat pengiriman.

Layar menampilkan "Tersimpan — Jaringan putus" dan buzzer berbunyi dua kali
pendek, supaya siswa tahu tapnya tercatat dan tidak menempel berulang kali.

Antrean penuh membuang tap terlama, bukan menolak tap baru. Enam puluh tap
kira-kira cukup untuk satu jam masuk di sekolah menengah.

## Arti bunyi

| Bunyi | Arti |
|---|---|
| 1 bip | tercatat hadir atau pulang |
| 2 bip | tercatat terlambat |
| 2 bip pendek | jaringan putus, tap masuk antrean |
| 3 bip | kartu tidak dikenal atau ditolak server |
| 4 bip cepat saat menyala | tidak ada pembaca yang terdeteksi |

Untuk gerbang sekolah, buzzer lebih berguna daripada LED: siswa yang menempel
kartu sambil berjalan mendengar bunyinya tanpa perlu menoleh ke kotak mesin.
