什麼是Arduino Ticker庫?


Arduino中的Ticker庫可以幫助你執行固定間隔的操作。它是使用**delay()**作為間隔的一個很好的替代方案,因為它可以提供非阻塞的使用方式。此庫不使用任何硬體定時器中斷。相反,它使用**micros()**和**millis()**來組織你的任務。你只需要為此庫提供要呼叫的函式名稱、間隔時間以及應該重複多少次。庫會完成其餘的工作。

示例

要安裝此庫,請開啟庫管理器,搜尋“**Ticker**”。安裝Stefan Staub的庫。

安裝庫後,轉到**檔案 → 示例 → Ticker → Ticker**。

示例草圖以包含庫開頭。

#include "Ticker.h"

然後,宣告我們將用作回撥的5個函式。此外,還定義了幾個全域性變數。使用Ticker庫,回撥的數量沒有限制。

void printMessage();
void printCounter();
void printCountdown();
void blink();
void printCountUS();
bool ledState;
int counterUS;

下一部分很重要。定義了5個Ticker物件。

Ticker timer1(printMessage, 0, 1);
Ticker timer2(printCounter, 1000, 0, MILLIS);
Ticker timer3(printCountdown, 1000, 5);
Ticker timer4(blink, 500);
Ticker timer5(printCountUS, 100, 0, MICROS_MICROS);

Ticker物件建構函式的語法為:

Ticker ticker_name(fptr callback, uint32_t timer, uint16_t repeats, interval_t mode)

其中,

  • **callback**是要呼叫的函式

  • **timer**是毫秒或微秒的時間間隔,具體取決於模式。

  • **repeats**是應觸發此回撥的次數(0表示無限次,是預設選項)

**mode**可以有3個值:

  • **MILLIS** - 定時器單位為毫秒,內部解析度為毫秒

  • **MICROS** - 定時器單位為毫秒,內部解析度為微秒(預設)

  • **MICROS_MICROS** - 定時器單位為微秒,內部解析度為微秒

使用預設模式(MICROS),你可以擁有長達70分鐘的時間間隔。對於更長的時間間隔,請使用MILLIS。因此,

  • timer1回撥僅觸發一次,並且立即觸發(間隔=0)

  • timer2回撥每1000毫秒觸發一次,間隔解析度為毫秒。

  • timer3回撥觸發5次,每秒一次。

  • timer4回撥每500毫秒觸發一次。

  • timer5回撥每100微秒觸發一次,內部解析度為微秒。

在setup中,你啟動了之前定義的Ticker物件。

void setup() {
   pinMode(LED_BUILTIN, OUTPUT);
   Serial.begin(9600);
   delay(2000);
   timer1.start();
   timer2.start();
   timer3.start();
   timer4.start();
   timer5.start();
}

在loop中,你不斷呼叫**.update()**函式,該函式本質上檢查Ticker並在必要時執行**callback**函式。

void loop() {
   timer1.update();
   timer2.update();
   timer3.update();
   timer4.update();
   timer5.update();
   if (timer4.counter() == 20) timer4.interval(200);
   if (timer4.counter() == 80) timer4.interval(1000);
}

請注意,loop中沒有**delay()**,即使在定時器啟動後的setup中也沒有。根據官方文件,“如果你使用**delay()**,Ticker將被忽略!你不能將**delay()**命令與**TimerObject**一起使用。代替使用delay,你可以使用Ticker本身。例如,如果你需要你的迴圈每秒執行兩次,只需建立一個間隔為500毫秒的Ticker。它將與**delay**(500)具有相同的結果,但你的程式碼將始終處於狀態。”

本質上,Ticker函式使用**delay()**使用的底層定時器。因此,你不能將delay與Ticker物件一起使用。

**.counter()**函式返回已執行的**callback**數量。因此,我們在觸發20次後更改timer4的間隔,然後在觸發80次後再次更改。

稍後,給出了5個回撥函式的定義,這些函式或多或少是不言自明的。

void printCounter() {
   Serial.print("Counter ");
   Serial.println(timer2.counter());
}
void printCountdown() {
   Serial.print("Countdowm ");
   Serial.println(5 - timer3.counter());
}
void printMessage() {
   Serial.println("Hello!");
}
void blink() {
   digitalWrite(LED_BUILTIN, ledState);
   ledState = !ledState;
}
void printCountUS() {
   counterUS++;
   if (counterUS == 10000) {
      Serial.println("10000 * 100us");
      counterUS = 0;
   }
}

你可以使用此庫以固定間隔執行任務,無論是無限次還是特定次數。

更新於:2021年7月26日

3K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告