mirror of
https://github.com/zyphlar/open-access-control-minimal-http.git
synced 2024-03-08 15:57:47 +00:00
Got timer working
This commit is contained in:
parent
a9f0b9c693
commit
9f046c0e93
|
@ -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 <EEPROM.h> // Needed for saving to non-voilatile memory on the Arduino.
|
||||
|
||||
#include <Ethernet.h>
|
||||
|
@ -47,89 +51,22 @@
|
|||
#include <WIEGAND26.h> // Wiegand 26 reader format libary
|
||||
#include <PCATTACH.h> // 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 <num> <usermask> <tagnumber>"};
|
||||
const prog_uchar consolehelpMessage3[] PROGMEM = {"(a)ll user dump,(r)emove_user <num>,(o)open door <num>"};
|
||||
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 <password> - 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");
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user