Управление одной кнопкой тремя реле

Едем дальше?

/*
 * Абзавём входные данные, а именно пины для КНОПКИ и ТРЁХ РЕЛЕ
 */

#define     BUTTON_PIN        12    // Кнопка
#define     RELE1_PIN         2     // Реле 1
#define     RELE2_PIN         3     // Реле 2
#define     RELE3_PIN         4     // Реле 3
#define     TIME_BOUNCE       70    // 70мс время "фильтрации" дребезга контактов
#define     LONG_PRESS_TIME   2000  // 2 секунды время удержания кнопки

enum BUTTON_RESULT : uint8_t {
  NOT_PRESS, 
  PRESS,
  LONG_PRESS                                                     
};

BUTTON_RESULT current_button_res = NOT_PRESS;

void setup() {
  // Крутая вставка от DetSimen для отладки
  Serial.begin(9600);
  stdout = fdevopen([](char ch, FILE* f)->int {return Serial.print(ch); }, NULL);
  // puts("Program started...");
  
  // Теперь настроим пины
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // На вход и подтянуть к +питания (экономим на резисторах для "подтяжки")
  pinMode(RELE1_PIN, OUTPUT);         // А пины реле на выход
  pinMode(RELE2_PIN, OUTPUT);
  pinMode(RELE3_PIN, OUTPUT);

  // И зададим начальное значение - все реле выключены
  digitalWrite(RELE1_PIN, LOW);
  digitalWrite(RELE2_PIN, LOW);
  digitalWrite(RELE3_PIN, LOW);
}

void loop() {
  // С чего начать основную программу?
  // А начну-ка с чтения состояния кнопки. ТС, как думаешь - это правильное решение?
  uint8_t button_state = digitalRead(BUTTON_PIN); // Ну во, вот тут мы её и "уконтропупили". 
                                                  // Теперь в переменной button_state содержится состояние кнопки
                                                  // LOW - если кнопка нажата, и HIGH - если кнопка не нажата
                                                    
  // Ещё нам понадобятся дополнительные переменные, оставим место тут для них
uint32_t _millis = millis();                      // Запомним текущее значение миллисекунд
  static uint32_t timeHoldBegin;                  // Время начала удержания кнопки
  static uint32_t timeHold;                       // Длительность удержания кнопки
  
  // А дальше нам нужно узнать - нажимал кто на кнопку? А если нажимал - то как долго удерживал?
  if (!button_state) {                            // Если кнопка нажата
    timeHold =  _millis - timeHoldBegin;          // Считаем длительность удержания
  } else {                                        // Еслди кнопку отпустили
    timeHoldBegin = _millis;                      // Сбрасываем
    timeHold = 0;
    current_button_res = NOT_PRESS;
  }

  if (timeHold > TIME_BOUNCE && timeHold < LONG_PRESS_TIME) { // Если время удержание в интервале между временем подавления дребезга и удержанием
    current_button_res = PRESS;                               // То нужно как-то "зарегистрировать нажатие"
  }

  if (timeHold > LONG_PRESS_TIME) {                           // Если время удержание больше времени удержаниея (2 сек)
    current_button_res = LONG_PRESS;                          // То нужно как-то "зарегистрировать долгое удержание"
  }

  // Состояние кнопки узнали.
  // А дальше пошла "жара" (то есть обработка нажатий)

  switch (current_button_res) {
    case PRESS:                                               // Если кликнули один раз
      // Обрабатываем короткие нажатия

      break;
    case LONG_PRESS:                                          // Если долго держали
      // Обрабатываем долгое удержание
    
      break;
    case NOT_PRESS:                                            // Если кнопку не нажимали
      // Ничего не делаем. Это просто для наглядности
      break;
    default:
      break;
  }
}