I am very much a novice with arduino and want to share my success with anyone thinking of a similar project with NFC.
I am building a card reader for my primary school classroom that records when students enter the room using their "smart cards", then a random good morning message is played using a wav shield also attached to the UNO.
After a LOT :0 of searching on the web, I actually found the code that works... almost!
//This example reads all MIFARE memory block from 0x00 to 0x63.
//It is tested with a new MIFARE 1K cards. Uses default keys for authenication.
//Contributed by Seeed Technology Inc (www.seeedstudio.com)
#include <PN532.h>
#include <SPI.h>
/*Chip select pin can be connected to D10 or D9 which is hareware optional*/
/*if you the version of NFC Shield from SeeedStudio is v2.0.*/
#define PN532_CS 10
PN532 nfc(PN532_CS);
#define NFC_DEMO_DEBUG 1
void setup(void) {
#ifdef NFC_DEMO_DEBUG
Serial.begin(9600);
Serial.println("Hello!");
#endif
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
Serial.print("Didn't find PN53x board");
#endif
while (1); // halt
}
#ifdef NFC_DEMO_DEBUG
// Got ok data, print it out!
Serial.print("Found chip PN5");
Serial.println((versiondata>>24) & 0xFF, HEX);
Serial.print("Firmware ver. ");
Serial.print((versiondata>>16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata>>8) & 0xFF, DEC);
Serial.print("Supports ");
Serial.println(versiondata & 0xFF, HEX);
#endif
// configure board to read RFID tags and cards
nfc.SAMConfig();
}
void loop(void) {
uint32_t id;
// look for MiFare type cards
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0)
{
#ifdef NFC_DEMO_DEBUG
Serial.print("Read card #");
Serial.println(id);
Serial.println();
#endif
uint8_t keys[]= { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };// default key of a fresh card
for(uint8_t blockn=0;blockn<64;blockn++)
{
if(nfc.authenticateBlock(1, id ,blockn,KEY_A,keys)) //authenticate block blockn
{
//if authentication successful
uint8_t block[16];
//read memory block blockn
if(nfc.readMemoryBlock(1,blockn,block))
{
#ifdef NFC_DEMO_DEBUG
//if read operation is successful
for(uint8_t i=0;i<16;i++)
{
//print memory block
Serial.print(block[i],HEX);
if(block[i] <= 0xF) //Data arrangement / beautify
{
Serial.print(" ");
}
else
{
Serial.print(" ");
}
}
Serial.print("| Block ");
if(blockn <= 9) //Data arrangement / beautify
{
Serial.print(" ");
}
Serial.print(blockn,DEC);
Serial.print(" | ");
if(blockn == 0)
{
Serial.println("Manufacturer Block");
}
else
{
if(((blockn + 1) % 4) == 0)
{
Serial.println("Sector Trailer");
}
else
{
Serial.println("Data Block");
}
}
#endif
}
}
}
}
delay(2000);
}
On the console a dec. id is printed out but it does not work with the "if" statements I am trying!
This is the console monitor printout:
Hello!
Found chip PN532
Firmware ver. 1.6
Supports 7
Found 1 tags
Sens Response: 0x4
Sel Response: 0x8
0x4A 0x3 0xD5 0xD6Read card #1241765334
A little tweaking of code is required - of the card's decimal ID (1241765334) to enable an if/else statement to work. Here is the MIfare code THAT I HAVE WRITTEN onto line 56:
//This changes the crazy id into an integer that actually works
int x;
x = id;
Serial.print("New card id # is");
Serial.println(x);
The serial monitor now says
Hello!
Found chip PN532
Firmware ver. 1.6
Supports 7
Found 1 tags
Sens Response: 0x4
Sel Response: 0x8
0x4A 0x3 0xD5 0xD6Read card #1241765334
New card id # is-10794
Now that you have that new id (-10794), it works with if statements, like say good morning to a particular student whereas I could not get anything to happen with the old id (1241765334).
If anyone can tell me what is happening here I would appreciate your comments.