#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 uint16_t kofemolka_vremja = 0; // Время отключения D13
volatile bool timer2_active = false; // Флаг работы таймера 2
void setup() {
Serial.begin(115200);
Serial.println("Инициализация...");
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;
TCCR1B = 0;
OCR1A = 15624; // 1 сек (16 МГц / 1024 предделитель / 1 Гц - 1)
TCCR1B |= (1 << WGM12); // CTC режим
TCCR1B |= (1 << CS10) | (1 << CS12); // Предделитель 1024
TIMSK1 |= (1 << OCIE1A); // Разрешаем прерывание
// === Таймер 2 (для D13) ===
cli(); // Отключаем прерывания перед настройкой таймера
TCCR2A = (1 << WGM21); // CTC режим
TCCR2B = 0; // Остановлен, пока не запустим
TIMSK2 |= (1 << OCIE2A); // Разрешаем прерывание по совпадению
sei(); // Включаем прерывания
digitalWrite(OUT_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Serial.println("Инициализация завершена.");
}
void controlTimer() {
if (digitalRead(In_3) == LOW) {
Serial.println("In_3 LOW - включаем мигание D9");
TIMSK1 |= (1 << OCIE1A); // Включаем мигание
} else {
Serial.println("In_3 HIGH - выключаем мигание D9");
TIMSK1 &= ~(1 << OCIE1A); // Отключаем мигание
digitalWrite(OUT_PIN, LOW);
}
}
void startPulse() {
if (timer2_active) {
Serial.println("Таймер 2 уже запущен, не запускаем повторно.");
return; // Прерываем выполнение функции, если таймер уже активен
}
digitalWrite(LED_PIN, HIGH); // Включаем D13
Serial.println("Импульс D13 включён");
int potValue = analogRead(POT_PIN);
kofemolka_vremja = (map(potValue, 0, 1023, 0, 3000) * 16) / 124 - 1; // Вычисляем время
Serial.print("Значение потенциометра: ");
Serial.println(potValue);
Serial.print("Время отключения D13 (OCR2A): ");
Serial.println(kofemolka_vremja);
if (kofemolka_vremja > 0) {
cli(); // Отключаем прерывания
OCR2A = kofemolka_vremja*10; // Устанавливаем время
TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); // Запускаем таймер с предделителем 1024
timer2_active = true;
sei(); // Включаем прерывания
Serial.println("Таймер 2 запущен");
}
}
ISR(TIMER1_COMPA_vect) {
if (digitalRead(In_3) == LOW) {
digitalWrite(OUT_PIN, !digitalRead(OUT_PIN)); // Мигание D9
Serial.println("Мигание D9");
}
}
ISR(TIMER2_COMPA_vect) {
if (timer2_active) {
digitalWrite(LED_PIN, LOW); // Выключаем D13
TCCR2B = 0; // Останавливаем таймер 2
timer2_active = false;
Serial.println("Таймер 2 сработал - D13 выключен");
}
}
void loop() {
static uint32_t lastReadTime = 0;
// Проверяем потенциометр раз в 10 секунд
if (millis() - lastReadTime > 10000) {
lastReadTime = millis();
int potValue = analogRead(POT_PIN);
kofemolka_vremja = (map(potValue, 0, 1023, 0, 3000) * 16) / 1024 - 1;
Serial.print("Периодический опрос: ");
Serial.print("Потенциометр = ");
Serial.print(potValue);
Serial.print(", Время = ");
Serial.println(kofemolka_vremja);
}
}