/* ======      Deklarasi Library MFRC522 beserta konstanta terkait    ===== */
#include <MFRC522.h> //Library MFRC522
#include <SPI.h>     //Library SPI
#define RST_PIN 9    //pin RST modul RFID terhubung ke pin 9 Arduino
#define SS_PIN 10    //pin SS modul RFID terhubung ke pin 10 Arduino
MFRC522 rfid(SS_PIN, RST_PIN); //Deklarasi nama objek 'rfid' 
/* =========    Deklarasi indikator Led hijau dan Led merah      ========== */
#define green_Led 2  //led hijau terhubung pada pin 2
#define red_Led   3  //led merah terhubung pada pin 3
//----------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);         //inisiasi komunikasi serial
  SPI.begin();                //inisiasi SPI bus
  rfid.PCD_Init();            //inisiasi modul MFRC522
  pinMode(green_Led, OUTPUT); //set pin 2 sebagai Output
  pinMode(red_Led,OUTPUT);    //set pin 3 sebagai Output
  Serial.println("Dekatkan Kartu Anda ke Reader");
}  
//----------------------------------------------------------------------------
void loop() {
  if(!rfid.PICC_IsNewCardPresent()) { //menunggu kartu didekatkan
    return; //jika kartu tidak dekat, maka lompat ke baris akhir (baris 50)
  }
  if(!rfid.PICC_ReadCardSerial()) {   //menunggu adanya data dari kartu
    return; //jika kartu tidak merespon, maka lompat ke baris akhir (baris 50)
  }
  String uid = "";            //variabel tipe string dibuat kosong
  Serial.print("UID = ");     //tulis "UID = " ke Serial Monitor
  for(int i=0;i<rfid.uid.size;i++) {  //loop sebanyak ukuran UID
    Serial.print(rfid.uid.uidByte[i]<0x10 ? "0" : ""); //jika data <10 tambahkan 0 didepan
    Serial.print(rfid.uid.uidByte[i],HEX);             //menampilkan 4 Byte UID
    uid.concat(String(rfid.uid.uidByte[i]<0x10 ? "0" : "")); //jika data <10 tambahkan 0 didepan
    uid.concat(String(rfid.uid.uidByte[i],HEX)); //susun UID dg langsung konversi ke String
  }
  uid.toUpperCase();      //konversi UID ke huruf besar 
  if(uid=="C2B2F52E") {  //Kode UID tersimpan pada sistem utk dibandingkan
    Serial.print(" : Akses diterima\n");
    digitalWrite(green_Led, HIGH);            //nyalakan Led hijau
    delay(2000); digitalWrite(green_Led,LOW); //matikan Led hijau
    rfid.PICC_HaltA();        //halt PICC
    //rfid.PCD_StopCrypto1();   //stop encryption on PCD
    return;      //lompat ke baris terakhir (baris 50)
  }
  else {
    Serial.print(" : Akses ditolak\n"); 
    Serial.println("Kartu Tidak dikenal...");
    digitalWrite(red_Led,HIGH);             //nyalakan Led merah
    delay(2000); digitalWrite(red_Led,LOW); //matikan Led merah
    rfid.PICC_HaltA();        //halt PICC
    //rfid.PCD_StopCrypto1();   //stop encryption on PCD
  }
}