2013-12-17 43 views
0

我有兩個按鈕和五個LED連線。在電路中它的順序是按鈕,五個LED和按鈕。 LED從左到右的順序(從第一個按鈕開始)紅色,綠色,藍色,綠色和紅色。我使用藍色(中間)LED來區分左側和右側。當按下左按鈕時,其各自的綠色按鈕打開,並且當按鈕被釋放時,紅色按鈕亮起。右側也具有相同的功能。所以我想要做的是當兩個按鈕都被按下時,綠色的燈保持熄滅,藍色的燈亮起。然而,當兩個按鈕被按下時,綠燈和藍燈都會亮起。電路問題的編程錯誤?這裏是我的代碼:用Arduino編程一個簡單的按鈕LED電路

//Using Arduino UNO 

int switchL = 0; //Left button 
int switchR = 0; //Right button 

void setup() {   //LED from left to right 
    pinMode(3, OUTPUT); //Red 
    pinMode(4, OUTPUT); //Green 
    pinMode(5, OUTPUT); //Blue 
    pinMode(6, OUTPUT); //Green 
    pinMode(7, OUTPUT); //Red 
    Serial.begin(9600); 

} 

void loop() { 
    switchL = digitalRead(2); 
    switchR = digitalRead(8); 

    if (switchL == HIGH) { 
     digitalWrite(4, HIGH); 
     digitalWrite(3, LOW); 
    } else { 
     digitalWrite(4, LOW); 
     digitalWrite(3, HIGH); 
    } 
    if (switchR == HIGH) { 
     digitalWrite(6, HIGH); 
     digitalWrite(7, LOW);  
    } else { 
     digitalWrite(6, LOW); 
     digitalWrite(7, HIGH); 
    } 
    if (switchL == HIGH && switchR == HIGH){ 
     digitalWrite(5, HIGH); 
      if (digitalRead(5) == HIGH) { 
      digitalWrite(4, LOW); 
      digitalWrite(3, LOW); 
      digitalWrite(7, LOW); 
      digitalWrite(6, LOW); 
      } else { 
      digitalWrite(5, LOW); 
      } 
    } 
} 
+1

除非按鈕連接到LED,編程的問題。 –

回答

3

,如果你畫一個I/O映射會更容易:

switchL switchR | lR lG mB rG rR 
    0  0 | 1 0 0 0 1 
    0  1 | 1 0 0 1 0 
    1  0 | 0 1 0 0 1 
    1  1 | 0 0 1 0 0 

和只寫輸出,輸入功能:

digitalWrite(3, !switchL   ); 
digitalWrite(4, switchL && !switchR); 
digitalWrite(5, switchL && switchR); 
digitalWrite(6, !switchL && switchR); 
digitalWrite(7,    !switchR); 

如果您寧願繼續使用嵌套的IF s,您必須始終記住,每個輸出是兩個輸入的函數。

0

我對你正在使用的功能有一個模糊的理解,但是這是你的答案,導致我解決我的問題。我所需要的是在我的ifs中的兩個中添加另一個條件。

if (switchL == HIGH && switchR == LOW) { //When the left button is pressed but the right button is not 
    digitalWrite(4, HIGH); 
    digitalWrite(3, LOW); 
} else { 
    digitalWrite(4, LOW); 
    digitalWrite(3, HIGH); 
} 
if (switchR == HIGH && switchL == LOW) { //When the right button is pressed but the left button is not 
    digitalWrite(6, HIGH); 
    digitalWrite(7, LOW);  
} else { 
    digitalWrite(6, LOW); 
    digitalWrite(7, HIGH); 
} 
0

您試圖過度綁定它。首先,在您的第二個if測試中,您正在設置D5HIGH,然後立即測試它是否爲HIGH。它不能是其他任何東西,因此最終if中的else將不會被執行。

我所要做的就是將您的棘手的位(雙按鈕測試)移動到您的代碼頂部,然後測試上述測試的else中的每個其他按鈕。現在,閱讀比現在更難。這裏的代碼:

void loop() { 
    switchL = digitalRead(2); 
    switchR = digitalRead(8); 

    // first test if both buttons are pressed 
    if (switchL == HIGH && switchR == HIGH){ 
     digitalWrite(5, HIGH); 
     digitalWrite(3, LOW); 
     digitalWrite(4, LOW); 
     digitalWrite(6, LOW); 
     digitalWrite(7, LOW); 
    } else { 
      // now that's out the way, we test for everything else as a whole here 
      // first test switchL 
     if (switchL == HIGH) { 
      digitalWrite(4, HIGH); 
      digitalWrite(3, LOW); 
     } else { 
      digitalWrite(4, LOW); 
      digitalWrite(3, HIGH); 
     } // end if switchL 
      // then test switchR 
     if (switchR == HIGH) { 
      digitalWrite(6, HIGH); 
      digitalWrite(7, LOW);  
     } else { 
      digitalWrite(6, LOW); 
      digitalWrite(7, HIGH); 
     } //end if switchR 
    }  //end else of both high 
}