/* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to the correct LED pin independent of which board is used. If you want to know what pin the on-board LED is connected to on your Arduino model, check the Technical Specs of your board at: https://www.arduino.cc/en/Main/Products modified 8 May 2014 by Scott Fitzgerald modified 2 Sep 2016 by Arturo Guadalupi modified 8 Sep 2016 by Colby Newman This example code is in the public domain. http://www.arduino.cc/en/Tutorial/Blink */ #define RELAY1 2 #define RELAY2 3 #define RELAY3 4 #define RELAY4 5 unsigned int relay[4] = { RELAY1, RELAY2, RELAY3, RELAY4 }; #define BUTTON1 6 #define BUTTON2 7 #define BUTTON3 8 #define BUTTON4 9 unsigned int button[4] = { BUTTON1, BUTTON2, BUTTON3, BUTTON4 }; #define OPTO1 10 boolean relayState[4]; boolean buttonState[4]; boolean buttonLastState[4]; boolean buttonPressed[4]; boolean optoState; String inString; // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); pinMode(RELAY3, OUTPUT); pinMode(RELAY4, OUTPUT); pinMode(OPTO1, OUTPUT); pinMode(BUTTON1, INPUT_PULLUP); pinMode(BUTTON2, INPUT_PULLUP); pinMode(BUTTON3, INPUT_PULLUP); pinMode(BUTTON4, INPUT_PULLUP); digitalWrite(RELAY1, HIGH); digitalWrite(RELAY2, HIGH); digitalWrite(RELAY3, HIGH); digitalWrite(RELAY4, HIGH); digitalWrite(OPTO1, LOW); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } optoState = false; for (int i=0;i<4;i++){ buttonState[i] = digitalRead(button[i]); buttonLastState[i] = buttonState[i]; relayState[i] = false; } } // the loop function runs over and over again forever void loop() { for (int i=0;i<4;i++){ //generate the button states... //Button i press buttonState[i] = digitalRead(button[i]); if ((buttonState[i] != buttonLastState[i]) && (buttonState[i] == LOW)){ buttonPressed[i] = true; } else { buttonPressed[i] = false; } buttonLastState[i] = buttonState[i]; //invert relay if button i is pressed: if (buttonPressed[i]){ if (relayState[i] == false){ Serial.print("Command executed: RELAY");Serial.print(i+1);Serial.println("=ON"); digitalWrite(relay[i], LOW); relayState[i] = true; } else { Serial.print("Command executed: RELAY");Serial.print(i+1);Serial.println("=OFF"); digitalWrite(relay[i], HIGH); relayState[i] = false; } delay(250); } } //check for new command... if (Serial.available() > 0) { // get incoming byte: inString = Serial.readString(); Serial.print("Command executed: "); Serial.print(inString); if (inString.indexOf("LED=ON") >= 0){ digitalWrite(LED_BUILTIN, HIGH); } else if (inString.indexOf("LED=OFF") >= 0){ digitalWrite(LED_BUILTIN, LOW); } else if (inString.indexOf("RELAY1=ON") >= 0){ digitalWrite(RELAY1, LOW); relayState[0] = true; } else if (inString.indexOf("RELAY1=OFF") >= 0){ digitalWrite(RELAY1, HIGH); relayState[0] = false; } else if (inString.indexOf("RELAY2=ON") >= 0){ digitalWrite(RELAY2, LOW); relayState[1] = true; } else if (inString.indexOf("RELAY2=OFF") >= 0){ digitalWrite(RELAY2, HIGH); relayState[1] = false; } else if (inString.indexOf("RELAY3=ON") >= 0){ digitalWrite(RELAY3, LOW); relayState[2] = true; } else if (inString.indexOf("RELAY3=OFF") >= 0){ digitalWrite(RELAY3, HIGH); relayState[2] = false; } else if (inString.indexOf("RELAY4=ON") >= 0){ digitalWrite(RELAY4, LOW); relayState[3] = true; } else if (inString.indexOf("RELAY4=OFF") >= 0){ digitalWrite(RELAY4, HIGH); relayState[3] = false; } else if (inString.indexOf("OPTO1=ON") >= 0){ digitalWrite(OPTO1, HIGH); optoState = true; } else if (inString.indexOf("OPTO1=OFF") >= 0){ digitalWrite(OPTO1, LOW); optoState = false; } } }