【问题标题】:Programming a simple button LED circuit with Arduino用 Arduino 编程一个简单的按钮 LED 电路
【发布时间】:2014-01-04 16:37:54
【问题描述】:

我有两个按钮和五个 LED 连接。在电路中,它的顺序是按钮、五个 LED 和按钮。 LED 的顺序从左到右(从第一个按钮之后开始)红色、绿色、蓝色、绿色和红色。我使用蓝色(中间)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);
          }
    }
} 

【问题讨论】:

  • 除非按钮连接到 LED,否则编程问题。

标签: c++ c arduino circuit arduino-ide


【解决方案1】:

如果你画一个 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);

如果您更喜欢继续使用嵌套的IFs,您必须始终牢记每个输出都是两个输入的函数。

【讨论】:

    【解决方案2】:

    我对您使用的功能有一个模糊的了解,但是正是您的回答使我解决了我的问题。我只需要在我的两个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); 
    }
    

    【讨论】:

      【解决方案3】:

      你想太多了。首先,在你的第二个if 测试中,你设置D5 HIGH 然后立即测试它是否是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
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多