Попытка запустить два одновременных цикла, которые выполняют одну и ту же задачу с разными циклами задержки
Я пытаюсь управлять двигателем шнека печи на пеллетах таким образом, чтобы можно было использовать тумблер для переключения между режимами «Высокий/Низкий» (В/Н). Сейчас у меня это реализовано следующим образом:
void setup() {
// инициализируем цифровой вывод 13 как выход.
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
// функция цикла выполняется снова и снова вечно
void loop() {
digitalWrite(12, HIGH);
digitalWrite(13, HIGH); // включаем светодиод (HIGH — уровень напряжения)
delay(2850); // ждем секунду
digitalWrite(13, LOW); // выключаем светодиод, понизив напряжение
delay(11250);
Это просто включение/выключение светодиода, но оно также управляет другим реле, которое управляет двигателем вентилятора. Я пытаюсь настроить параметр H, который будет задержкой включения 2850, а затем сделать так, чтобы, скажем, вывод 11 имел задержку выключения 7000, а вывод 13 по-прежнему сбрасывался до задержки включения 2850.
Я имею в виду следующее:
- контур A: контакт 12 вкл. - задержка 2850 контакт 12 выкл. - задержка 11250
- контур B: контакт 13 вкл. - задержка 2850, контакт 13 выкл. - задержка 7000
Я увидел и попробовал код для «многократного моргания», поскольку тот, который я использую, по сути является модифицированным «морганием».
Любая помощь будет очень кстати. Я использую тот, который показываю выше, на своей пеллетной печи. Недавно было -31,4, и он работал отлично, но мне бы хотелось иметь возможность выбора высокой/низкой температуры.
P.S.: У меня также есть проект по управлению обжарочной машиной для кофе... помощь в этом вопросе всегда приветствуется.
@Polartransit, 👍1
Обсуждение2 ответа
Библиотека Simple Timer для Arduino (и другие подобные библиотеки таймеров) создана именно для таких приложений. Ваша функция setup() вызывает библиотеку SimpleTimer, указывая имя функции обратного вызова и частоту её вызова. Функция цикла должна вызывать функцию timer.run() с разумной частотой (где
«Достаточно часто» зависит от точности синхронизации и устойчивости вашего приложения к джиттеру). timer.run() будет вызывать каждую из ваших функций обратного вызова в нужное время. Вы пишете функции обратного вызова так, чтобы они выполняли то, что вам нужно, когда таймер их вызывает.
Существуют одноразовые и повторяющиеся таймеры — похоже, ваше приложение может использовать по одному таймеру каждого типа на каждый светодиод: один, который срабатывает периодически, чтобы вызывать функцию включения LED12 каждые (ON_TIME_12+OFF_TIME_12) мс, и один, который вызывает функцию выключения LED12, запускаемую функцией включения LED12 на (ON_TIME_12) мс. То же самое относится к LED13, (... и т.д.)
Ваша функция цикла может делать что угодно, пока она вызывает timer.run() достаточно часто, чтобы ваше приложение могло удовлетворить ее требования по времени.
Кажется, это идеальный пример простого планировщика:
#include <Scheduler.h>
const int pinA = 12;
const int pinB = 13;
void setup()
{
Serial.begin(9600);
while (!Serial);
Scheduler.start(setupA, loopA);
Scheduler.start(setupB, loopB);
}
void loop()
{
Serial.print(millis());
Serial.print(F(":pinA="));
Serial.print(digitalRead(pinA));
Serial.print(F(",pinB="));
Serial.println(digitalRead(pinB));
delay(1000);
}
void setupA()
{
pinMode(pinA, OUTPUT);
}
void loopA()
{
digitalWrite(pinA, HIGH);
delay(2850);
digitalWrite(pinA, LOW);
delay(11250);
}
void setupB()
{
pinMode(pinB, OUTPUT);
}
void loopB()
{
digitalWrite(pinB, HIGH);
delay(2850);
digitalWrite(pinB, LOW);
delay(7000);
}
Ура!
Удивительно, что всего пару часов назад у меня уже есть готовый вариант, который я могу попробовать. Я уже пробовал что-то похожее на Uno. Код доступен на Arduino для «мульти-мигания», но он не скомпилировался. Потом я увидел, что для его запуска нужен Due, а не Uno. Поэтому не стал особо вникать в детали. Всё было понятно, но не запустилось, и я не смог скопировать ошибку. Но я обязательно попробую запустить это, конечно, с пинами. Есть ли причина, по которой оно не запустится и на Mega? Uno занят тем, что греет меня, но у меня есть Mega, так что сначала попробую его., @Polartransit
Библиотека Scheduler (https://github.com/mikaelpatel/Arduino-Scheduler), представленная выше, совместима практически со всеми платами Arduino. Она создаёт иллюзию запуска нескольких скетчей в одном скетче., @Mikael Patel
Извини, чувак, я почти уверен, что я тупица в этом вопросе. Я перепробовал все способы, которые смог найти, чтобы включить эту и другую библиотеку, но так и не смог ее скомпилировать = я не понимаю, насколько я понимаю, что код, который ты опубликовал, будет работать с добавленной указанной библиотекой. Мне, конечно, стыдно признаться, что я совершенно не знаю, как добавить библиотеку в скетч. Помогите, пожалуйста., @Polartransit
Установка библиотеки в Arduino — сложная задача (по крайней мере, в первый раз). Начните со скачивания ZIP-файла с сайта https://github.com/mikaelpatel/Arduino-Scheduler. Найдите папку «libraries» в Sketchbook (или в папке Arduino). Распакуйте файл Arduino-Scheduler-master в папку «libraries» и переименуйте папку в Scheduler. Перезапустите Arduino IDE, и всё готово., @Mikael Patel
Определенно не помогает то, что компьютер, который я использую для написания кода/пытаюсь написать код, - это ноутбук HP 2012 года за 250 долларов, который, как человек, пользующийся компьютерами с 1986+/-, является ХУДШИМ компьютером из всех, что я когда-либо видел. Я попробовал обновиться с 7-й версии до Win10 - она работала нормально, но, полагаю, я немного ранний пользователь, затем вообще не было сенсорной панели, я забросил ее на некоторое время и использовал только телефон, затем мне нужно было запрограммировать блок A, чтобы заставить работать печь на пеллетах, поэтому попробовал еще раз. Теперь моя сенсорная панель работает, но если вы используете клавиатуру, есть задержка от одной до полутора секунд, прежде чем она снова заработает - не выдающееся оборудование., @Polartransit
как ни странно, в первый раз я попробовал создать zip-архив и поместил его туда, куда ему и положено быть (я вообще-то стараюсь следовать инструкциям большую часть времени (а также имитирую те, которые им не следуют), затем я попробовал остальные доступные варианты — в конце концов я добился сообщения о том, что произошла непредвиденная или какая-то похожая ошибка, затем компьютер был перезагружен до того, как была скопирована ошибка — на этом этапе... я не понимаю, почему файл не компилируется, кажется, все файлы находятся там, где им и положено быть, и код имеет смысл, но..., @Polartransit
ВНИМАНИЕ: библиотека Scheduler утверждает, что работает на архитектуре (архитектурах) samd и может быть несовместима с вашей текущей платой, которая работает на архитектуре (архитектурах) samd., @Polartransit
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Просто ради интереса... -31,4°C или -31,4°F? Хотя они довольно близки, и в любом случае чертовски холодно!, @Greenonline