2016-06-09 186 views
1

Arduino Nano和我需要一個定時器內的定時器,並有一些問題讓我的頭繞着邏輯。我在GitHub,Timer,SimpleTimer和Metro上玩過一些庫,但似乎沒有做我需要的。或者,如果他們能,我似乎無法讓他們這樣做。定時器內的Arduino定時器

我需要開關繼電器約2分鐘,然後關閉,每小時。我想

loop 
{ if (millis() - 3600000 > TimeMax) 
    { relay(on); 
    if (millis() - 12000 > relayMax) 
    TimeMax = millis(); 
    } 
} 

它似乎沒有工作,我需要這一切留在「循環」中工作,因爲我有一個nRF24L收聽廣播。

有人可以幫助我的代碼片段或至少一個大綱如何去做這件事。

感謝

+0

爲什麼嵌套定時器?你不能在內部觸發外部時間嗎?有一個定時器打開繼電器,同時激活另一個定時器,它在2分鐘後開始關閉繼電器。 –

回答

2

好吧,首先定時器在嵌入式開發講的是指被延遲一段時間後發射中斷。一般而言,您希望中​​斷處理非常原子的操作,因爲您不希望在觸發另一箇中斷時觸發中斷,因爲這可能是恐怖電影的場景。

但是,當它可以變得簡單時,爲什麼要製作一些困難,複雜和過度工程?

所有你需要做的是通過一個簡單的雙狀態機處理:

#define OPEN_DELAY 120*1000 
#define CLOSE_DELAY 3600*1000 
// N.B.: to be precise here, to make 2 minutes every hour, 
// CLOSE_DELAY should be 3600*1000-OPEN_DELAY so it 
// does not shift by 2 minutes every hour. 

void loop() { 
    static bool open=false; 
    static long timestamp = millis(); 

    if (!open && millis()-timestamp > CLOSE_DELAY) { 
     open=true;   // change state 
     timestamp = millis(); // rearm timestamp 
     set_relay_on(); 
    } else if (open && millis()-timestamp > OPEN_DELAY) { 
     open=false; 
     timestamp = millis(); 
     set_relay_off(); 
    } 
} 

你可能想使用定時器將通過保持AVR處於休眠模式,以節省電池儘可能多的唯一理由可能。然後,在將它置於睡眠狀態之前,將定時器設置爲可能的最大值,使其每隔幾秒左右喚醒一次AVR,然後在CLOSE狀態中運行loop()一次,然後再次進入睡眠狀態 - 不需要編寫一個ISR,主循環()就足夠了,或者在OPEN狀態下保持整整兩分鐘。

有一個關於定時器好的文檔,你可能需要閱讀(當心頭痛,雖然):

下面是如何把Arduino的睡了長時間的延遲:

HTH

+1

謝謝,我會嘗試。我很欣賞你進入的細節。 – user2175495