Как добавить еще один счетчик времени в мой работающий скетч?
У меня есть функциональный скетч, который я запускаю на 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(); } }
@kwhunter, 👍-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
- Использование millis() и micros() внутри процедуры прерывания
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Как считать время в секундах?
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Использование TIMER0_COMPB_vect
ваше описание циклов вентиляторов неясно.... оба вентилятора запускаются одновременно?, @jsotola
нарисуйте временную диаграмму на бумаге... это не поможет вам визуализировать требуемый код, @jsotola
Ваш код не соответствует вашему описанию. В вашем описании вы хотите, чтобы вентилятор был выключен на 15 минут, а затем включен на 1 минуту. Вентилятор включен на все 15 минут_1, а затем выключен на 1 минуту., @Duncan C
Комментарии кода к вашим интервалам предполагают, что interval_1 – это время работы (включенного вентилятора 1), а interval_2 – время выключения вентилятора. Это то, что делает ваш код, но не то, что вы говорите в своем описании. Что правильно?, @Duncan C
Я не понимаю, что вы хотите сделать. Пожалуйста, добавьте четкое изложение вашей цели. В течение первого интервала (20 секунд?) какие вентиляторы должны быть включены? Тогда для второго, 15-секундного интервала, какие вентиляторы должны быть включены? И я так понимаю, вы хотите, чтобы оба вентилятора были отключены на интервал 3 (30 секунд)?, @Duncan C