#include // settings #define RESET_ENABLED 1 #define RESET_TIME 1000 #define RFID_REMOVED_TIME 1500 #define RFID_TAG_LENGTH 5 // 5 Bytes #define RFID_TAG_INPUT 12 // DATA (10 ASCII) + CHECK SUM (2 ASCII) // digital pins #define RESET_PIN 4 #define RFID_RX 5 #define RFID_TX 6 // not used #define RESET_LED_PIN 13 // connection to computer established boolean connected = false; // software serial connection for rfid reader AFSoftSerial rfidSerial = AFSoftSerial(RFID_RX, RFID_TX); // millis of last Reset unsigned int nowReset = 0; // millis of last seen rfid tag unsigned int nowLastRfid = 0; // reader is in reset state boolean rfidEnabled = false; // boolean rfidTagSeen = false; // last seen tag byte rfidTagCurrent[RFID_TAG_LENGTH]; // temp tag byte rfidTagTemp[6]; void setup() { // connect to the serial port Serial.begin(9600); // rfidSerial.begin(9600); // clear current tag clearTag(rfidTagCurrent, RFID_TAG_LENGTH); // RFID reset pins pinMode(RESET_PIN, OUTPUT); pinMode(RESET_LED_PIN, OUTPUT); } void loop () { byte action = 0; unsigned int now = millis(); updateID12(false); // connection to computer established if(connected == true) { clearTag(rfidTagTemp, 6); // serial connection with rfid reader if (rfidSerial.available()) { // wait for the next STX byte while(rfidSerial.available() && action != 0x02) action = rfidSerial.read(); // STX byte found -> RFID tag available if(action == 0x02) { if(readID12(rfidTagTemp)) { nowLastRfid = millis(); rfidTagSeen = true; updateCurrentRfidTag(rfidTagTemp); } } } else if(rfidEnabled && rfidTagSeen == true && (now - nowLastRfid) >= RFID_REMOVED_TIME) { rfidTagSeen = false; updateCurrentRfidTag(rfidTagTemp); } } // serial connection with computer while (Serial.available() > 0) { // read action byte action = Serial.read(); switch (action) { // PING case 0x01: Serial.print(0x01, BYTE); // (C)ONNECT case 0x43: // clear serial while(rfidSerial.available()) rfidSerial.read(); connected = true; break; // (D)ISCONNECT case 0x44: connected = false; break; } } // delay 100 milliseconds delay(100); } /** * print actual tag number to serial */ void updateCurrentRfidTag(byte *tagNew) { // only print changed value if(!equals(tagNew, rfidTagCurrent)) { saveTag(tagNew, rfidTagCurrent); byte i = 0; // STX Serial.print(0x02, BYTE); for (i=0; i<5; i++) { if (rfidTagCurrent[i] < 16) Serial.print("0"); Serial.print(rfidTagCurrent[i], HEX); } // ETX Serial.print(0x03, BYTE); } } /** * read data from rfid reader * @return rfid tag number * * Based on code by BARRAGAN, HC Gilje, djmatic, Martijn * http://www.arduino.cc/playground/Code/ID12 */ boolean readID12(byte *code) { boolean result = false; byte val = 0; byte bytesIn = 0; byte tempbyte = 0; byte checksum = 0; // read 10 digit code + 2 digit checksum while (bytesIn < RFID_TAG_INPUT) { if( rfidSerial.available() > 0) { val = rfidSerial.read(); // if CR, LF, ETX or STX before the 10 digit reading -> stop reading if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) break; // Do Ascii/Hex conversion: if ((val >= '0') && (val <= '9')) val = val - '0'; else if ((val >= 'A') && (val <= 'F')) val = 10 + val - 'A'; // Every two hex-digits, add byte to code: if (bytesIn & 1 == 1) { // make some space for this hex-digit by // shifting the previous hex-digit with 4 bits to the left: code[bytesIn >> 1] = (val | (tempbyte << 4)); // If we're at the checksum byte, Calculate the checksum... (XOR) if (bytesIn >> 1 != RFID_TAG_LENGTH) checksum ^= code[bytesIn >> 1]; } else { // Store the first hex digit first... tempbyte = val; } // ready to read next digit bytesIn++; } } // read complete if (bytesIn == RFID_TAG_INPUT) { // valid tag if(code[5] == checksum) result = true; } // reset id-12 updateID12(true); return result; } /** * update reset state of the rfid reader */ void updateID12(boolean reset_) { // reset is disabled if(RESET_ENABLED == 0 && rfidEnabled == true) return; // don't reset, just check if the id-12 should be enabled again if(reset_ == false) { // current time unsigned int now = millis(); // id-12 is disabled and ( reset period is over or initial id-12 startup ) if (rfidEnabled == false && ((now - nowReset) >= RESET_TIME || nowReset == 0)) { digitalWrite(RESET_LED_PIN, LOW); digitalWrite(RESET_PIN, HIGH); rfidEnabled = true; } } // reset rfid reader else { digitalWrite(RESET_LED_PIN, HIGH); digitalWrite(RESET_PIN, LOW); nowReset = millis(); rfidEnabled = false; } } /** * clear rfid tags */ void clearTag(byte *arr, byte len) { byte i; for (i=0; i < len ;i++) arr[i] = 0; } /** * save rfid tag */ void saveTag(byte *tagIn, byte *tagOut) { byte i; for (i=0; i < RFID_TAG_LENGTH ;i++) tagOut[i] = tagIn[i]; } /** * compare 2 rfid tags */ boolean equals(byte *tag1, byte *tag2) { boolean result = false; byte j; for (j=0; j < RFID_TAG_LENGTH ;j++) { if(tag1[j] != tag2[j]) break; else if (j == RFID_TAG_LENGTH-1) result = true; } return result; }