什麼是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;
}
}你可以使用此庫以固定間隔執行任務,無論是無限次還是特定次數。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP