2013-12-17 39 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 
}