/* ZoneMinder switch control box */ #define LED_GRN_ON "ledgrnon" #define LED_GRN_OFF "ledgrnoff" #define LED_RED_ON "ledredon" #define LED_RED_OFF "ledredoff" #define LED_PENDING "ledpending" #define SWITCH_STATUS "swstatus" #define SWITCH_PIN 2 #define GREEN_LED_PIN 3 #define RED_LED_PIN 4 String inputString = ""; boolean stringComplete = false; boolean greenLedOn = false; boolean redLedOn = false; boolean ledPendingState = true; // true so led's flash on boot of device long previousMillis = 0; // for flashing pending state long interval = 1000; // interval at which to blink (milliseconds) boolean fledState = false; void setup() { // initialize serial: Serial.begin(9600); // reserve 20 bytes for the inputString: inputString.reserve(20); pinMode(GREEN_LED_PIN, OUTPUT); pinMode(RED_LED_PIN, OUTPUT); pinMode(SWITCH_PIN, INPUT); } void loop() { if (stringComplete) { ledControlEvent(); inputString = ""; stringComplete = false; } if(ledPendingState == true){ // maintain led pending flashing state unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (fledState == LOW) fledState = HIGH; else fledState = LOW; // set the LED with the ledState of the variable: digitalWrite(GREEN_LED_PIN, fledState); digitalWrite(RED_LED_PIN, !fledState); } } } /* SerialEvent occurs whenever a new data comes in the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response. Multiple bytes of data may be available. */ void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); // add it to the inputString: inputString += inChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: if (inChar == '\n') { stringComplete = true; } } } void ledControlEvent(){ //Serial.println(inputString); echo back string, dont want this to happen for perlscript if (inputString.indexOf(LED_PENDING)!=-1){ ledPendingState = true; Serial.println("ledpendingon"); } if (inputString.indexOf(LED_GRN_ON)!=-1){ digitalWrite(GREEN_LED_PIN, HIGH); if(ledPendingState == true){ ledPendingState = false; digitalWrite(RED_LED_PIN, LOW); } Serial.println("greenon"); } if (inputString.indexOf(LED_GRN_OFF)!=-1){ ledPendingState = false; digitalWrite(GREEN_LED_PIN, LOW); Serial.println("greenoff"); } if (inputString.indexOf(LED_RED_ON)!=-1){ digitalWrite(RED_LED_PIN, HIGH); if(ledPendingState == true){ ledPendingState = false; digitalWrite(GREEN_LED_PIN, LOW); } Serial.println("redon"); } if (inputString.indexOf(LED_RED_OFF)!=-1){ ledPendingState = false; digitalWrite(RED_LED_PIN, LOW); Serial.println("redoff"); } if (inputString.indexOf(SWITCH_STATUS)!=-1){ if(digitalRead(SWITCH_PIN) == HIGH){ Serial.println("on"); }else{ Serial.println("off"); } } }