// PIN DEFINITIONS
const int BTN_1 = 13; // Momentary Manual
const int BTN_2 = 12; // 3 Min Steady
const int BTN_3 = 11; // 3 Min Attack/Cycle
const int BTN_4 = 10; // 3 Min Pulsed (6s ON / 3s OFF)
const int BTN_5 = 9; // CANCEL ALL
const int RELAY_1 = 7;
const int RELAY_2 = 6;
const int RELAY_3 = 5;
// TIMING CONSTANTS
const unsigned long THREE_MINUTES = 180000;
const unsigned long PULSE_6S = 6000;
const unsigned long PULSE_3S = 3000;
const unsigned long CYCLE_HALF_SEC = 500;
// STATE VARIABLES
int activeMode = 0; // 0=Idle, 2=Steady, 3=Attack, 4=Pulsed
unsigned long modeStartTime = 0;
unsigned long lastActionTime = 0;
bool toggleState = false;
void setup() {
pinMode(BTN_1, INPUT_PULLUP);
pinMode(BTN_2, INPUT_PULLUP);
pinMode(BTN_3, INPUT_PULLUP);
pinMode(BTN_4, INPUT_PULLUP);
pinMode(BTN_5, INPUT_PULLUP);
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
stopAll();
}
void loop() {
unsigned long currentTime = millis();
// --- BUTTON INPUTS ---
if (digitalRead(BTN_5) == LOW) stopAll();
if (activeMode == 0 && digitalRead(BTN_1) == LOW) {
digitalWrite(RELAY_1, HIGH);
} else if (activeMode == 0) {
digitalWrite(RELAY_1, LOW);
}
if (digitalRead(BTN_2) == LOW) startMode(2, currentTime);
if (digitalRead(BTN_3) == LOW) startMode(3, currentTime);
if (digitalRead(BTN_4) == LOW) startMode(4, currentTime);
// --- MODE LOGIC ---
if (activeMode != 0) {
if (currentTime - modeStartTime >= THREE_MINUTES) {
stopAll();
} else {
runModeLogic(currentTime);
}
}
}
void startMode(int mode, unsigned long startTime) {
stopAll();
activeMode = mode;
modeStartTime = startTime;
lastActionTime = startTime;
toggleState = true; // Ensures Pulsed mode starts in the "ON" phase immediately
// Immeadiate trigger for Relay 1 if Mode 4 is selected
if (mode == 4) {
digitalWrite(RELAY_1, HIGH);
}
}
void stopAll() {
activeMode = 0;
digitalWrite(RELAY_1, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_3, LOW);
}
void runModeLogic(unsigned long now) {
switch (activeMode) {
case 2:
digitalWrite(RELAY_1, HIGH);
break;
case 3:
digitalWrite(RELAY_1, HIGH);
if (now - lastActionTime >= CYCLE_HALF_SEC) {
lastActionTime = now;
toggleState = !toggleState;
digitalWrite(RELAY_2, toggleState ? HIGH : LOW);
digitalWrite(RELAY_3, toggleState ? LOW : HIGH);
}
break;
case 4:
// Decide interval based on current state (ON for 6s, OFF for 3s)
unsigned long interval = toggleState ? PULSE_6S : PULSE_3S;
if (now - lastActionTime >= interval) {
lastActionTime = now;
toggleState = !toggleState; // Flip from ON to OFF or vice versa
digitalWrite(RELAY_1, toggleState ? HIGH : LOW);
} else {
// Ensure relay maintains its state during the interval
digitalWrite(RELAY_1, toggleState ? HIGH : LOW);
}
break;
}
}
Solenoids
Chopper