Main Functions -------------- #include #include NewSoftSerial rfid(2,3); //RX 2, TX 3 (from Arduino Perspective) int redLED = 4; int yellowLED = 5; int greenLED = 6; int lock = 13; int key1 = 7; int key2 = 8; int key3 = 9; int key4 = 10; int key5 = 11; int key6 = 12; int key7 = 14; int key8 = 15; int key9 = 16; int key0 = 17; int keya = 18; int keyb = 19; void setup() { Serial.begin(9600); rfid.begin(9600); initKeypad(); Serial.println("RFID Reader initialising"); createHead(); Serial.println("Please type 'menu' to enter the menu"); pinMode(lock, OUTPUT); pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(yellowLED, OUTPUT); digitalWrite(yellowLED, HIGH); } void loop() { checkRFID(); enterMenu(); } void openDoor() { digitalWrite(lock, HIGH); digitalWrite(greenLED, HIGH); Serial.println("Access Granted"); delay(3000); digitalWrite(lock, LOW); digitalWrite(greenLED, LOW); rfid.flush(); } void closeDoor() { digitalWrite(redLED, HIGH); Serial.println("Access Denied"); delay(1000); digitalWrite(redLED, LOW); rfid.flush(); } Database Functions ------------------ /* EXDB - Database functions based on the EXROM library Copyright(c) 2010 Tom "TBSliver" Bloor. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #define HEADER_P 0 #define HBYTE 250 #define EBYTE 251 #define MAXMEM 512 // Max memory allocated to the database //DO NOT TOUCH union Header { byte raw[3]; struct Data { byte hByte; int noTag; } data; } header; //END OF DO NOT TOUCH AREA union Entry { byte raw[19]; // must be the same size as the Data struct. //remember that ints are 2 bytes, floats, longs etc. are 4. struct Data { //Needed for functionality byte eByte; union EData { byte raw[18]; //must be same size as the PData Struct. struct PData { //Customize this bit! byte rfidTag[10]; int pinNo[4]; //End of custom area } pData; } eData; } data; } entry; union PData { byte raw[18]; //must be same size as the PData Struct. struct Data { //Customize this bit! byte rfidTag[10]; int pinNo[4]; //End of custom area } data; } pData; //Customize to print the data inside the PData struct. void printEData() { Serial.print(" Entry Data: "); Serial.print(" RFID No: "); for(int i=0;i<10;i++) Serial.print(entry.data.eData.pData.rfidTag[i]); Serial.print(" Pin No: "); for(int i=0;i<4;i++) Serial.print(entry.data.eData.pData.pinNo[i]); } /*----------------------------------------------------- DB -----------------------------------------------------*/ void printDB() { Serial.println("Printing DB"); readHead(); Serial.println(header.data.noTag); for(int i=0;i MAXMEM) { Serial.println("Database Full"); return false; } else { Serial.println("Entry already in Database"); return false; } } void delEntry(int entryID) { readHead(); byte eEntry[sizeof(entry.raw)]; for(int i=0;i -1) { iPin[count] = in; count++; for(int i=0;i 0) { count--; for(int i=0;i -1) { pData.data.pinNo[count] = in; count++; for(int i=0;i 0) { count--; for(int i=0;i 0) { delay(100); int serialNo = Serial.available(); for(int i=0; i < serialNo; i++) { menuInput[i] = Serial.read(); } menuInput[serialNo] = '\0'; Serial.flush(); } } void mainMenuOptions() { Serial.println("Welcome to the Menu"); Serial.println("Please choose an option"); Serial.println("-----------------------"); Serial.println("1. Open Door"); Serial.println("2. Print Tag Database"); Serial.println("3. Add RFID Tag to Database"); Serial.println("4. Remove RFID Tag from Database"); Serial.println("5. Re-print this Menu"); Serial.println("6. Exit Menu"); Serial.println(); } void mainMenu() { while(1) { byte serialIn = 0; if(Serial.available()) { serialIn = Serial.read(); Serial.flush(); } if(serialIn == 49) // 1 { openDoor(); } else if(serialIn == 50) // 2 { printDB(); } else if(serialIn == 51) // 3 { addRFID(); } else if(serialIn == 52) // 4 { delRFID(); } else if(serialIn == 53) // 5 { mainMenuOptions(); } else if(serialIn == 54) // 6 { Serial.println("Exiting Menu..."); digitalWrite(redLED, LOW); digitalWrite(greenLED, LOW); return; } else if(serialIn != 0) { Serial.println("That is not an option"); Serial.flush(); } } } Tag Functions ------------- union tagdata { byte tagin[16]; struct tag { byte stx; byte data[10]; byte cs[2]; byte cr; byte lf; byte etx; } tag; } tagdata; boolean readRFID() { if(rfid.available()) { delay(100); Serial.println("Reading RFID Tag"); for(int i=0; i < sizeof(tagdata.tagin); i++) { tagdata.tagin[i] = rfid.read(); } printRFID(); rfid.flush(); return 1; } else return 0; } void printRFID() { for(int i=0; i < sizeof(tagdata.tag.data);i++) { Serial.print(tagdata.tag.data[i]); } Serial.println(); } boolean checkRFID() { if(readRFID()) { int tagNo = findRFID(tagdata.tag.data); if(tagNo != -1) { Serial.println("Tag in Database"); readEntry(tagNo); if(getPin(entry.data.eData.pData.pinNo)) { openDoor(); return true; } else { Serial.println("Incorrect Pin. please scan card and try again"); closeDoor(); } } else { Serial.println("Tag not in Database"); closeDoor(); } } return false; } int findRFID(byte fTag[10]) { int flag = -1; readHead(); for(int i=0;i