今天在一個小東西,需要實現在arduino上兩個led燈不同頻率閃爍,這就麻煩了,以爲arduino同時只能實現一個函數的運行,
一般情況下,處理 Arduino 的多個任務,是把所有任務放在 void loop() 裏,然後用 delay() 控制時間。不過,任務一多,這種方法就不太方便了。
這個時候我在網上找到了一篇博客,他利用任務調度器來實現多任務運行。
我貼出代碼,大家可以參考一下
#include "TaskScheduler.h" //包含此頭文件,才能使用調度器
// 用於儲存 LED 狀態
boolean g_led1State=1;
boolean g_led2State=0;
void setup()
{
// 第12、13腳接有 LED
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
Sch.init(); //初始化調度器
//向調度器中添加任務
//第一個參數爲要添加任務的函數名
//第二個參數爲任務第一次執行的時間,
// 合理設置有利於防止任務重疊,有利以提高任務執行的精度
//第三個參數是任務執行的週期
//第二、三個參數的單位均爲毫秒,也可配置定時器修改其單位
//第四個參數代表任務是合作式還是搶佔式
// 一般取1就可以,更多用法請參考下文
Sch.addTask(led1Update,0,1000,1); //從第 0 毫秒開始閃爍 LED,每隔 1s, LED 狀態改變一次
Sch.addTask(led2Update,20,500,1); //從第 20 毫秒開始閃爍 LED,每隔 0.5s, LED 狀態改變一次
Sch.start();//啓動調度器
}
void loop()
{
Sch.dispatchTasks(); // 執行被調度的任務,用調度器時放上這一句即可
}
// 把要調度的任務函數放下面
// 閃爍第 13 腳的 LED
void led1Update()
{
if(g_led1State==0)
{
g_led1State=1;
digitalWrite(13,HIGH);
}
else
{
g_led1State=0;
digitalWrite(13,LOW);
}
}
// 閃爍第 12 腳的 LED
void led2Update()
{
if(g_led2State==0)
{
g_led2State=1;
digitalWrite(12,HIGH);
}
else
{
g_led2State=0;
digitalWrite(12,LOW);
}
}
代碼的頭文件
程序執行後,兩個 LED 分別會以程序中指定的週期和時間閃爍。
更多功能