請先下載 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);
}






 

    全站熱搜

    黃彥霖 發表在 痞客邦 留言(6) 人氣()