I've placed 4 print commands, printing the numbers 1 through 4, at every point where the LED changes state.
The digitalWrite to turn on the LED upon scanning, where I placed the command to print "2", works as intended.
However, for the 2nd tap, depending on the duration between the 1st and 2nd taps, the numbers "1" and "3" are printed. "1" appears when the duration between both taps is more than 3 seconds. "3" appears when the duration is less than 3 seconds.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>
#define PN532_SCK (2)
#define PN532_MOSI (3)
#define PN532_SS (4)
#define PN532_MISO (5)
#define LED 13 // LED connected to pin 13
// Defining pins for I2C for shield
#define PN532_IRQ (2)
#define PN532_RESET (3) // Not connected by default on the NFC Shield
// For breakout/shield with I2C connection:
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
// Declaring last recorded time (previousMillis) and latest recorded time (currentMillis)
unsigned long previousMillis = 0;
unsigned long currentMillis = millis(); // millis() is a timer function
void setup(void) {
pinMode(LED, OUTPUT); // Declare the LED as an output
Serial.begin(115200); // Baud rate
while (!Serial) delay(10);
nfc.begin();
// Shield detection
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) { // If board not connected or wrong board
Serial.print("Didn't find PN53x board");
while (1); // halt
}
// If board connected
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);
// Configure board to read RFID tags
nfc.setPassiveActivationRetries(0x9A);
nfc.SAMConfig();
// Standby mode
Serial.println("Waiting for an ISO14443A Card ...");
}
void loop(void) {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
if ((digitalRead(LED) == 1) && (currentMillis - previousMillis >= 3000)) {
digitalWrite(LED, 0); // OR Off after 2 minutes
Serial.print("1");
}
// Wait for an ISO14443A type cards (Mifare, etc.). When one is found
// 'uid' will be populated with the UID, and uidLength will indicate
// if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
nfc.PrintHex(uid, uidLength); // Displays ID of card/tag
Serial.println("");
if (uidLength == 4) {
// Card ID
uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
currentMillis = millis(); // Defining current time. Timer starts here
// Turn LED on for 1st RFID key
if ((digitalRead(LED) == 0) && (uid[0] == 0x33) && (uid[1] == 0x06) && (uid[2] == 0x64) && (uid[3] == 0x97)) { // ID: 0x33 0x06 0x64 0x97
previousMillis = currentMillis;
digitalWrite(LED, 1); // Turn the LED on
Serial.print("2");
}
else if ((digitalRead(LED) == 1) && (currentMillis - previousMillis >= 1000) && (currentMillis - previousMillis < 3000) && (uid[0] == 0x33) && (uid[1] == 0x06) && (uid[2] == 0x64) && (uid[3] == 0x97)) {
digitalWrite(LED, 0); // Tap again within 2 minutes to off
Serial.print("3");
}
// Start with block 4 (the first block of sector 1) cos sector 0 contains manufacturer data
success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya);
if (success) {
uint8_t data[16];
// Reading the contents of block 4
success = nfc.mifareclassic_ReadDataBlock(4, data);
if (success)
{
delay(1000);
}
}
}
}
}