C ++ Arduino, запускающий сразу два цикла?

Хорошо, я только недавно погрузился в программирование Arduino. В настоящее время у меня есть базовая функция мигания вместе с программой светодиодов RGB, которая меняет светодиоды на синий, зеленый и красный в исчезающих цветах. У меня есть 2 светодиода, простой и основной желтый светодиод, который должен работать как индикатор «рабочего состояния». И светодиод RGB. Теперь я хочу, чтобы цветовой переход RGB проходил нормально, хотя я хочу, чтобы желтый светодиод постоянно мигал. Как мне сделать свой код так, чтобы два процесса могли работать одновременно?


person Mohammad Al-Ahdal    schedule 28.06.2013    source источник


Ответы (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 секунды ...)

person AMADANON Inc.    schedule 28.06.2013
comment
Выглядит неплохо. Единственное, что я бы добавил, это то, что вы не ограничены использованием одного счетчика, если ваши тайминги не связаны - вы можете управлять несколькими счетчиками независимо. Вам также не нужно делать модуло, если вы моргаете на 50 и сбрасываете на ноль на 100, когда вы мигаете. - person paddy; 28.06.2013
comment
Если бы у меня были независимые часы, я бы сделал статику в каждой функции (и объединил do_blink_on / off в одну). Я действительно считал это ответом, но я подумал, что это, вероятно, будет слишком продвинутым для тех, кому нужно задать вышеупомянутый вопрос. - person AMADANON Inc.; 28.06.2013

Ответ AMADANON будет работать, однако имейте в виду, что предпочтительный способ выполнения нескольких задач, таких как это, - это прерывания таймера. Например, если вы хотите, чтобы ваш код делал что-то еще после его исчезновения, синхронизация этих других функций будет мешать миганию вашего светодиода. Чтобы решить эту проблему, вы используете таймеры, встроенные в Arduino.

В фоновом режиме таймер ведет отсчет, и когда он достигает определенного значения, он сбрасывает его счетчик и запускает процедуру обслуживания прерывания, в которой вы должны включить / выключить светодиод.

Вот руководство по миганию светодиода при прерывании таймера: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

person user2461391    schedule 28.06.2013

Попробуйте ОСРВ для Arduino.

Вы создаете задачи, которые представляют собой отдельные циклы. Пользуюсь, работает нормально.

https://create.arduino.cc/projecthub/feilipu/using-freertos-multi-tasking-in-arduino-ebc3cc.

Также я рекомендую использовать PlatformIO со средой Arduino. Затем вы также можете импортировать RTOS через библиотеку.

https://platformio.org/

Примеры фрагментов кода:

В настройке:

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 мс используются для другой задачи.

person nolimits    schedule 04.04.2020