瑞龍關廟鳳梨資訊網

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

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.
必須從“循環”中調用。這將處理與計時器關聯的所有事件

中文arduino範例 Blink without Dela( 閃爍板載LED 不使用delay函數)

 

前言:
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()}

進入本範例:

/*

  Blink without Delay


  Turns on and off a light emitting diode (LED) connected to a digital pin,

  without using the delay() function. This means that other code can run at the

  same time without being interrupted by the LED code.


  The circuit:

  - Use the onboard LED.

  - Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA

    and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN

    is set to the correct LED pin independent of which board is used.

    If you want to know what pin the on-board LED is connected to on your

    Arduino model, check the Technical Specs of your board at:

    https://www.arduino.cc/en/Main/Products


  created 2005

  by David A. Mellis

  modified 8 Feb 2010

  by Paul Stoffregen

  modified 11 Nov 2013

  by Scott Fitzgerald

  modified 9 Jan 2017

  by Arturo Guadalupi


  This example code is in the public domain.


  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

*/


複製以下紅色段程式碼到 Arduino IDE

const int ledPin =  LED_BUILTIN;

int ledState = LOW;     

unsigned long previousMillis = 0;      

const long interval = 1000;  

void setup() {

  pinMode(ledPin, OUTPUT);

}

void loop() {

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {

    previousMillis = currentMillis;

    if (ledState == LOW) {

      ledState = HIGH;

    } else {

      ledState = LOW;

    }

    digitalWrite(ledPin, ledState);

  }

}


中文翻譯

/ *

  閃爍板載LED 不使用delay函數

  打開和關閉連接到數字引腳的發光二極管(LED),

  而不使用delay()函數。這意味著其他代碼可以在

  同時不會被LED代碼打斷。


  電路:

  -使用板載LED。

  -注意:大多數Arduino都有一個您可以控制的板載LED。在ArduinoUNO,ArduinoMEGA,ArduinoZERO連接到數字引腳13,-而MKR1000 則位於引腳 6。

LED_BUILTIN設置為正確的LED引腳,與使用哪個板無關。

如果您想知道板上LED連接到哪個引腳,Arduino模型,請在以下位置查看開發板的技術規格:

    https://www.arduino.cc/en/主要/產品


  創建於2005年

  大衛·梅利斯(David A.Mellis)

  於2010年2月8日修改

  保羅·斯托弗雷根(Paul Stoffregen)

  於2013年11月11日修改

  由斯科特·菲茨杰拉德(Scott Fitzgerald)

  於2017年1月9日修改

  通過阿圖羅·瓜達盧皮(Arturo Guadalupi)


  此示例代碼在公共領域。


  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

* /


//常量不會改變。用於設置板載LED:

const int ledPin = LED_BUILTIN; // LED引腳號

(const不能被編譯的變數int整數

//ledState變量將更改:

int ledState = LOW; // ledState用於設置LED


//通常,對於保留時間的變量,應使用“ unsigned long”

//該值很快會變得太大而無法存儲 int

unsigned  long previousMillis = 0; //將存儲上次更新LED的時間

  (unsigned long 無符號 長)   (以前的Millis)

//常量不會改變:

const long interval = 1000; //閃爍間隔(毫秒)

 long長變量 

void setup(){

  //將數字引腳設置為輸出:

   pinMode(ledPin, OUTPUT);

}

}


void loop() {

  //在這裡放置需要一直運行的代碼。

  //檢查是否是時候讓LED閃爍了;也就是說,如果差異

  //在當前時間和上次閃爍之間,LED大於

  //您要使LED閃爍的時間間隔。

  unsigned long currentMillis = millis();


  if(currentMillis-previousMillis> = interval){

    //保存上一次您使LED閃爍的時間

    previousMillis = currentMillis;


    //如果LED熄滅,則將其打開,反之亦然:

    if (ledState == LOW) {

      ledState = HIGH;

    } else {

      ledState = LOW;

    }

 //使用變量的ledState設置LED:

   digitalWrite(ledPin, ledState);

  }

}






}