好的,所以我最近才开始编写 Arduino,目前我具有基本的闪烁功能以及 RGB LED 程序,该程序可以将 LED 更改为蓝色、绿色和红色的渐变色。我有 2 个 LED 一个简单而基本的黄色 LED,它应该用作“工作状态”的指示器。还有一个 RGB 的 LED。现在我希望 RGB 能够正常转换颜色,尽管我想让黄色 LED 不断闪烁。我应该如何编写代码以便两个进程可以同时运行?
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++;
}
这是根据记忆完成的,因此您的里程可能会有所不同。我已将计时器传递给 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 秒...)
AMADANON 的答案会起作用,但请记住,执行此类多项任务的首选方法是使用定时器中断。例如,如果您希望您的代码在它消失后执行其他操作,那么这些其他功能的时间会干扰您的 LED 闪烁。为了解决这个问题,您可以使用 Arduino 中内置的计时器。
在后台,一个计时器正在向上计数,当它达到某个值时,它会重置它的计数器并触发中断服务程序,您可以在此处打开/关闭 LED。
这是一个使用定时器中断闪烁 LED 的教程: http ://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/
为 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循环下方(只有延迟(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 毫秒将用于另一项任务。