Toggle Button Timeout Using Millis()

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 :slight_smile:

EDIT: Code simplified..