2017-10-28 89 views
1

所以我一直忙於在下午與我的編程作業處理,我似乎無法解決下面找到代碼中的問題。從Arduino板LED使用按鈕的點擊並不會關閉

練習是我需要通過按下一個按鈕來切換LED。在我的代碼中,當我點擊按鈕時,LED會亮起,但是當我再次點擊按鈕時LED不會熄滅。

int pinButton = 5; 
int LED = 10; 
int currentState; 
int previousState; 

void setup() { 
    Serial.begin(9600); 
    pinMode(pinButton, INPUT); 
    pinMode(LED, OUTPUT); 
} 

void toggleLed(){ 
    if (previousState == 1 && currentState == 0){ 

    digitalWrite(LED, HIGH); 
    Serial.println(currentState); 
    Serial.println(previousState); 
    delay(100); 

    } else { 

    digitalWrite(LED, LOW); 
    Serial.println(currentState); 
    Serial.println(previousState); 
    delay(100); 

    } 
} 

void loop() { 

int currentState = digitalRead(pinButton); 

if (currentState == 0 && previousState == 1) { 

    Serial.println("Knop is losgelaten"); 

    toggleLed(); 

} 

previousState = currentState; 

} 

我想的是,在第一個if語句的else代碼塊是沒有意義的,因爲在這種情況下previousStatecurrentState永遠是1和0分別。

你們有什麼建議嗎?

這個Arduino是一個Arduino Uno。

回答

0

我可以在您的代碼中看到,您按下按鈕後沒有再次關閉燈。如果你將if語句放在「while」語句中,它會消失。

+0

不幸的是,將它放入'while'聲明不起作用。 –

0

編輯:擴大了大多數點以解決評論中的其他問題。

  1. 您有一個名爲currentState,一個全球性,一個地方到loop()兩個不同的變量。全球範圍是在程序的頂部附近定義的,而不是在另一個功能範圍內。在loop(),在開始使用此行:

    int currentState = digitalRead(pinButton);

    因爲你已經包括了int那裏,這其實造成這種情況發生有相同的名稱作爲全球一個第二變量。 currentState這兩個版本的值可以獨立更改。在loop()之內,每次引用currentState時,都會引用本地副本。其他地方(如toggleLed)將引用全局副本。如果你只是想設置全球性的(這是我假設你的意思做),那麼你需要刪除int

    currentState = digitalRead(pinButton);

    這將改變currentState全球版本而無需創建一個新的一。

  2. 你沒有做任何反彈,所以你可以看到零星的結果取決於按鈕的類型。使用許多按鈕和開關時,開啓和關閉之間的轉換可能會產生噪音。去抖動過濾出噪音。 編輯toggleLed()中的延遲可能足以反彈,但通常在之前完成響應狀態更改。您可能需要初始化previousState。因爲它是一個全球性的,全局具有靜態存儲持續時間,並且它沒有其他初始化,系統會確保它的初始化爲0明確初始化會的人誰閱讀代碼更明顯,特別是如果他們不知道C的所有規則也是如此。另外,您可能需要將其初始化爲LOW而不是0。這導致了我的最後一點。

  3. 返回值digitalRead()HIGHLOW。在Uno上,使用10而不是HIGHLOW可能沒有關係,但我相信如果您將代碼移植到某些其他主板,則可能會出現問題。 HIGHLOW常量用於隱藏詳細信息,但只有在持續使用它們時纔有用。使用HIGHLOW某些時間和10其他時間只會讓人們難以理解您的代碼,並且如果您想要在不同的主板上嘗試代碼,則可能會導致可移植性問題。

+0

謝謝你Adrion的詳細回覆。但是,我並沒有遵循你的建議。 previousState被初始化在代碼的最頂端,對吧?高或低對Uno無關緊要,我們也可以使用1和0。你能解釋一下你的第一個陳述的含義嗎?我對這一切還是有點新的。我聽說過本地int和全局int,但我不明白這是如何工作的。非常感謝你提前。 –

+0

我已經擴展瞭解決您的其他問題的答案。 –

0

您可以通過讀取定義爲「LED」的引腳狀態來實現。如果它處於高電平狀態,則將其轉爲低電平,反之亦然。

void toggleLed(){ 
// check if pin state is low, turn it on 
if (digitalRead(LED) == 0) 
digitalWrite(LED, HIGH); 
} else { 
digitalWrite(LED, LOW); 
} 
}