首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Arduino,同时运行两个循环?

C++ Arduino,同时运行两个循环?
EN

Stack Overflow用户
提问于 2013-06-28 10:37:12
回答 3查看 4.9K关注 0票数 0

好的,我最近开始了Arduino的编程,目前我有基本的闪烁功能,以及一个RGB LED程序,它可以将LED在褪色时转换为蓝色、绿色和红色。我有两个LED,一个简单而基本的黄色LED,它被认为是一个“工作状态”的指示器。和一个RGB的LED。现在,我希望RGB one能够正常地通过它的颜色转换,尽管我想保持黄色LED的持续闪烁。如何编写代码以使两个进程可以同时运行?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-28 10:44:18

类似于:

代码语言:javascript
复制
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秒,off,1/2秒,on,1/2秒...)

票数 2
EN

Stack Overflow用户

发布于 2013-06-28 21:13:11

AMADANON的答案是有效的,但是请记住,像这样做多个任务的首选方法是使用计时器中断。例如,如果您希望代码在淡入淡出后执行其他操作,这些其他函数的计时将干扰您的LED闪烁。为了解决这个问题,您可以使用Arduino中内置的计时器。

在后台,计时器开始计数,当计时器达到某个值时,它会重置计数器并触发中断服务例程,您可以在该例程中打开/关闭LED。

这里有一个关于用定时器中断闪烁发光二极管的教程:http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/

票数 1
EN

Stack Overflow用户

发布于 2020-04-04 10:36:36

尝试用于Arduino的RTOS。

您创建的任务是独立的循环。我使用它,它工作得很好。

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

此外,我还建议在Arduino环境中使用PlatformIO。然后,您还可以通过库导入RTOS。

https://platformio.org/

示例代码片段:

在设置中:

代码语言:javascript
复制
void TaskMotion( void *pvParameters ); // Senses input from the motion sensor

代码语言:javascript
复制
  xTaskCreate( // Create task
    TaskMotion
    ,  "Motion"   // A name just for humans
    ,  12800  // Stack size
    ,  NULL
    ,  1  // priority
    ,  NULL );

..。在Arduino循环下(只有延迟(1000);in):

代码语言:javascript
复制
//  ╔╦╗╔═╗╔╦╗╦╔═╗╔╗╔  ╔═╗╔═╗╔╗╔╔═╗╔═╗╦═╗
//  ║║║║ ║ ║ ║║ ║║║║  ╚═╗║╣ ║║║╚═╗║ ║╠╦╝
//  ╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝  ╚═╝╚═╝╝╚╝╚═╝╚═╝╩╚═
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毫秒将用于另一个任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17356368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档