#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(); // Отключаем таймер
}