#define OUT_PIN 9 // Выходной сигнал (D9)
#define In_3 3 // Управление таймером (D3)
#define LED_PIN 13 // Импульсный выход (D13)
#define In_2 2 // Управление импульсом (D2)
#define POT_PIN A0 // Переменный резистор (A0)
volatile bool timerRunning = false; // Флаг работы таймера
volatile bool pulseActive = false; // Флаг работы импульса
volatile uint16_t pulseCounter = 0; // Счётчик миллисекунд для D13
volatile int potValue = 0; // Значение с переменного резистора (A0)
volatile bool readPot = false; // Флаг для считывания с A0
void setup() {
pinMode(OUT_PIN, OUTPUT);
pinMode(In_3, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
pinMode(In_2, INPUT_PULLUP);
pinMode(POT_PIN, INPUT); // Настройка A0 как входа
attachInterrupt(digitalPinToInterrupt(In_3), controlTimer, CHANGE); // D3 управляет таймером
attachInterrupt(digitalPinToInterrupt(In_2), startPulse, FALLING); // D2 запускает импульс по спаду
// === Таймер 1 (1 Гц) ===
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = 15624; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // Разрешаем прерывание по совпадению
// === Таймер 2 (1 мс) ===
TCCR2A = (1 << WGM21); // CTC
TCCR2B = (1 << CS22); // Предделитель 64 (16MHz / 64 / 250 = 1 мс)
OCR2A = 242;
TIMSK2 |= (1 << OCIE2A); // Разрешаем прерывание
digitalWrite(OUT_PIN, LOW);
digitalWrite(LED_PIN, LOW);
}
void controlTimer() {
if (digitalRead(In_3) == LOW) {
timerRunning = true; // Запуск мигания
} else {
timerRunning = false; // Остановка
digitalWrite(OUT_PIN, LOW);
}
}
void startPulse() {
if (!pulseActive) {
pulseActive = true;
pulseCounter = map(potValue, 0, 1023, 0, 3000); // От 0 до 3000 мс
digitalWrite(LED_PIN, HIGH); // Включаем D13
readPot = true; // Устанавливаем флаг для считывания с A0
}
}
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;
}
}
if (readPot) {
potValue = analogRead(POT_PIN); // Считываем значение с A0
readPot = false; // Сбрасываем флаг, чтобы не считывать постоянно
}
}
void loop() {
// Основной код не нужен, всё работает через прерывания
}