RFID RC522 test

13.56MHz RFID reader RC522 with optional LCD 16×02 (1602) module and dual color diode connected.

Basic setup with just UNO and reader connected – see below. The code for such case with reading tags and using Serial output could be located in AddicoreRFID library.

przywieszki2

 

Fritzing schematics (compared to real picture below, I skipped quite obvious connection of dual color diode to GND and digital pins 8 and 9 with 220R resistors) of full set with LCD 1602 display connected:

RFID-RC522-LCD2x16_bbRC522

Note the connection – especially power to the RFID – it is 3v3 (3.3V) – red wire on the picture. Connecting 5V could demage the circuit!

The code uses two non-standard libraries: AddicoreRFID library http://www.addicore.com/v/vspfiles/downloadables/Product%20Downloadables/RFID_RC522/AddicoreRFID.zip and LiquidCrystal_I2C library https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/LiquidCrystal_V1.2.1.zip

// Example sketch to read the ID from an Addicore 13.56MHz RFID tag
// as found in the RFID AddiKit found at: 
// http://www.addicore.com/v/vspfiles/downloadables/Product%20Downloadables/RFID_RC522/RFIDQuickStartGuide.pdf

#include <AddicoreRFID.h>
#include <SPI.h>
//LCD libraries + initialization
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

//RFID types
#define    uchar    unsigned char
#define    uint    unsigned int

//added LED on arduino pins 8 and 9
#define REDPIN 8
#define GREENPIN 9
int REDON; // bistable diodes 
int GREENON;

//lcd identification
long counterB =0;
long counterC =0;
String ID ="";
long podtrzymanie =0;

//4 bytes tag serial number, the first 5 bytes for the checksum byte
uchar serNumA[5];

uchar fifobytes;
uchar fifoValue;

AddicoreRFID myRFID; // create AddicoreRFID object to control the RFID module

/////////////////////////////////////////////////////////////////////
//set the pins
/////////////////////////////////////////////////////////////////////
const int chipSelectPin = 10;
const int NRSTPD = 5;

//Maximum length of the array
#define MAX_LEN 16

void setup() {                
   Serial.begin(9600);                        // RFID reader SOUT pin connected to Serial RX pin at 9600bps 
 
  // start the SPI library:
  SPI.begin();
  
  pinMode(chipSelectPin,OUTPUT);              // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin 
    digitalWrite(chipSelectPin, LOW);         // Activate the RFID reader
  pinMode(NRSTPD,OUTPUT);                     // Set digital pin 10 , Not Reset and Power-down
    digitalWrite(NRSTPD, HIGH);
  myRFID.AddicoreRFID_Init();  

//diodes section
  pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  REDON = HIGH;
  GREENON = HIGH;
  digitalWrite(REDPIN,REDON);
  digitalWrite(GREENPIN,GREENON);

//LCD section
 lcd.init();                      // initialize the lcd 
 lcd.backlight();
lcd.clear(); 
lcd.setCursor(0,0); 
lcd.print("... GOTOWY ! ...");
  
}

void loop()
{
      uchar i, tmp, checksum1;
    uchar status;
        uchar str[MAX_LEN];
        uchar RC_size;
        uchar blockAddr;    //Selection operation block address 0 to 63
        String mynum = "";

        str[1] = 0x4400;
    //Find tags, return tag type
    status = myRFID.AddicoreRFID_Request(PICC_REQIDL, str);    
    if (status == MI_OK)
    {
            Serial.println("RFID tag detected");
            Serial.print(str[0],BIN);
            Serial.print(" , ");
            Serial.print(str[1],BIN);
            Serial.println(" ");
            podtrzymanie = 50;
    }
  else
  {
     if (podtrzymanie>0) 
       {podtrzymanie--;}
     else
       {    
            lcd.setCursor(0,0); 
            lcd.print("... GOTOWY ! ...");
       }     
  }
     //Anti-collision, return tag serial number 4 bytes
    status = myRFID.AddicoreRFID_Anticoll(str);
    if (status == MI_OK)
    {
            checksum1 = str[0] ^ str[1] ^ str[2] ^ str[3];
            Serial.println("The tag's number is  : ");
            //Serial.print(2);
            Serial.print(str[0]);
            Serial.print(" , ");
            Serial.print(str[1],BIN);
            Serial.print(" , ");
            Serial.print(str[2],BIN);
            Serial.print(" , ");
            Serial.print(str[3],BIN);
            Serial.print(" , ");
            Serial.print(str[4],BIN);
            Serial.print(" , ");
            Serial.println(checksum1,BIN);
            ID = String(str[0]);
            // Should really check all pairs, but for now we'll just use the first
            if(str[0] == 196)                      //You can change this to the first byte of your tag by finding the card's ID through the Serial Monitor
            {
                ID = "Brelok";
                counterB ++;
                if (GREENON == HIGH) 
                 { GREENON=LOW; } 
                else 
                 { GREENON=HIGH; }
                digitalWrite(GREENPIN,GREENON);
                Serial.println("Button is pretty close!");
            } else if(str[0] == 3) {             //You can change this to the first byte of your tag by finding the card's ID through the Serial Monitor
                ID = "Karta";
                counterC ++;
                if (REDON==HIGH) {REDON=LOW;} else {REDON=HIGH;}
                digitalWrite(REDPIN,REDON);
                Serial.println("Card recognized!");
            }
            else {
              Serial.print("Token no: ");
              Serial.println(str[0],DEC);
            }
            Serial.println();

            lcd.clear(); 
            lcd.setCursor(0,0); 
            lcd.print("Zblizono: ");
            lcd.print(ID);
            lcd.setCursor(0,1); 
            lcd.print("Suma K ");
            lcd.print(counterC,DEC);
            lcd.print(" B ");
            lcd.print(counterB,DEC);
            
            delay(1000); 
    }  
        
        myRFID.AddicoreRFID_Halt();           //Command tag into hibernation              

}

Leave a Reply