請先下載 Timer 庫。並解壓縮到 Arduino 專案路徑下 (存檔路徑)
https://github.com/JChristensen/Timer#installation
傳統我們要控制 LED 閃爍頻率則是修改 delay() 延遲時間,但是如果之後要讓 10 個 LED 以不同頻率閃爍則非常困難。如果之後只是要修改其中一個LED頻率,那麼其他9個LED也要修改,而且還要大量計算好時間,這是非常不容易維護的。如下是使用傳統作法:
int pin = 13; void setup() { pinMode(13, OUTPUT); digitalWrite(pin, HIGH); delay(10 * 60 * 1000); digitalWrite(pin, LOW); } void loop() { }
下面程式碼是使用 Timer 庫,而達到與上面程式碼相同的結果,但更好維護。下方程式碼是Arduino啟動後 10分鐘後,切換 pin 13 狀態 ( 只做一次 )
#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(); }
下面程式碼是每 100毫秒 切換 Pin 13 狀態 (無限循環)。並每 1 秒呼叫 takeReading() 函式(方法) ,將讀取 類比 Pin 0 信號並方送至PC端。
#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*)0); } void loop() { t.update(); } void takeReading(void *context) { Serial.println(analogRead(0)); }
下面就是綜合運用了:
#include "Timer.h" Timer t; int ledEvent; void setup() { Serial.begin(9600); int tickEvent = t.every(2000, doSomething, (void*)0); 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, (void*)0); Serial.print("After event started id="); Serial.println(afterEvent); } void loop() { t.update(); } void doSomething(void *context) { Serial.print("2 second tick: millis()="); Serial.println(millis()); } void doAfter(void *context) { Serial.println("stop the led event"); t.stop(ledEvent); t.oscillate(13, 500, HIGH, 5); }
文章標籤
全站熱搜

*****
你好,想請問說timer可以讀取arduino 自製出來的pwm的duty on 的時間嗎? 因為我需要比較兩個波型的on 的時間去改變我最後輸出波型的狀態,這樣的情況可以做到嗎?
版主您好,你的Arduino入門教學讓我受益良多,感謝你的付出,讓我們這種入門者可以有更友善的學習環境。 另外想請教一點,如果今天我在運行一個2小時一個循環的程式(機器),但用到一半我將機器關掉,有辦法在下一次啟動時,讓它從我之前中斷的時間點繼續跑嗎? 謝謝您。
想請問版主 我想用一組光遮開關去控制 A LED 會根據光遮動作...B LED 希望是觸發點亮後10秒就熄滅 目前我是這樣寫..但是B LED 觸發Ttimer 一次後..就不會復原(歸零) (要計時點亮B LED, 只要點亮一段時間後自動熄滅) 請問要怎麼寫才可以呢? 謝謝 #include "Timer.h" Timer t; int photocellPin = 2; //定义变量photocellsh=2,为电压读取端口。 int ledPin = 12; int pin = 11; int val = 0; //定义val变量的起始值 void setup() { pinMode(ledPin, OUTPUT); pinMode(pin, OUTPUT); t.pulse(pin, 1000, LOW); } void loop() { val = analogRead(photocellPin); //从传感器读取值 if(val<=512){ //512=2.5V digitalWrite(ledPin, HIGH); //当val小于512(2.5V)的时候,led亮。 digitalWrite(pin, LOW); } else{ t.update(); digitalWrite(ledPin, LOW); } }
想請問版主 我想用一組光遮開關去控制 A LED 會根據光遮動作...B LED 希望是觸發點亮後10秒就熄滅 目前我是這樣寫..但是B LED 觸發Ttimer 一次後..就不會復原(歸零) (要計時點亮B LED, 只要點亮一段時間後自動熄滅) 請問要怎麼寫才可以呢? 謝謝 #include "Timer.h" Timer t; int photocellPin = 2; //定义变量photocellsh=2,为电压读取端口。 int ledPin = 12; int pin = 11; int val = 0; //定义val变量的起始值 void setup() { pinMode(ledPin, OUTPUT); pinMode(pin, OUTPUT); t.pulse(pin, 1000, LOW); } void loop() { val = analogRead(photocellPin); //从传感器读取值 if(val<=512){ //512=2.5V digitalWrite(ledPin, HIGH); //当val小于512(2.5V)的时候,led亮。 digitalWrite(pin, LOW); } else{ t.update(); digitalWrite(ledPin, LOW); } }
您好, 可以請教您 stm32f103 的 usb vcp 問題嗎?
如果我的callfunction是需要帶參數的 那t.every(1000, callfunction, ???) 該怎麼帶參數進入呢? 謝謝