You could use a library like TDuino for convenience:
#include <TDuino.h>
#define BUTTON1 4
#define TOGGLE1 5
#define BUTTON2 6
#define TOGGLE2 7
#define RELAY1 0
#define RELAY2 1
#define RELAY3 2
#define RELAY4 3
#define TOGGLE_TIMEOUT 10000
void timerCallback(byte timerId);
TButton btn1(BUTTON1), btn2(BUTTON2);
TButton tgl1(TOGGLE1), tgl2(TOGGLE2);
TTimer timer(timerCallback, 2);
void setRelays(byte state, bool all)
{
digitalWrite(RELAY1, state);
digitalWrite(RELAY2, state);
if (all)
{
digitalWrite(RELAY3, state);
digitalWrite(RELAY4, state);
}
}
void buttonPress(byte pin, int state)
{
if (pin == BUTTON1) setRelays(LOW, false);
else if (pin == TOGGLE1)
{
setRelays(LOW, false);
timer.set(0, TOGGLE_TIMEOUT, 1);
}
else if (pin == BUTTON2) setRelays(LOW, true);
else if (pin == TOGGLE2)
{
setRelays(LOW, true);
timer.set(1, TOGGLE_TIMEOUT, 1);
}
}
void buttonRelease(byte pin, int state)
{
setRelays(HIGH, pin == BUTTON2);
}
void timerCallback(byte timerId)
{
setRelays(HIGH, timerId == 1);
}
void setup()
{
btn1.setup();
btn2.setup();
tgl1.setup();
tgl2.setup();
timer.setup();
btn1.onPress(buttonPress);
btn2.onPress(buttonPress);
tgl1.onPress(buttonPress);
tgl2.onPress(buttonPress);
btn1.onRelease(buttonRelease);
btn2.onRelease(buttonRelease);
//tgl1.onRelease(buttonRelease);
//tgl2.onRelease(buttonRelease);
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
}
void loop()
{
btn1.loop();
btn2.loop();
tgl1.loop();
tgl2.loop();
timer.loop();
}
Code is untested and may not work at all ![]()
EDIT: Code simplified..