diff --git a/Open_Access_Control/Open_Access_Control.pde b/Open_Access_Control/Open_Access_Control.pde index 19b6346..abb5fd9 100644 --- a/Open_Access_Control/Open_Access_Control.pde +++ b/Open_Access_Control/Open_Access_Control.pde @@ -28,7 +28,7 @@ * input device. * Outputs go to relays for door hardware/etc control. * - * Relay outpus on digital pins 6,7,8,9 + * Relay outputs on digital pins 6,7,8,9 * Reader 1: pins 2,3 * Ethernet: pins 10,11,12,13 (reserved for the Ethernet shield) * @@ -37,6 +37,10 @@ * */ +///////////////// +// Includes +///////////////// + #include // Needed for saving to non-voilatile memory on the Arduino. #include @@ -47,89 +51,22 @@ #include // Wiegand 26 reader format libary #include // Pcint.h implementation, allows for >2 software interupts. +// Create an instance of the various C++ libraries we are using. +WIEGAND26 wiegand26; // Wiegand26 (RFID reader serial protocol) library +PCATTACH pcattach; // Software interrupt library -/* Static user List - Implemented as an array for testing and access override - */ +///////////////// +// Global variables +///////////////// -#define DEBUG 2 // Set to 2 for display of raw tag numbers in log files, 1 for only denied, 0 for never. - -#define will 0xabcdef // Name and badge number in HEX. We are not using checksums or site ID, just the whole -#define jeremy 0xabcdef // output string from the reader. -#define jacob 0xabcdef -const long superUserList[] = { will, jeremy, jacob}; // Super user table (cannot be changed by software) - -#define PRIVPASSWORD 0x1234 // Console "priveleged mode" password - -#define DOORDELAY 5000 // How long to open door lock once access is granted. (2500 = 2.5s) -#define SENSORTHRESHOLD 100 // Analog sensor change that will trigger an alarm (0..255) - -#define EEPROM_ALARM 0 // EEPROM address to store alarm triggered state between reboots (0..511) -#define EEPROM_ALARMARMED 1 // EEPROM address to store alarm armed state between reboots -#define EEPROM_ALARMZONES 20 // Starting address to store "normal" analog values for alarm zone sensor reads. -#define KEYPADTIMEOUT 5000 // Timeout for pin pad entry. Users on keypads can enter commands after reader swipe. - -#define EEPROM_FIRSTUSER 24 -#define EEPROM_LASTUSER 1024 -#define NUMUSERS ((EEPROM_LASTUSER - EEPROM_FIRSTUSER)/5) //Define number of internal users (200 for UNO/Duemillanova) - - -#define DOORPIN1 relayPins[0] // Define the pin for electrified door 1 hardware -#define DOORPIN2 relayPins[2] // Define the pin for electrified door 2 hardware -#define ALARMSTROBEPIN relayPins[3] // Define the "non alarm: output pin. Can go to a strobe, small chime, etc -#define ALARMSIRENPIN relayPins[1] // Define the alarm siren pin. This should be a LOUD siren for alarm purposes. - -byte reader1Pins[]={2,3}; // Reader 1 connected to pins 4,5 -byte reader2Pins[]= {4,5}; // Reader2 connected to pins 6,7 - -//byte reader3Pins[]= {10,11}; // Reader3 connected to pins X,Y (Not implemented on v1.x and 2.x Access Control Board) - -const byte analogsensorPins[] = {0,1,2,3}; // Alarm Sensors connected to other analog pins +// pin assignments +byte reader1Pins[]={2,3}; // Reader 1 pins const byte relayPins[]= {6,7,8,9}; // Relay output pins -bool door1Locked=true; // Keeps track of whether the doors are supposed to be locked right now -bool door2Locked=true; - -unsigned long door1locktimer=0; // Keep track of when door is supposed to be relocked -unsigned long door2locktimer=0; // after access granted. - -boolean doorChime=false; // Keep track of when door chime last activated -boolean doorClosed=false; // Keep track of when door last closed for exit delay - -unsigned long alarmDelay=0; // Keep track of alarm delay. Used for "delayed activation" or level 2 alarm. -unsigned long alarmSirenTimer=0; // Keep track of how long alarm has gone off - - -unsigned long consolefailTimer=0; // Console password timer for failed logins -byte consoleFail=0; -#define numUsers (sizeof(superUserList)/sizeof(long)) //User access array size (used in later loops/etc) -#define NUMDOORS (sizeof(doorPin)/sizeof(byte)) -#define numAlarmPins (sizeof(analogsensorPins)/sizeof(byte)) - -//Other global variables -byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // Global RTC clock variables. Can be set using DS1307.getDate function. - -byte alarmActivated = EEPROM.read(EEPROM_ALARM); // Read the last alarm state as saved in eeprom. -byte alarmArmed = EEPROM.read(EEPROM_ALARMARMED); // Alarm level variable (0..5, 0==OFF) - -boolean sensor[4]={false}; // Keep track of tripped sensors, do not log again until reset. -unsigned long sensorDelay[2]={0}; // Same as above, but sets a timer for 2 of them. Useful for logging - // motion detector hits for "occupancy check" functions. - -// Enable up to 3 door access readers. -volatile long reader1 = 0; -volatile int reader1Count = 0; -volatile long reader2 = 0; -volatile int reader2Count = 0; -int userMask1=0; -int userMask2=0; -boolean keypadGranted=0; // Variable that is set for authenticated users to use keypad after login - -//volatile long reader3 = 0; // Uncomment if using a third reader. -//volatile int reader3Count = 0; - -unsigned long keypadTime = 0; // Timeout counter for reader with key pad -unsigned long keypadValue=0; - +// statics +#define RELAYDELAY 18000 // How long to open door lock once access is granted. (1000 = 1sec) +#define RELAYPIN1 relayPins[0] // Define the pin for electrified door 1 hardware +#define RELAYPIN2 relayPins[2] // Define the pin for electrified door 2 hardware // Serial terminal buffer (needs to be global) char inString[40]={0}; // Size of command buffer (<=128 for Arduino) @@ -147,105 +84,40 @@ byte server[] = { 10,1,1,1 }; // hsl-access // that you want to connect to (port 80 is default for HTTP): Client client(server, 80); -/* Create an instance of the various C++ libraries we are using. - */ - -DS1307 ds1307; // RTC Instance -WIEGAND26 wiegand26; // Wiegand26 (RFID reader serial protocol) library -PCATTACH pcattach; // Software interrupt library - -/* Set up some strings that will live in flash instead of memory. This saves our precious 2k of - * RAM for something else. -*/ - -const prog_uchar rebootMessage[] PROGMEM = {"Access Control System rebooted."}; - -const prog_uchar doorChimeMessage[] PROGMEM = {"Front Door opened."}; -const prog_uchar doorslockedMessage[] PROGMEM = {"All Doors relocked"}; -const prog_uchar alarmtrainMessage[] PROGMEM = {"Alarm Training performed."}; -const prog_uchar privsdeniedMessage[] PROGMEM = {"Access Denied. Priveleged mode is not enabled."}; -const prog_uchar privsenabledMessage[] PROGMEM = {"Priveleged mode enabled."}; -const prog_uchar privsdisabledMessage[] PROGMEM = {"Priveleged mode disabled."}; -const prog_uchar privsAttemptsMessage[] PROGMEM = {"Too many failed attempts. Try again later."}; - -const prog_uchar consolehelpMessage1[] PROGMEM = {"Valid commands are:"}; -const prog_uchar consolehelpMessage2[] PROGMEM = {"(d)ate, (s)show user, (m)odify user "}; -const prog_uchar consolehelpMessage3[] PROGMEM = {"(a)ll user dump,(r)emove_user ,(o)open door "}; -const prog_uchar consolehelpMessage4[] PROGMEM = {"(u)nlock all doors,(l)lock all doors"}; -const prog_uchar consolehelpMessage5[] PROGMEM = {"(1)disarm_alarm, (2)arm_alarm,(3)train_alarm (9)show_status"}; -const prog_uchar consolehelpMessage6[] PROGMEM = {"(e)nable - enable or disable priveleged mode"}; -const prog_uchar consoledefaultMessage[] PROGMEM = {"Invalid command. Press '?' for help."}; - -const prog_uchar statusMessage1[] PROGMEM = {"Alarm armed state (1=armed):"}; -const prog_uchar statusMessage2[] PROGMEM = {"Alarm siren state (1=activated):"}; -const prog_uchar statusMessage3[] PROGMEM = {"Front door open state (0=closed):"}; -const prog_uchar statusMessage4[] PROGMEM = {"Roll up door open state (0=closed):"}; -const prog_uchar statusMessage5[] PROGMEM = {"Door 1 unlocked state(1=locked):"}; -const prog_uchar statusMessage6[] PROGMEM = {"Door 2 unlocked state(1=locked):"}; - - // strings for storing results from web server String httpresponse = ""; String username = ""; + +// variables for storing system status +volatile long reader1 = 0; +volatile int reader1Count = 0; bool authorized = false; -bool relay1engaged = false; +bool relay1high = false; +bool relay2high = false; +unsigned long relay1timer=0; + void setup(){ // Runs once at Arduino boot-up - - Wire.begin(); // start Wire library as I2C-Bus Master - /* Attach pin change interrupt service routines from the Wiegand RFID readers */ pcattach.PCattachInterrupt(reader1Pins[0], callReader1Zero, CHANGE); pcattach.PCattachInterrupt(reader1Pins[1], callReader1One, CHANGE); - pcattach.PCattachInterrupt(reader2Pins[1], callReader2One, CHANGE); - pcattach.PCattachInterrupt(reader2Pins[0], callReader2Zero, CHANGE); //Clear and initialize readers wiegand26.initReaderOne(); //Set up Reader 1 and clear buffers. - wiegand26.initReaderTwo(); - //Initialize output relays - for(byte i=0; i<4; i++){ pinMode(relayPins[i], OUTPUT); digitalWrite(relayPins[i], LOW); // Sets the relay outputs to LOW (relays off) } - - ds1307.setDateDs1307(0,49,1,3,7,6,11); - /* Sets the date/time (needed once at commissioning) - - byte second, // 0-59 - byte minute, // 0-59 - byte hour, // 1-23 - byte dayOfWeek, // 1-7 - byte dayOfMonth, // 1-28/29/30/31 - byte month, // 1-12 - byte year); // 0-99 - */ - - - Serial.begin(57600); // Set up Serial output at 8,N,1,57600bps - - // start the Ethernet connection: Ethernet.begin(mac, ip); - // start the serial library: - //Serial.begin(9600); - // give the Ethernet shield a second to initialize: - //delay(1000); - - - -// hardwareTest(100); // IO Pin testing routing (use to check your inputs with hi/lo +(5-12V) sources) - // Also checks relays - } void loop() // Main branch, runs over and over again @@ -303,12 +175,13 @@ void loop() // Main branch, runs over and ov Serial.println(httpresponse); int c = httpresponse.indexOf('^'); - int d = httpresponse.indexOf('|'); + int d = httpresponse.indexOf('|'); int e = httpresponse.indexOf('$'); Serial.print("IndexOf:"); Serial.println(c); Serial.println(d); + Serial.println(e); Serial.println("SubStr:"); Serial.println(httpresponse.substring(c+1,d)); @@ -342,8 +215,38 @@ void loop() // Main branch, runs over and ov // Normal operation section ////////////////////////// - if(authorized) { - + // check timer -- if expired, remove authorization + long currentTime = millis() - relay1timer; + if(currentTime >= RELAYDELAY) { + authorized = false; + } + + long remaining = (RELAYDELAY - currentTime) / 1000; + long secRemaining = (RELAYDELAY - currentTime) / 1000 % 60; + long minRemaining = (RELAYDELAY - currentTime) / 1000 / 60 % 60; + long hrsRemaining = (RELAYDELAY - currentTime) / 1000 / 60 / 60; + + if(authorized && relay1high) { + // display timer & username + Serial.print(hrsRemaining); + Serial.print(":"); + Serial.print(minRemaining); + Serial.print(":"); + Serial.print(secRemaining); + Serial.print(" remaining, "); + Serial.println(username); + } + if(!authorized && relay1high) { + // not authorized -- turn off relay + relayLow(1); + } + if(authorized && !relay1high) { + // authorized -- turn on relay + relayHigh(1); + } + if(!authorized && !relay1high) { + // display login message + Serial.println("Please login."); } } // End of loop() @@ -355,46 +258,50 @@ void loop() // Main branch, runs over and ov These function control lock/unlock and user lookup. */ -int checkSuperuser(long input){ // Check to see if user is in the user list. If yes, return their index value. -int found=-1; - for(int i=0; i<=numUsers; i++){ - if(input == superUserList[i]){ +void relayHigh(int input) { //Send an unlock signal to the door and flash the Door LED - Serial.print("Superuser "); - Serial.print(i,DEC); - Serial.println(" found."); - found=i; - return found; - } - } - - return found; //If no, return -1 -} +relay1timer = millis(); - -void doorUnlock(int input) { //Send an unlock signal to the door and flash the Door LED byte dp=1; if(input == 1) { - dp=DOORPIN1; } - else(dp=DOORPIN2); + dp=RELAYPIN1; } + if(input == 2) { + dp=RELAYPIN2; } digitalWrite(dp, HIGH); - Serial.print("Door "); + + if (input == 1) { + relay1high = true; + } + if (input == 2) { + relay2high = true; + } + + Serial.print("Relay "); Serial.print(input,DEC); - Serial.println(" unlocked"); + Serial.println(" high"); } -void doorLock(int input) { //Send an unlock signal to the door and flash the Door LED +void relayLow(int input) { //Send an unlock signal to the door and flash the Door LED byte dp=1; if(input == 1) { - dp=DOORPIN1; } - else(dp=DOORPIN2); + dp=RELAYPIN1; } + if(input == 2) { + dp=RELAYPIN2; } digitalWrite(dp, LOW); - Serial.print("Door "); + + if (input == 1) { + relay1high = false; + } + if (input == 2) { + relay2high = false; + } + + Serial.print("Relay "); Serial.print(input,DEC); - Serial.println(" locked"); + Serial.println(" low"); }