Pembaca Kartu RFID RC522 ESP32 (dengan LCD)
Di proyek ini, kita menyambungkan modul RFID RC522 berbasis MFRC522 ke ESP32 lewat SPI dan membaca UID kartu/tag. Ini menjadi dasar untuk aplikasi seperti kunci pintu, sistem keanggotaan, dan kontrol akses. Kita menampilkan UID yang terbaca di layar LCD; versi ini tidak membandingkannya dengan daftar kartu yang diizinkan. PERINGATAN: RC522 hanya bekerja di 3.3V; memberinya 5V akan membakar modulnya!

Video
Skema rangkaian

Kode sumber
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Pembaca Kartu RFID RC522 ESP32 (dengan LCD)
4// ─────────────────────────────────────────
5// Membaca modul RFID RC522 lewat SPI; UID kartu yang dipindai ditampilkan
6// dalam HEX di LCD I2C 16x2 selama 3 s, lalu layar "scan a card" (pindai
7// kartu) kembali.
8//
9// Pin:
10// GPIO 5 -> SDA RC522 (SS)
11// GPIO 18 -> RC522 SCK, GPIO 19 -> RC522 MISO, GPIO 23 -> RC522 MOSI
12// GPIO 27 -> RST RC522
13// GPIO 21 -> SDA LCD, GPIO 22 -> SCL LCD
14// RC522 3.3V -> RC522 3.3V -> 3V3, IRQ dibiarkan tidak tersambung
15// LCD VCC -> LCD VCC -> 5V (VIN), semua GND disatukan
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19#include <SPI.h>
20#include <MFRC522.h>
21
22// Definisi pin
23const int RST_PIN = 27; // RST RC522
24const int SS_PIN = 5; // SDA RC522 (SS)
25
26// Pin SPI memakai default VSPI
27MFRC522 rfid(SS_PIN, RST_PIN);
28LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat LCD 0x27 atau 0x3F
29
30unsigned long lastScan = 0; // Waktu pindai terakhir (ms)
31const unsigned long DISPLAY_HOLD = 3000; // Lama tampilan UID (ms)
32bool showingCard = false; // Apakah ada UID di layar
33
34// Layar tunggu
35void showWaitMessage() {
36 lcd.clear();
37 lcd.setCursor(0, 0);
38 lcd.print("Kart okutun");
39 lcd.setCursor(0, 1);
40 lcd.print("Scan a card");
41}
42
43void setup() {
44 Wire.begin(21, 22); // I2C: SDA=21, SCL=22
45 lcd.init();
46 lcd.backlight();
47
48 // Layar pembuka 3 s
49 lcd.setCursor(3, 0);
50 lcd.print("BlueGrays");
51 lcd.setCursor(3, 1);
52 lcd.print("RFID v1.0");
53 delay(3000);
54
55 // Mulai SPI dan RC522
56 SPI.begin();
57 rfid.PCD_Init();
58 delay(50);
59
60 showWaitMessage();
61}
62
63void loop() {
64 // Ketika waktunya habis, kembali ke layar tunggu
65 if (showingCard && millis() - lastScan > DISPLAY_HOLD) {
66 showWaitMessage();
67 showingCard = false;
68 }
69
70 // Keluar jika tidak ada kartu baru atau kartu tidak bisa dibaca
71 if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
72 delay(50);
73 return;
74 }
75
76 // Cetak UID dalam HEX, misalnya 0A:1B:2C:3D
77 lcd.clear();
78 lcd.setCursor(0, 0);
79 lcd.print("Kart UID:");
80 lcd.setCursor(0, 1);
81 for (byte i = 0; i < rfid.uid.size; i++) {
82 if (rfid.uid.uidByte[i] < 0x10) lcd.print("0");
83 lcd.print(rfid.uid.uidByte[i], HEX);
84 // Tanpa pemisah untuk UID 7 byte: 14 karakter muat di baris
85 if (rfid.uid.size <= 5 && i < rfid.uid.size - 1) lcd.print(":");
86 }
87
88 lastScan = millis();
89 showingCard = true;
90
91 // Hentikan kartu dan matikan enkripsi
92 rfid.PICC_HaltA();
93 rfid.PCD_StopCrypto1();
94}
95
FAQ
Pin mana yang sebaiknya aku pakai untuk menyambungkan RC522 ke ESP32?
Yang dipakai adalah pin SPI bawaan ESP32: SCK = GPIO 18, MISO = GPIO 19, MOSI = GPIO 23. Pakai pin yang ditentukan di kode (mis. 5 dan 27) untuk SDA (SS) dan RST; tegangan catunya harus 3,3 V.
Apakah LCD dan RFID bekerja bersamaan?
Ya. Karena LCD memakai I2C (GPIO 21/22) dan RC522 memakai bus SPI, keduanya tidak saling mengganggu; dua bus komunikasi terpisah itu bekerja bersamaan.
Kenapa UID di sebagian kartu 4 byte dan di kartu lain 7 byte?
Kartu MIFARE Classic biasanya memakai UID 4 byte, sedangkan tag MIFARE Ultralight dan NTAG memakai UID 7 byte. Ketika membandingkan, kamu juga sebaiknya mengecek panjang UID-nya.
Bisakah aku menambahkan kartu yang diizinkan tanpa mengubah kode?
Bisa, kamu bisa menulis mode yang menambahkan kartu berikutnya ke daftar ketika "kartu admin" dipindai, dan menyimpan daftarnya ke penyimpanan permanen lewat Preferences.
