#include <TimerOne>
const int buttonPin = 3;
const int relayPin =2;

const unsigned long shortPressTime = 10000; // 10 секунд
const long debounceDelay = 50;

unsigned long buttonPressTime = 0;
unsigned long lastDebounceTime = 0;
bool relayState = false;
int lastButtonState = HIGH;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);
}

void loop() {
  int buttonState = digitalRead(buttonPin);

  // Проверяем, изменилось ли состояние кнопки
  if (buttonState != lastButtonState) {
    lastDebounceTime = millis(); // Обновляем время последнего изменения состояния кнопки
  }

  // Проверяем, прошла ли достаточная задержка для антидребезга
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Если кнопка нажата
    if (buttonState == LOW) {
      // Если это первое нажатие кнопки
      if (buttonPressTime == 0) {
        buttonPressTime = millis(); // Запоминаем время первого нажатия кнопки
      } else if ((millis() - buttonPressTime) >= 1000) { // Если кнопка удерживается более 1 секунды
        relayState = !relayState; // Инвертируем состояние реле
        digitalWrite(relayPin, relayState ? HIGH : LOW); // Устанавливаем соответствующее состояние реле
        buttonPressTime = 0; // Сбрасываем время первого нажатия кнопки
      }
    } else { // Если кнопка отпущена
      // Если кнопка была нажата и отпущена менее 1 секунды
      if (buttonPressTime != 0 && (millis() - buttonPressTime) < 1000) {
        relayState = true; // Включаем реле
        digitalWrite(relayPin, HIGH);
        Timer1.initialize(shortPressTime * 1000, turnOffRelay); // Инициализируем таймер на 10 секунд
        Timer1.attachInterrupt(turnOffRelay); // Привязываем функцию turnOffRelay к таймеру
        buttonPressTime = 0; // Сбрасываем время первого нажатия кнопки
      }
    }
  }

  lastButtonState = buttonState; // Запоминаем текущее состояние кнопки
}

void turnOffRelay() {
  digitalWrite(relayPin, LOW); // Выключаем реле
  relayState = false;
  Timer1.detachInterrupt(); // Отключаем таймер
}