Хорошо, я только недавно погрузился в программирование Arduino. В настоящее время у меня есть базовая функция мигания вместе с программой светодиодов RGB, которая меняет светодиоды на синий, зеленый и красный в исчезающих цветах. У меня есть 2 светодиода, простой и основной желтый светодиод, который должен работать как индикатор «рабочего состояния». И светодиод RGB. Теперь я хочу, чтобы цветовой переход RGB проходил нормально, хотя я хочу, чтобы желтый светодиод постоянно мигал. Как мне сделать свой код так, чтобы два процесса могли работать одновременно?
C ++ Arduino, запускающий сразу два цикла?
Ответы (3)
Что-то вроде:
int timekeeper=0;
while (1)
{
do_fade(timekeeper);
if (timekeeper%100==0) {
do_blink_off();
}
if (timekeeper%100==50) {
do_blink_on();
}
delay(10);
timekeeper++;
}
Это делается по памяти, поэтому ваш пробег может отличаться. Я передал timekeeper в do_fade (), чтобы вы могли определить, как далеко вы продвинулись в процессе затухания. do_fade () обновит затухание, а затем немедленно вернется. do_blink_on () и do_blink_off () будут похожи - измените то, что вам нужно изменить, затем вернитесь. В этом примере do_fade () будет вызываться каждые 10 миллисекунд, do_blink_off () один раз в секунду, а do_blink_on () через 1/2 секунды после (так далее, 1/2 секунды, выключено, 1/2 секунды, включено, 1 / 2 секунды ...)
Ответ AMADANON будет работать, однако имейте в виду, что предпочтительный способ выполнения нескольких задач, таких как это, - это прерывания таймера. Например, если вы хотите, чтобы ваш код делал что-то еще после его исчезновения, синхронизация этих других функций будет мешать миганию вашего светодиода. Чтобы решить эту проблему, вы используете таймеры, встроенные в Arduino.
В фоновом режиме таймер ведет отсчет, и когда он достигает определенного значения, он сбрасывает его счетчик и запускает процедуру обслуживания прерывания, в которой вы должны включить / выключить светодиод.
Вот руководство по миганию светодиода при прерывании таймера: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/
Попробуйте ОСРВ для Arduino.
Вы создаете задачи, которые представляют собой отдельные циклы. Пользуюсь, работает нормально.
https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc.
Также я рекомендую использовать PlatformIO со средой Arduino. Затем вы также можете импортировать RTOS через библиотеку.
Примеры фрагментов кода:
В настройке:
void TaskMotion( void *pvParameters ); // Senses input from the motion sensor
а также
xTaskCreate( // Create task
TaskMotion
, "Motion" // A name just for humans
, 12800 // Stack size
, NULL
, 1 // priority
, NULL );
... ниже цикла Arduino (не имеющего ничего, кроме задержки (1000); in):
// ╔╦╗╔═╗╔╦╗╦╔═╗╔╗╔ ╔═╗╔═╗╔╗╔╔═╗╔═╗╦═╗
// ║║║║ ║ ║ ║║ ║║║║ ╚═╗║╣ ║║║╚═╗║ ║╠╦╝
// ╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝ ╚═╝╚═╝╝╚╝╚═╝╚═╝╩╚═
void TaskMotion(void *pvParameters) // This is a task.
{
(void) pvParameters;
// initialize stuff.
for (;;) // A Task shall never return or exit.
{
Serial.println("TEST MOTION");
delay(10000);
}
}
Скопируйте пасту и измените "TaskMotion" на "LED something". Вы можете создать столько задач, сколько захотите. ОСРВ управляет каждой задачей. Например, если одна задача имеет задержку (10), то следующие 10 мс используются для другой задачи.