Skip to content

Instantly share code, notes, and snippets.

@jinks
Last active March 21, 2017 06:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jinks/91765c8e998a22b87f1fd72894b7912e to your computer and use it in GitHub Desktop.
Save jinks/91765c8e998a22b87f1fd72894b7912e to your computer and use it in GitHub Desktop.
/*
Controling 2 Vista 128BPT alarm panels from a single keyswitch input device. And controlling the LEDs that are attached to said device.
*/
// Pins
enum {
// Outputs
P1Out = 4,
P2Out = 5,
GreenLED = 6,
RedLED = 7,
// Inputs
P1Armed = 8,
P1Ready = 9,
P2Armed = 10,
P2Ready = 11,
Button = 2
};
//Set state variables
int state = 0;
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
//Action when keysiwtch is activated:
void key(){
// the following variables are unsigned long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time < 200) { return; }
switch (state) {
case 1:
digitalWrite(P1Out, LOW); digitalWrite(P2Out, LOW);
break;
case 2:
digitalWrite(P1Out, LOW); digitalWrite(P2Out, HIGH);
break;
case 3:
case 4:
case 5:
case 6:
digitalWrite(P1Out, HIGH); digitalWrite(P2Out, HIGH);
break;
case 7:
case 8:
digitalWrite(P1Out, HIGH); digitalWrite(P2Out, LOW);
break;
case 9:
digitalWrite(P1Out, HIGH); digitalWrite(P2Out, HIGH);
break;
case 10:
digitalWrite(P1Out, LOW); digitalWrite(P2Out, HIGH);
break;
case 11:
case 12:
case 13:
digitalWrite(P1Out, HIGH); digitalWrite(P2Out, HIGH);
break;
case 14:
digitalWrite(P1Out, LOW); digitalWrite(P2Out, HIGH);
break;
case 15:
case 16:
digitalWrite(P1Out, HIGH); digitalWrite(P2Out, HIGH);
break;
}
last_interrupt_time = interrupt_time;
}
void setup() {
// Initialize Pins:
pinMode(P1Out, OUTPUT); //Panel 1 Output
pinMode(P2Out, OUTPUT); //Panel 2 Output
pinMode(GreenLED, OUTPUT); //Green LED Output
pinMode(RedLED, OUTPUT); //Red LED Output
pinMode(P1Armed, INPUT); //Panel 1 Armed
pinMode(P1Ready, INPUT); //Panel 1 Ready
pinMode(P2Armed, INPUT); //Panel 2 Armed
pinMode(P2Ready, INPUT); //Panel 2 Ready
pinMode(Button, INPUT); //KeySwitch Input
//Set up Interupt:
attachInterrupt(digitalPinToInterrupt(Button), key, RISING);
//Serial Debug Initalization:
Serial.begin(115200);
}
#define DEBUG
# ifdef DEBUG
void debug(String gled, String rled, int keyState, int pn1Armed, int pn1Ready, int pn2Armed, int pn2Ready) {
//Print states to Debug:
Serial.print("KeyState: "); Serial.print(keyState);
Serial.print(" - State: "); Serial.println(state);
Serial.print("Panel 1 Armed: "); Serial.print(pn1Armed);
Serial.print(" Panel 1 Ready: "); Serial.println(pn1Ready);
Serial.print("Panel 2 Armed: "); Serial.print(pn2Armed);
Serial.print(" Panel 2 Ready: "); Serial.println(pn2Ready);
Serial.println("LEDs - Green: " + gled + " - Red: " + rled + "\n");
}
#else
#define debug(...) /**/
#endif
void loop() {
// Read the input states:
int keyState = digitalRead(Button);
int pn1Armed = digitalRead(P1Armed);
int pn1Ready = digitalRead(P1Ready);
int pn2Armed = digitalRead(P2Armed);
int pn2Ready = digitalRead(P2Ready);
//Output Controls:
//State 1
if (pn1Ready == 0 && pn1Armed == 0 && pn2Ready == 0 && pn2Armed == 0){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, LOW);
state = 1;
debug("OFF","OFF", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 2
else if(pn1Ready == 0 && pn1Armed == 0 && pn2Ready == 0 && pn2Armed == 1){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 2;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 3
else if(pn1Ready == 0 && pn1Armed == 0 && pn2Ready == 1 && pn2Armed == 0){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 3;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 4
else if(pn1Ready == 0 && pn1Armed == 0 && pn2Ready == 1 && pn2Armed == 1){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 4;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 5
else if(pn1Ready == 0 && pn1Armed == 1 && pn2Ready == 0 && pn2Armed == 0){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 5;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 6
else if(pn1Ready == 0 && pn1Armed == 1 && pn2Ready == 0 && pn2Armed == 1){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 6;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 7
else if(pn1Ready == 0 && pn1Armed == 1 && pn2Ready == 1 && pn2Armed == 0){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 7;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 8
else if(pn1Ready == 0 && pn1Armed == 1 && pn2Ready == 1 && pn2Armed == 1){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 8;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 9
else if(pn1Ready == 1 && pn1Armed == 0 && pn2Ready == 0 && pn2Armed == 0){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 9;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 10
else if(pn1Ready == 1 && pn1Armed == 0 && pn2Ready == 0 && pn2Armed == 1){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 10;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 11
else if(pn1Ready == 1 && pn1Armed == 0 && pn2Ready == 1 && pn2Armed == 0){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, LOW);
state = 11;
debug("ON","OFF", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 12
else if(pn1Ready == 1 && pn1Armed == 0 && pn2Ready == 1 && pn2Armed == 1){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 12;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 13
else if(pn1Ready == 1 && pn1Armed == 1 && pn2Ready == 0 && pn2Armed == 0){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 13;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 14
else if(pn1Ready == 1 && pn1Armed == 1 && pn2Ready == 0 && pn2Armed == 1){
digitalWrite(GreenLED, LOW); digitalWrite(RedLED, HIGH);
state = 14;
debug("OFF","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 15
else if(pn1Ready == 1 && pn1Armed == 1 && pn2Ready == 1 && pn2Armed == 0){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 15;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//State 16
else if(pn1Ready == 1 && pn1Armed == 1 && pn2Ready == 1 && pn2Armed == 1){
digitalWrite(GreenLED, HIGH); digitalWrite(RedLED, HIGH);
state = 16;
debug("ON","ON", keyState, pn1Armed, pn1Ready, pn2Armed, pn2Ready);
}
//Delay between cycles for stability
delay(1000);
//Reset panel outputs
digitalWrite(P1Out, LOW);
digitalWrite(P2Out, LOW);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment