瑞龍關廟鳳梨資訊網

瑞龍關廟鳳梨資訊網
瑞龍關廟鳳梨資訊網

2021年5月21日 星期五

Arduino定時器庫: Timer庫


該庫不會干擾內置計時器,它只是在粗略類型的調度程序中使用“ millis”來決定何時需要執行操作

Arduino的“delay”功能既是福也是禍。
它非常適合向初學者展示如何製作LED閃光燈。但是,一旦您變得更加複雜並開始放慢“循環”功能,您就會遇到問題。
delay延遲方法的缺點是,在“delay”發生時,其他任何事情都無法繼續進行。例如,您無法更新顯示或檢查按鍵。

一個典型的例子是打開繼電器10分鐘。“延遲”方式如下所示:

int pin = 13;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(pin, HIGH);
  delay(10 * 60 * 60 * 1000);
  digitalWrite(pin, LOW);
}

void loop()
{
}

 “ Timer”庫版本如下所示:

#include "Timer.h"

Timer t;
int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
  t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes  
}

void loop()
{
  t.update();
}
'pulse'方法採用引腳的參數進行更改,更改引腳的周期以及其初始狀態。 除非經過適當的時間,否則對t.update()的調用將耗時數微秒。

讓我們看一下使用兩個計時器事件的另一個示例。
一個使LED閃爍,另一個使A0閃爍並在串行監視器中顯示結果。
#include "Timer.h"

Timer t;
int pin = 13;

void setup()
{
  Serial.begin(9600);
  pinMode(pin, OUTPUT);
  t.oscillate(pin, 100, LOW);
  t.every(1000, takeReading);
}

void loop()
{
  t.update();
}

void takeReading()
{
  Serial.println(analogRead(0));
}
首先要注意的是,我們正在使用一個名為“ takeReading”的回調函數。我們使用“ every”命令將其連接到Timer,在這種情況下,它將每秒調用一次該函數。

我們還使用“振盪”方法將另一個事件附加到計時器。這將導致LED每100毫秒切換一次狀態。

每個事件都有一個與之關聯的整數ID,因此您可以停止一個事件,


如下面的示例所示,它將每2秒寫入一次串行監視器,使LED閃爍,並在5秒鐘後停止LED快速閃爍,然後緩慢閃爍5次
#include "Timer.h"

Timer t;

int ledEvent;

void setup()
{
  Serial.begin(9600);
  int tickEvent = t.every(2000, doSomething);
  Serial.print("2 second tick started id=");
  Serial.println(tickEvent);
  
  pinMode(13, OUTPUT);
  ledEvent = t.oscillate(13, 50, HIGH);
  Serial.print("LED event started id=");
  Serial.println(ledEvent);
  
  int afterEvent = t.after(10000, doAfter);
  Serial.print("After event started id=");
  Serial.println(afterEvent); 
  
}

void loop()
{
  t.update();
}

void doSomething()
{
  Serial.print("2 second tick: millis()=");
  Serial.println(millis());
}


void doAfter()
{
  Serial.println("stop the led event");
  t.stop(ledEvent);
  t.oscillate(13, 500, HIGH, 5);
}

您最多可以將10個事件附加到計時器。

Installation安裝

As with all libraries, unzip the file into the 'libraries' folder in your Arduino directory,
 與所有庫一樣,解壓縮文件放入Arduino目錄中的“ libraries”文件夾

Reference引用


int every(long period, callback)
 Run the 'callback' every 'period' milliseconds.
 Returns the ID of the timer event.
(長周期,回調)
 每隔“週期”毫秒運行一次“回調”。
 返回計時器事件的ID。

int every(long period, callback, int repeatCount)
 Run the 'callback' every 'period' milliseconds for a total of 'repeatCount' times.
 Returns the ID of the timer event.
(長周期,回調,int repeatCount)
 每隔“週期”毫秒運行一次“回調”,共計“ repeatCount”次。
 返回計時器事件的ID。

int after(long duration, callback)
 Run the 'callback' once after 'period' milliseconds.
 Returns the ID of the timer event.
(長持續時間,回調)
 在“週期”毫秒後運行一次“回調”。
 返回計時器事件的ID。

int oscillate(int pin, long period, int startingValue)
 Toggle the state of the digital output 'pin' every 'period' milliseconds. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.
 Returns the ID of the timer event.
(int引腳,長時間,int startingValue)
 每“週期”毫秒切換一次數字輸出“ pin”的狀態。引腳的起始值在“ startingValue”中指定,應為HIGH或LOW。
 返回計時器事件的ID。

int oscillate(int pin, long period, int startingValue, int repeatCount)
 Toggle the state of the digital output 'pin' every 'period' milliseconds 'repeatCount' times. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.
 Returns the ID of the timer event.
(int引腳,長周期,int起始值,int repeatCount)
 每“週期”毫秒“ repeatCount”次切換數字輸出“ pin”的狀態。引腳的起始值在“ startingValue”中指定,應為HIGH或LOW。
 返回計時器事件的ID。

int pulse(int pin, long period, int startingValue)
 Toggle the state of the digital output 'pin' just once after 'period' milliseconds. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.
 Returns the ID of the timer event.
整數引腳,長周期,整數開始值)
 在“週期”毫秒後僅切換一次數字輸出“ pin”的狀態。引腳的起始值在“ startingValue”中指定,應為HIGH或LOW。
 返回計時器事件的ID。

int stop(int id)
 Stop the timer event running.
 Returns the ID of the timer event.
停止運行計時器事件。
 返回計時器事件的ID。

int update()
 Must be called from 'loop'. This will service all the events associated with the timer.
必須從“循環”中調用。這將處理與計時器關聯的所有事件

沒有留言:

張貼留言