C ++ Arduino,一次运行两个循环?

时间:2013-06-28 02:37:12

标签: c++ arduino led arduino-ide

好的,所以我刚刚开始编程Arduino,目前我有基本的闪烁功能以及RGB LED程序,可以将LED变为蓝色,绿色和红色的褪色。我有2个LED是一个简单的基本黄色LED,它应该作为“工作状态”的指示器。还有一个RGB的LED。现在我希望RGB一般通过它的颜色过渡,虽然我想保持黄色LED不断闪烁。 我如何制作代码以便两个进程可以同时运行?

3 个答案:

答案 0 :(得分:2)

类似的东西:

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++;
}

这是从记忆中完成的,因此您的里程可能会有所不同。 我已经把计时器传给do_fade(),所以你可以弄清楚你的褪色程度。 do_fade()会更新淡入淡出,然后立即返回。 do_blink_on()和do_blink_off()类似 - 改变你需要改变的东西,然后返回。在这个例子中,do_fade()每10毫秒调用一次,do_blink_off()每秒调用一次,do_blink_on()每秒调用1/2(所以,1秒,关闭,1/2秒,开启,1 / 2秒......)

答案 1 :(得分:1)

AMADANON的答案是有效的,但请记住,执行此类多项任务的首选方法是使用计时器中断。例如,如果您希望代码在淡入淡出后执行其他操作,则其他功能的时序将干扰LED闪烁。要解决此问题,请使用Arduino中内置的计时器。

在后台,计时器正在计数,当它达到某个值时,它会重置它的计数器并触发中断服务程序,这是你打开/关闭LED的地方。

这是一个关于使用定时器中断闪烁LED的教程: http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

答案 2 :(得分:0)

尝试使用Arduino的RTOS。

您创建的任务是单独的循环。我用它,它很好用。

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

此外,我建议在Arduino环境中使用PlatformIO。然后,您也可以通过该库导入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循环下面(除了delay(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指示灯”。您可以创建任意数量的任务。 RTOS管理每个任务。就像一个任务有一个延迟(10)一样,接下来的10毫秒将用于另一个任务。