bool isPinRunning = false; int runningPin = 0; int liquidA_Pin = 4; int liquidB_Pin = 5; int liquidC_Pin = 6; int liquidD_Pin = 7; int buttonStartCycleAB_Pin = 8; int buttonStartCycleCD_Pin = 9; int buttonFillA_Pin = 10; int buttonFillB_Pin = 11; int buttonFillC_Pin = 12; int buttonFillD_Pin = 13; int tankATime = 1000; int tankBTime = 1000; int tankCTime = 1000; int tankDTime = 1000; // LED Pins //#define BLUE 2 #define GREEN 2 #define RED 3 void setup() { // INIT BUTTONS pinMode(buttonStartCycleAB_Pin, INPUT_PULLUP); pinMode(buttonStartCycleCD_Pin, INPUT_PULLUP); pinMode(buttonFillA_Pin, INPUT_PULLUP); pinMode(buttonFillB_Pin, INPUT_PULLUP); pinMode(buttonFillC_Pin, INPUT_PULLUP); pinMode(buttonFillD_Pin, INPUT_PULLUP); // INIT LIQUID pinMode(liquidA_Pin, OUTPUT); pinMode(liquidB_Pin, OUTPUT); pinMode(liquidC_Pin, OUTPUT); pinMode(liquidD_Pin, OUTPUT); // Set pin To LOW (not activated) digitalWrite(liquidA_Pin, LOW); digitalWrite(liquidB_Pin, LOW); digitalWrite(liquidC_Pin, LOW); digitalWrite(liquidD_Pin, LOW); // INIT LED pinMode(RED, OUTPUT); pinMode(GREEN, OUTPUT); //pinMode(BLUE, OUTPUT); -> not needed digitalWrite(RED, LOW); digitalWrite(GREEN, HIGH); //digitalWrite(BLUE, LOW); -> not needed // INIT VARIABLE isPinRunning = false; runningPin = 0; Serial.begin(9600); } void loop() { // Normal pin Start ReadPin(buttonFillA_Pin, liquidA_Pin); ReadPin(buttonFillB_Pin, liquidB_Pin); ReadPin(buttonFillC_Pin, liquidC_Pin); ReadPin(buttonFillD_Pin, liquidD_Pin); // Cycle pin Start ReadCyclePin(buttonStartCycleAB_Pin, liquidA_Pin, liquidB_Pin, tankATime, tankBTime); ReadCyclePin(buttonStartCycleCD_Pin, liquidD_Pin, liquidC_Pin, tankDTime, tankCTime); } void ReadPin(int pinToCheck, int pinToActivate) { // Read the state of the switch into a local variable int buttonState = digitalRead(pinToCheck); // if button is pressed (LOW) and no other cycle is running or if button is pressed (LOW) and it's the one running if (buttonState == LOW && (isPinRunning == false || runningPin == pinToCheck)) { // Lock the machine to not handle other button while something is already running (Set isPinRunning to True, Isrunning to True and Led State to Running -> RED) LockRunningPin(pinToCheck); // Activated corresponding pin (HIGH) digitalWrite(pinToActivate, HIGH); } // If button is released (HIGH) and it's the one that was running if (buttonState == HIGH && runningPin == pinToCheck) { // Release the activated pin (LOW) digitalWrite(pinToActivate, LOW); // Release the machine (Set isPinRunning to False, Isrunning to False and Led State to Idle -> GREEN) ResetRunningPin(); } } void ReadCyclePin(int pinToCheck, int pinToActivateFirst, int pinToActivateSecond, int firstPinDelay, int secondPinDelay) { // Read the state of the switch into a local variable int buttonState = digitalRead(pinToCheck); // If button is pressed (LOW) and no cycle is already running if (buttonState == LOW && isPinRunning == false) { // Lock the machine to not handle other button while something is already running (Set isPinRunning to True, Isrunning to True and Led State to Running -> RED) LockRunningPin(pinToCheck); // Activate the first pin (HIGH) -> First Pump digitalWrite(pinToActivateFirst, HIGH); // Wait delay, parameter delay(firstPinDelay); // Release the first pin (LOW) -> First Pump digitalWrite(pinToActivateFirst, LOW); // Wait 500 ms before activating an other pin (PUMP) delay(500); // Activate the second pin (HIGH) -> Second Pump digitalWrite(pinToActivateSecond, HIGH); // Wait delay, parameter delay(secondPinDelay); // Release the second pin (LOW) -> Second Pump digitalWrite(pinToActivateSecond, LOW); // Release the machine (Set isPinRunning to False, Isrunning to False and Led State to Idle -> GREEN) ResetRunningPin(); } } void LockRunningPin(int checkedPin) { isPinRunning = true; runningPin = checkedPin; SetLedState(isPinRunning); } void ResetRunningPin() { isPinRunning = false; runningPin = 0; SetLedState(isPinRunning); } void SetLedState(bool isRunning) { // If something running RED, otherwise GREEN (IDLE) if(isRunning) { digitalWrite(RED, HIGH); digitalWrite(GREEN, LOW); } else { digitalWrite(RED, LOW); digitalWrite(GREEN, HIGH); } }