2015-04-20 97 views
5

我從我的一個剛剛開始使用arduino的學生那裏得到了一些代碼。Arduino AttachInterrupt()似乎運行兩次

他試圖做一箇中斷,它的工作。事情是它運行了兩次(他稱之爲函數),所以布爾值被重置。

我試圖找到答案,但我找不到任何,所以我在這裏。

請幫幫我。

boolean state = 1 ; 
void setup() 

{ 
pinMode (2 , INPUT); 
pinMode (8 , OUTPUT); 
Serial.begin(38400);   
attachInterrupt(0 , ngt, RISING); 


} 


void loop() 

{ 

Serial.println (digitalRead(2)); 
digitalWrite (8 , state); 
delay(50); 

} 

void ngt() 
{ 

state = !state ; 


} 
+0

什麼是Arduino被打斷?你在使用按鈕嗎?任何傳感器? – eventHandler

+0

是的確切的下拉配置的一個物理按鈕 –

回答

8

您遇到的問題是因爲按鈕故障在每個按鈕按下時產生許多中斷。您可以使用硬件here找到一個很好的描述和解決方法。

讓我來解釋一下,當你按下按鈕時,機械接點會有一個短暫的ON-OFF波動的瞬變狀態。釋放按鈕時可能會發生同樣的效果。

解決此問題的一種方法是使用與負載並聯的電容器。另一種「更容易」的方式將由軟件完成。這個想法是設置一個固定的任意時間,其中不允許新的中斷。您可以使用millis()micros()庫來設置此時間。代碼看起來像這樣。

unsigned long lastInterrupt; 

void ngt() 
{ 

    if(millis() - lastInterrupt > 10) // we set a 10ms no-interrupts window 
    {  

    state = !state; 

    lastInterrupt = millis(); 

    } 
} 

這樣你就不會處理新的中斷,直到經過10ms。

注意:根據您的要求調整時間。

+0

這個答案實際上是值得更多upvotes,它是什麼。儘管看起來很平凡,而有經驗的人才知道這一點,但事實上,第一次面對它時並不容易。特別是如果你已經有電路和Arduino的經驗,但從來沒有嘗試過使用像中斷這樣的快速響應的開關。 – himura

+0

這個答案非常有幫助。它解決了我的問題! –