0

2 つのプッシュ ボタンと 5 つの LED が配線されています。回路では、押しボタン、5 個の 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);
          }
    }
} 
4

3 に答える 3

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の関数であることを常に念頭に置いておく必要があります。

于 2013-12-17T09:36:06.417 に答える
0

あなたはそれを考えすぎようとしました。最初に、最後の 2 番目のifテストで、設定D5 HIGHしてからすぐにそれがHIGH. それ以外のことはできないためelse、最終的ifに が実行されることはありません。

私がすることは、あなたのトリッキーなビット (ダブル ボタン テスト) をコードの先頭に移動し、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
} 
于 2014-02-28T11:54:08.707 に答える
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); 
}
于 2013-12-19T20:20:21.403 に答える