#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
volatile bool timer2Stopped = false; // Флаг остановки таймера 2
volatile uint32_t timer2StopTime = 0; // Время остановки таймера 2
volatile bool timer2Completed = false; // Флаг, что таймер 2 отработал
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 режим
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() {
uint32_t currentTime = millis();
if (digitalRead(In_3) == HIGH) {
if (timer2Stopped && (currentTime - timer2StopTime > 2000) && timer2Completed) {
timerRunning = true; // Запуск таймера 1
onTimerStart(); // Добавление логики при запуске таймера
}
// Игнорируем импульс, если не прошло 2 сек или таймер 2 не отработал
} else {
if (timerRunning) {
timerRunning = false; // Остановка таймера 1
digitalWrite(OUT_PIN, LOW);
onTimerStop(); // Добавление логики при остановке таймера
}
}
}
void startPulse() {
if (!pulseActive) {
pulseActive = true;
pulseCounter = map(potValue, 0, 1023, 0, 3000); // От 0 до 3000 мс
digitalWrite(LED_PIN, HIGH); // Включаем D13
readPot = true; // Устанавливаем флаг для считывания с A0
onPulseStart(); // Добавление логики при старте импульса
}
}
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;
onPulseStop(); // Добавление логики при завершении импульса
timer2Completed = true; // Фиксируем, что таймер 2 отработал
timer2Stopped = true; // Фиксируем, что таймер 2 остановился
timer2StopTime = millis(); // Запоминаем время остановки таймера 2
}
}
if (readPot) {
potValue = analogRead(POT_PIN); // Считываем значение с A0
readPot = false; // Сбрасываем флаг, чтобы не считывать постоянно
}
}
void loop() {
// Основной код не нужен, всё работает через прерывания
}
// === Добавленные функции для логики срабатываний ===
void onTimerStart() {
// Здесь можно добавить логику, которая срабатывает при старте таймера
}
void onTimerStop() {
// Здесь можно добавить логику, которая срабатывает при остановке таймера
}
void onPulseStart() {
// Здесь можно добавить логику, которая срабатывает при старте импульса
}
void onPulseStop() {
// Здесь можно добавить логику, которая срабатывает при завершении импульса
}