// Pin Definitions
const int btn1 = 12; // Hold to Activate
const int btn2 = 11; // 3-Minute Constant
const int btn3 = 9; // 3-Minute Pulse (6s ON, 3s OFF)
const int btn4 = 6; // CANCEL
const int relayPin = 2;
// Timing Constants (in milliseconds)
const unsigned long THREE_MINUTES = 3UL * 60UL * 1000UL;
const unsigned long PULSE_ON = 6000UL;
const unsigned long PULSE_OFF = 3000UL;
// State Variables
enum Mode { IDLE, CONSTANT, PULSING };
Mode currentMode = IDLE;
unsigned long modeStartTime = 0;
unsigned long lastPulseToggle = 0;
bool relayIsOn = false;
void setup() {
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
pinMode(btn3, INPUT_PULLUP);
pinMode(btn4, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW); // Start with relay OFF
}
void loop() {
unsigned long currentMillis = millis();
// --- BUTTON 4: CANCEL (Highest Priority) ---
if (digitalRead(btn4) == LOW) {
stopAll();
}
// --- BUTTON 1: MOMENTARY HOLD ---
// Only works if no other cycle is running
if (currentMode == IDLE) {
if (digitalRead(btn1) == LOW) {
digitalWrite(relayPin, HIGH);
return; // Skip rest of loop to maintain hold
} else {
digitalWrite(relayPin, LOW);
}
}
// --- START NEW CYCLES ---
if (currentMode == IDLE) {
if (digitalRead(btn2) == LOW) {
currentMode = CONSTANT;
modeStartTime = currentMillis;
digitalWrite(relayPin, HIGH);
}
else if (digitalRead(btn3) == LOW) {
currentMode = PULSING;
modeStartTime = currentMillis;
lastPulseToggle = currentMillis;
relayIsOn = true;
digitalWrite(relayPin, HIGH);
}
}
// --- RUN ACTIVE CYCLES ---
if (currentMode != IDLE) {
// Check if 3-minute total time is up
if (currentMillis - modeStartTime >= THREE_MINUTES) {
stopAll();
}
// Logic for Button 3 (Pulsing)
else if (currentMode == PULSING) {
unsigned long interval = relayIsOn ? PULSE_ON : PULSE_OFF;
if (currentMillis - lastPulseToggle >= interval) {
relayIsOn = !relayIsOn;
digitalWrite(relayPin, relayIsOn ? HIGH : LOW);
lastPulseToggle = currentMillis;
}
}
}
}
void stopAll() {
currentMode = IDLE;
digitalWrite(relayPin, LOW);
}
POWER
SIREN