// ==========================================
// 4 CHANNEL RELAY SEQUENTIAL CONTROLLER
// ==========================================
// START switch
const byte START_SWITCH = 2;
// Individual switches
const byte SW1 = 3;
const byte SW2 = 4;
const byte SW3 = 5;
const byte SW4 = 6;
// Relay outputs
const byte RELAY1 = 8;
const byte RELAY2 = 9;
const byte RELAY3 = 10;
const byte RELAY4 = 11;
// 10 second interval
const unsigned long INTERVAL = 10000UL;
// Current relay in automatic sequence
byte currentRelay = 0;
// Timer
unsigned long previousMillis = 0;
// ==========================================
// SETUP
// ==========================================
void setup()
{
// Switches
pinMode(START_SWITCH, INPUT_PULLUP);
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SW3, INPUT_PULLUP);
pinMode(SW4, INPUT_PULLUP);
// Relays
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
// Initially all OFF
allRelaysOff();
}
// ==========================================
// LOOP
// ==========================================
void loop()
{
// START switch
bool start = (digitalRead(START_SWITCH) == LOW);
// ========================================
// START SWITCH OFF
// ========================================
if (!start)
{
// IMPORTANT:
// Immediately turn ALL relays OFF
allRelaysOff();
// Reset automatic sequence
currentRelay = 0;
// Reset timer
previousMillis = millis();
return;
}
// ========================================
// START SWITCH ON
// ========================================
automaticSequence();
}
// ==========================================
// AUTOMATIC SEQUENCE
// ==========================================
void automaticSequence()
{
unsigned long currentMillis = millis();
// ----------------------------------------
// Start sequence with Relay 1
// ----------------------------------------
if (currentRelay == 0)
{
currentRelay = 1;
setRelay(currentRelay);
previousMillis = currentMillis;
return;
}
// ----------------------------------------
// Check 10 second interval
// ----------------------------------------
if (currentMillis - previousMillis >= INTERVAL)
{
previousMillis = currentMillis;
// Move to next relay
currentRelay++;
// After Relay 4, go back to Relay 1
if (currentRelay > 4)
{
currentRelay = 1;
}
setRelay(currentRelay);
}
}
// ==========================================
// TURN ON SELECTED RELAY
// ==========================================
void setRelay(byte relayNumber)
{
// First turn ALL relays OFF
allRelaysOff();
// Then turn selected relay ON
switch (relayNumber)
{
case 1:
digitalWrite(RELAY1, HIGH);
break;
case 2:
digitalWrite(RELAY2, HIGH);
break;
case 3:
digitalWrite(RELAY3, HIGH);
break;
case 4:
digitalWrite(RELAY4, HIGH);
break;
}
}
// ==========================================
// TURN ALL RELAYS OFF
// ==========================================
void allRelaysOff()
{
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
}