#define BUTTON_PIN 2 // Кнопка (D2)
#define OUTPUT_PIN 13 // Управляемый выход (D13)
#define POTENTIOMETER_PIN A0 // Потенциометр для регулировки времени
volatile uint16_t ticksRemaining = 0;
volatile bool timerRunning = false;
volatile unsigned long lastPressTime = 0;
const uint16_t DEBOUNCE_TIME = 200; // Антидребезг, мс
void setup() {
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(OUTPUT_PIN, OUTPUT);
digitalWrite(OUTPUT_PIN, LOW);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), startTimer, RISING);
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12); // CTC, делитель 256
OCR1A = 6249; // 16 000 000 / (256 * 10) - 1 = 10 Гц (100 мс на шаг)
TIMSK1 &= ~(1 << OCIE1A); // Прерывание пока выключено
}
void loop() {
int potValue = analogRead(POTENTIOMETER_PIN);
uint16_t timerDuration = map(potValue, 0, 1023, 0, 6000); // 0–6000 мс
Serial.print("Установленное время: ");
Serial.print(timerDuration);
Serial.println(" мс");
delay(500);
}
void startTimer() {
unsigned long now = millis();
if (now - lastPressTime < DEBOUNCE_TIME) return;
lastPressTime = now;
int potValue = analogRead(POTENTIOMETER_PIN);
uint16_t timerDuration = map(potValue, 0, 1023, 0, 6000); // Время в мс
Serial.print("Запуск таймера на ");
Serial.print(timerDuration);
Serial.println(" мс!");
if (!timerRunning && timerDuration > 0) {
digitalWrite(OUTPUT_PIN, HIGH);
timerRunning = true;
ticksRemaining = timerDuration / 100; // Преобразуем в шаги по 100 мс
TCNT1 = 0;
TIMSK1 |= (1 << OCIE1A);
}
}
ISR(TIMER1_COMPA_vect) {
if (ticksRemaining > 0) {
ticksRemaining--;
} else {
Serial.println("Таймер истёк, выключаю...");
digitalWrite(OUTPUT_PIN, LOW);
timerRunning = false;
TIMSK1 &= ~(1 << OCIE1A);
}
}