Как добавить еще один счетчик времени в мой работающий скетч?

У меня есть функциональный скетч, который я запускаю на Arduino Uno, выход которого управляет модулем вентилятора; Мне нужен еще один таймер для запуска второго вентилятора, и я хотел бы использовать для этого другой выход на Uno, а не использовать другой блок.

Мой скетч делает следующее:

  • считает 15 минут (интервал_1)
  • запускает вентилятор на 1 минуту (interval_2)
  • запускает новый цикл.

Что мне нужно сделать, так это добавить еще одну функцию, которая запускает вентилятор №2 на 15 секунд (интервал_3) при запуске цикла, используя другой выход (relayPin_1), а затем останавливает.

Поток будет таким:

  • считает 15 минут (интервал_1)
  • запускает вентилятор №1 на 60 сек (интервал_2)
  • запускает вентилятор №2 на 15 сек (интервал_3)
  • сбрасывает и запускает новый цикл.

К сожалению, не могу понять, как вставить второй таймер.

Скетч ниже, если у вас есть какие-либо идеи, которые будут очень признательны.

Спасибо

const byte relayPin = 4;                           // управление вентилятором №1 на контакте 4,
const byte relayPin_1 = 7;                         // управление вентилятором №2 увлажнителя на контакте 7,
const unsigned long interval_1 = 1000UL * 60,      // Таймер RUN, мс
                    interval_2 = 1000UL * 60 * 15, // Таймер ВЫКЛ, мс
                    interval_3 = 1000UL * 15;      // Таймер увлажнителя
unsigned long currentMillis, previousMillis = 0;

void setup() {
    // поместите сюда код установки для однократного запуска:
    pinMode(relayPin, OUTPUT);   // Выход №1
    pinMode(relayPin_1, OUTPUT); //Выход №2
    // relayPin_1 управляет вентилятором увлажнителя №2
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    // при запуске вентилятор включается на интервал interval_1
    currentMillis = millis() - previousMillis;
    if (currentMillis <= interval_1) {
        digitalWrite(relayPin, HIGH);    // вентилятор включен
        digitalWrite(LED_BUILTIN, HIGH); // Светодиод горит (мигает)
        delay(333 / 2);
        digitalWrite(LED_BUILTIN, LOW);   // светодиод выключен
        delay(999);
    }

    // по достижении интервала_1 выключаем вентилятор на время интервала_2
    else if (currentMillis <= (interval_1 + interval_2)) {
        digitalWrite(relayPin, LOW);    // вентилятор выключен
        digitalWrite(LED_BUILTIN, LOW); // светодиод выключен
    }
    else {
        // сбросить таймер
        previousMillis = millis();
    }

}

Хорошо... Сегодня у меня было время поиграть с ним; что оно делает: он запускает вентилятор №1 и вентилятор №2, затем останавливает вентилятор №2 в (интервал_1 + интервал_2), но вентилятор №1 продолжает работать до окончания цикла. Следовательно: вентилятор №1 работает 35 сек, вентилятор №2 работает 15 сек, как и должно быть; и цикл останавливается на 30 сек, как и должно быть. Однако я не могу заставить вентилятор №1 работать только 20 секунд. как это определено.

константный байт relayPin = 4; // управление рециркуляционным вентилятором №1 на контакте 4,
константный байт relayPin_1 = 7; // управление вентилятором №2 увлажнителя на контакте 7,
const unsigned long interval_1 = 1000UL * 20, // RUN таймер вентилятора №1, мс
interval_2 = 1000UL * 15, // RUN таймер вентилятора №2, мс
интервал_3 = 1000UL * 30; // Таймер выключения
unsigned long currentMillis, previousMillis = 0;

недействительная установка () {
// поместите сюда код установки для однократного запуска:
pinMode (relayPin, ВЫХОД); // Выход №1
pinMode(relayPin_1, ВЫХОД); //Выход №2
pinMode (LED_BUILTIN, ВЫХОД); }

недействительный цикл () {
// при запуске вентилятор №1 & вентилятор №2 включен
текущая миллис = миллис () - предыдущая миллис;
если (currentMillis < interval_1) {
цифровая запись (relayPin, ВЫСОКИЙ); // вентилятор №1 включен
цифровая запись (relayPin_1, ВЫСОКИЙ); // вентилятор №2 включен
цифровая запись (LED_BUILTIN, ВЫСОКАЯ); // встроенный светодиод горит

} иначе если (currentMillis < (interval_1 + interval_2)) {
цифровая запись (relayPin_1, НИЗКИЙ); // вентилятор №2 выключен

// при достижении (interval_1 + interval_2) выключить вентиляторы на время interval_3
} else if (currentMillis < (interval_1 + interval_2 + interval_3)) {
цифровая запись (relayPin, НИЗКИЙ); // вентилятор №1 выключен
цифровая запись (LED_BUILTIN, НИЗКИЙ); // светодиод выключен

} еще {
// сбросить таймер
предыдущийMillis = millis(); }
}

, 👍-1

Обсуждение

ваше описание циклов вентиляторов неясно.... оба вентилятора запускаются одновременно?, @jsotola

нарисуйте временную диаграмму на бумаге... это не поможет вам визуализировать требуемый код, @jsotola

Ваш код не соответствует вашему описанию. В вашем описании вы хотите, чтобы вентилятор был выключен на 15 минут, а затем включен на 1 минуту. Вентилятор включен на все 15 минут_1, а затем выключен на 1 минуту., @Duncan C

Комментарии кода к вашим интервалам предполагают, что interval_1 – это время работы (включенного вентилятора 1), а interval_2 – время выключения вентилятора. Это то, что делает ваш код, но не то, что вы говорите в своем описании. Что правильно?, @Duncan C

Я не понимаю, что вы хотите сделать. Пожалуйста, добавьте четкое изложение вашей цели. В течение первого интервала (20 секунд?) какие вентиляторы должны быть включены? Тогда для второго, 15-секундного интервала, какие вентиляторы должны быть включены? И я так понимаю, вы хотите, чтобы оба вентилятора были отключены на интервал 3 (30 секунд)?, @Duncan C


1 ответ


1

Предполагая, что вы исправили свою логику, вы сможете добавить столько случаев в оператор if, сколько захотите:

  if (currentMillis <= interval_1) {
      // Перед окончанием интервала 1 веер отключается.
  } else if (currentMillis <= (interval_1 + interval_2)) {
      // В интервале 2 вентилятор включен
  } else if (currentMillis <= (interval_1 + interval_2 + interval_3 )) {
      // В интервале 3 вентилятор2 включен
  } else {
      // выключаем все
      // сбросить таймер
  }
,

В любом случае, я показал в своем ответе, как настроить ваш код на 3 разных интервала, а затем отключить все после окончания последнего интервала. Вы можете расширить этот шаблон на столько интервалов, сколько хотите,, @Duncan C

Если вы не можете заставить его работать, отредактируйте свой вопрос и поместите новый код в конец вместе с тем, что он делает неправильно., @Duncan C