好的,所以我刚刚开始编程Arduino,目前我有基本的闪烁功能以及RGB LED程序,可以将LED变为蓝色,绿色和红色的褪色。我有2个LED是一个简单的基本黄色LED,它应该作为“工作状态”的指示器。还有一个RGB的LED。现在我希望RGB一般通过它的颜色过渡,虽然我想保持黄色LED不断闪烁。 我如何制作代码以便两个进程可以同时运行?
答案 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。
示例代码段:
在设置中:
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毫秒将用于另一个任务。