#define OUT_PIN 9 // Выходной сигнал (D9)
#define CTRL_PIN 3 // Управление таймером (D3)
#define LED_PIN 13 // Импульсный выход (D13)
#define LED_CTRL 2 // Управление импульсом (D2)
volatile bool timerRunning = false; // Флаг работы таймера
volatile bool pulseActive = false; // Флаг работы импульса
volatile uint16_t pulseCounter = 0; // Счётчик миллисекунд для D13
void setup() {
pinMode(OUT_PIN, OUTPUT);
pinMode(CTRL_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_CTRL, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CTRL_PIN), controlTimer, CHANGE); // D3 управляет таймером
attachInterrupt(digitalPinToInterrupt(LED_CTRL), startPulse, FALLING); // D2 запускает импульс по спаду
// === Таймер 1 (3 Гц) ===
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // CTC, предделитель 1024
OCR1A = 5245; // Частота 3 Гц (16MHz / 1024 / 3)
TIMSK1 |= (1 << OCIE1A); // Разрешаем прерывание по совпадению
// === Таймер 2 (1 мс) ===
TCCR2A = (1 << WGM21); // CTC
TCCR2B = (1 << CS22); // Предделитель 64 (16MHz / 64 / 250 = 1 мс)
OCR2A = 249;
TIMSK2 |= (1 << OCIE2A); // Разрешаем прерывание
digitalWrite(OUT_PIN, LOW);
digitalWrite(LED_PIN, LOW);
}
void controlTimer() {
if (digitalRead(CTRL_PIN) == LOW) {
timerRunning = true; // Запуск мигания
} else {
timerRunning = false; // Остановка
digitalWrite(OUT_PIN, LOW);
}
}
void startPulse() {
if (!pulseActive) {
pulseActive = true;
pulseCounter = 3000; // 3 секунды (3000 мс)
digitalWrite(LED_PIN, HIGH); // Включаем D13
}
}
ISR(TIMER1_COMPA_vect) {
if (timerRunning) {
digitalWrite(OUT_PIN, !digitalRead(OUT_PIN)); // Мигание D9
}
}
ISR(TIMER2_COMPA_vect) {
if (pulseActive) {
if (pulseCounter > 0) {
pulseCounter--;
} else {
digitalWrite(LED_PIN, LOW); // Выключаем D13 через 3 секунды
pulseActive = false;
}
}
}
void loop() {
// Основной код не нужен, всё работает через прерывания
}