2016-09-30 136 views
0

我正在使用一個按鈕來觸發一個繼電器;代碼如下。如何編程Arduino忽略按下按鈕後按下按鈕5分鐘?

我想編程我的Arduino忽略任何後續按下按鈕5分鐘的時間。我如何在我的Arduino草圖中包含這個功能?

這樣做的目的是禁止用戶重複觸發繼電器,反覆按下按鈕直至間隔5分鐘。這是用於公共藝術作品的,如下所示,需要施加這樣的限制以保證作品的適當使用。

int pinButton = 8; 
int Relay = 2; 
int stateRelay = LOW; 
int stateButton; 
int previous = LOW; 
long time = 0; 
long debounce = 500; 
int stayON = 5000; //stay on for 5000 ms 

void setup() { 
    pinMode(pinButton, INPUT); 
    pinMode(Relay, OUTPUT); 
} 

void loop() { 
    stateButton = digitalRead(pinButton); 
    if(stateButton == HIGH && previous == LOW && millis() - time > debounce) { 
    if(stateRelay == HIGH){ 
     digitalWrite(Relay, LOW); 
    } else { 
     digitalWrite(Relay, HIGH); 
     delay(stayON); 
     digitalWrite(Relay, LOW); 
    } 
    time = millis(); 
    } 
    previous == stateButton; 
} 

回答

0

您可以添加一個變量來存儲上次顯示被激活的時間。然後,您可以將您的else語句更改爲elseif語句,在該語句中將當前運行時間與上次激活時間進行比較。這與您使用的去抖方法類似。

long lastActivated = 0; //last time display was activated 
long myDelay = 300000; //5 minutes in millis 


    if(stateButton == HIGH && previous == LOW && millis() - time > debounce) { 
    if(stateRelay == HIGH){ 
     digitalWrite(Relay, LOW); 
    } else if (millis() - lastActivated > myDelay) { //verifies it's been 5 minutes 
     digitalWrite(Relay, HIGH); 
     delay(stayON); 
     digitalWrite(Relay, LOW); 
     lastActivated = millis(); //resets lastActivated when display is allowed to activate 
    } 
    time = millis(); 
    } 
+0

注意,'米利斯()'[後約50天溢出](https://www.arduino.cc/en/Reference/Millis)等按鈕按壓50天和0和5之間前一分鐘後的分鐘也將被忽略。儘管Arduinos通常不會連續運行50次,但這不太可能發生。 –