#define BUTTON_TIMER_PIN 2 // Кнопка запуска таймера (D2)
#define BUTTON_PWM_PIN 3 // Кнопка запуска ШИМ (D3)
#define OUTPUT_TIMER_PIN 13 // Управляемый выход (D13)
#define OUTPUT_PWM_PIN 9 // ШИМ 1 Гц (10%) (D9)
#define POTENTIOMETER_PIN A0 // Потенциометр (A0)
volatile uint16_t ticksRemaining = 0;
volatile bool timerRunning = false;
volatile bool pwmRunning = false;
volatile unsigned long lastPressTime = 0;
volatile unsigned long pwmStartTime = 0;
volatile bool pwmTriggerPending = false;
const uint16_t DEBOUNCE_TIME = 200;
const uint16_t PWM_DELAY = 2000;
const uint16_t PWM_MAX_TIME = 30000;
void setup() {
Serial.begin(115200);
pinMode(BUTTON_TIMER_PIN, INPUT_PULLUP);
pinMode(BUTTON_PWM_PIN, INPUT_PULLUP);
pinMode(OUTPUT_TIMER_PIN, OUTPUT);
pinMode(OUTPUT_PWM_PIN, OUTPUT);
digitalWrite(OUTPUT_TIMER_PIN, LOW);
digitalWrite(OUTPUT_PWM_PIN, LOW);
attachInterrupt(digitalPinToInterrupt(BUTTON_TIMER_PIN), startTimer, RISING);
attachInterrupt(digitalPinToInterrupt(BUTTON_PWM_PIN), handlePWM, FALLING);
}
void loop() {
int potValue = analogRead(POTENTIOMETER_PIN);
uint16_t timerDuration = map(potValue, 0, 1023, 0, 6000);
Serial.print("Установленное время: ");
Serial.print(timerDuration);
Serial.println(" мс");
if (pwmTriggerPending && millis() - lastPressTime >= PWM_DELAY) {
startPWM();
pwmTriggerPending = false;
}
if (pwmRunning && millis() - pwmStartTime >= PWM_MAX_TIME) {
stopPWM();
}
delay(1000);
}
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_TIMER_PIN, HIGH);
timerRunning = true;
ticksRemaining = timerDuration / 100;
configureTimerForCountdown();
TCNT1 = 0;
TIMSK1 |= (1 << OCIE1A);
}
}
ISR(TIMER1_COMPA_vect) {
if (ticksRemaining > 0) {
ticksRemaining--;
} else {
Serial.println("Таймер истёк, выключаю...");
digitalWrite(OUTPUT_TIMER_PIN, LOW);
timerRunning = false;
TIMSK1 &= ~(1 << OCIE1A);
}
}
void handlePWM() {
unsigned long now = millis();
if (now - lastPressTime < DEBOUNCE_TIME) return;
lastPressTime = now;
if (!timerRunning && digitalRead(OUTPUT_TIMER_PIN) == LOW) {
Serial.println("Запрос на запуск ШИМ...");
pwmTriggerPending = true;
}
}
void startPWM() {
Serial.println("Старт ШИМ!");
pwmRunning = true;
pwmStartTime = millis();
configureTimerForPWM();
}
void stopPWM() {
Serial.println("Остановка ШИМ!");
pwmRunning = false;
TCCR1A &= ~(1 << COM1A1);
digitalWrite(OUTPUT_PWM_PIN, LOW);
}
// Таймер 1 для таймера (0–6 сек, 100 мс шаг)
void configureTimerForCountdown() {
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12); // CTC, делитель 256
OCR1A = 6249; // 100 мс
}
// Таймер 1 для ШИМ 1 Гц (10%)
void configureTimerForPWM() {
TCCR1A = (1 << COM1A1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12);
ICR1 = 15624; // 1 Гц
OCR1A = 1562; // 10%
}