0

好的,所以我最近才开始编写 Arduino,目前我具有基本的闪烁功能以及 RGB LED 程序,该程序可以将 LED 更改为蓝色、绿色和红色的渐变色。我有 2 个 LED 一个简单而基本的黄色 LED,它应该用作“工作状态”的指示器。还有一个 RGB 的 LED。现在我希望 RGB 能够正常转换颜色,尽管我想让黄色 LED 不断闪烁。我应该如何编写代码以便两个进程可以同时运行?

4

3 回答 3

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/2 秒,开,1 /2 秒...)

于 2013-06-28T02:44:18.407 回答
1

AMADANON 的答案会起作用,但请记住,执行此类多项任务的首选方法是使用定时器中断。例如,如果您希望您的代码在它消失后执行其他操作,那么这些其他功能的时间会干扰您的 LED 闪烁。为了解决这个问题,您可以使用 Arduino 中内置的计时器。

在后台,一个计时器正在向上计数,当它达到某个值时,它会重置它的计数器并触发中断服务程序,您可以在此处打开/关闭 LED。

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

于 2013-06-28T13:13:11.390 回答
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循环下方(只有延迟(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”。您可以根据需要创建任意数量的任务。RTOS 管理每个任务。就像如果一个任务有延迟(10),那么接下来的 10 毫秒将用于另一项任务。

于 2020-04-04T02:36:35.587 回答