How to get the UID of RFID in Arduino?
Asked Answered
W

4

11

I have a RFID-RC522 (MF-RC522) module and I'm using Arduino sketch program. To use this RFID, I downloaded the Arduino MFRC522 library.

And I run the example code of library.

Here is the code.

/*
 * MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
 * The library file MFRC522.h has a wealth of useful info. Please read it.
 * The functions are documented in MFRC522.cpp.
 *
 * Based on code Dr.Leong   ( WWW.B2CQSHOP.COM )
 * Created by Miguel Balboa (circuitito.com), Jan, 2012.
 * Rewritten by Søren Thing Andersen (access.thing.dk), fall of 2013 (Translation to English, refactored, comments, anti collision, cascade levels.)
 * Released into the public domain.
 *
 * Sample program showing how to read data from a PICC using a MFRC522 reader on the Arduino SPI interface.
 *----------------------------------------------------------------------------- empty_skull 
 * Aggiunti pin per arduino Mega
 * add pin configuration for arduino mega
 * http://mac86project.altervista.org/
 ----------------------------------------------------------------------------- Nicola Coppola
 * Pin layout should be as follows:
 * Signal     Pin              Pin               Pin
 *            Arduino Uno      Arduino Mega      MFRC522 board
 * ------------------------------------------------------------
 * Reset      9                5                 RST
 * SPI SS     10               53                SDA
 * SPI MOSI   11               51                MOSI
 * SPI MISO   12               50                MISO
 * SPI SCK    13               52                SCK
 *
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

void setup() {
    Serial.begin(9600); // Initialize serial communications with the PC
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init(); // Init MFRC522 card
    Serial.println("Scan PICC to see UID and type...");
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card. PICC_HaltA() is automatically called.
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

When I run this code and put one of the card to RFID reader, a lot of information show on Serial monitor of Arduino IDE. Something like this... (I couldn't post the images)

//
Scan PICC to see UID and type...

Card UID : 84 90 6C A7

PICC type : MIFARE 1KB

Sector Block 0 1 2 3 4 5 6 7 ...

15     63   00 00 00 00 ...
//

But What I need is just the Card UID. This case is 84 90 6C A7.

Actually, I have project. I want to switch on LED if i put a certain Card of RFID. To do this, I need to read the Card UID and assign this to some variable on Arduino sketch program.

But I don't know how to get the UID of RFID tag in this case(This library and functions are complicated for me).

If anybody knows how to do this, please help me.

Witch answered 29/9, 2015 at 8:34 Comment(0)
W
9

This is untested code since I don't have an Arduino available right now. I hope it works.

Replace the DumpToSerial code in your example with something like this

if (mfrc522.uid.uidByte[0] == 0x84 && mfrc522.uid.uidByte[1] == 0x90 && mfrc522.uid.uidByte[2] == 0x6c && mfrc522.uid.uidByte[3] == 0xa7) { // turn your LED on }

Waxler answered 29/9, 2015 at 11:0 Comment(0)
G
16

Here is a function which returns the UID.

/**
 * mfrc522.PICC_IsNewCardPresent() should be checked before 
 * @return the card UID or 0 when an error occurred
 */
unsigned long getID(){
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
  }
  unsigned long hex_num;
  hex_num =  mfrc522.uid.uidByte[0] << 24;
  hex_num += mfrc522.uid.uidByte[1] << 16;
  hex_num += mfrc522.uid.uidByte[2] <<  8;
  hex_num += mfrc522.uid.uidByte[3];
  mfrc522.PICC_HaltA(); // Stop reading
  return hex_num;
}

Use it like this:

if(mfrc522.PICC_IsNewCardPresent()) {
  unsigned long uid = getID();
  if(uid !== 0){
    Serial.print("Card detected, UID: "); Serial.println(uid);
  }
}

Based on the answer by Thomas Matthews in a similar discussion.

Geyer answered 15/10, 2015 at 12:19 Comment(3)
I get this error on compile: warning: left shift count >= width of type hex_num = mfrc522.uid.uidByte[0] << 24Gamine
this is a very helpful answer! I'm not sure though if a negative integer (-1) can be returned in a function that declares its return type as unsigned long. I assume that -1 is never being returned, which makes the error check redundant. One possible option would be to use zero as error return. Another one to use long instead of unsigned long.Abraham
@Abraham good point! I changed the return value in my example to 0.Geyer
W
9

This is untested code since I don't have an Arduino available right now. I hope it works.

Replace the DumpToSerial code in your example with something like this

if (mfrc522.uid.uidByte[0] == 0x84 && mfrc522.uid.uidByte[1] == 0x90 && mfrc522.uid.uidByte[2] == 0x6c && mfrc522.uid.uidByte[3] == 0xa7) { // turn your LED on }

Waxler answered 29/9, 2015 at 11:0 Comment(0)
C
2

you can get it by doing that:

mfrc522.uid.uidByte

and it is a byte[10]

Compartment answered 12/12, 2016 at 12:18 Comment(0)
L
1

I found another way.

In the library MFRC522.cpp at line 1391

Serial.print(F("Card UID:"));

for (byte i = 0; i < uid->size; i++)

I made another function up of this function call: PICC_DumpDetailsToSerialUid(Uid *uid)

It looks like:

 //This is just for read UID!
 void MFRC522::PICC_DumpDetailsToSerialUid(Uid *uid){
    Serial.print(F("Card JUST UID :"));
    for (byte i = 0; i < uid->size; i++) {
        if(uid->uidByte[i] < 0x10)
            Serial.print(F(" 0"));
        else
            Serial.print(F(" "));
        Serial.print(uid->uidByte[i], HEX);
    } 
    Serial.println();
 }

You can put it every where you need, I just put it near big functions to know where is.

After you add that function you need to go in MFRC522.h library at line 409 and add

void PICC_DumpDetailsToSerialUid(Uid *uid);

After those two edits in that library you can call the function where you want.

Call it in Arduino with: mfrc522.PICC_DumpDetailsToSerialUid(&(mfrc522.uid)); and you have one function just for the uid.

You can do that with other functions if you need something else.... Good luck :)

Larios answered 26/4, 2018 at 18:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.