1

次のことを行うプログラムを作成しようとしています。

1 を入力してプレスまたは送信クリックを入力し、もう一度 1 を入力してプレスまたは送信クリックを入力すると LED 1 が点灯し、同様に '1' '0' を入力すると LED 1 が消灯し、 LED 2 と 3 についても同様です。つまり、'2' '1' は LED 2 をオンにし、'3' '0' は LED 3 をオフにします。

これまでのところ、私のコードは次のとおりです。

int incomingVal;
int ledPin = 16; 
int ledPin2 = 15; 
int ledPin3 = 14; 

void setup()
{

  Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
  Serial.println("starting");
  pinMode(ledPin,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(ledPin3,OUTPUT);
}


void checkForRecvdChar (); 

void loop()
{
  if (Serial.available() > 0 ) //then chars are in the serial buffer
  {
    incomingVal = Serial.parseInt();
    Serial.print("You entered: ");
    Serial.println(incomingVal);

    if (incomingVal == 10);//turns off led 1 
    {
      digitalWrite(ledPin, LOW);  

    }

     if (incomingVal == 11);//turns on led 1 
    {
      digitalWrite(ledPin, HIGH);  

    }

     if (incomingVal == 20);//turns off led 2
    {
      digitalWrite(ledPin2, LOW);  

    }

     if (incomingVal == 21);//turns on led 2
    {
      digitalWrite(ledPin2, HIGH);  

    }

     if (incomingVal == 30);//turns off led 3
    {
      digitalWrite(ledPin3, LOW);  

    }

     if (incomingVal == 31);//turns on led 3
    {
      digitalWrite(ledPin3, HIGH);  

    }

  }

}

現在、入力した組み合わせに関係なく、すべての LED が点灯します。

4

2 に答える 2

2

ステートメントの後にセミコロンがifあり、ステートメントが終了しますif。したがって、意図したすべてのifブロックが実行されます。

例えば...

if (incomingVal == 31);//turns on led 3
    {
      digitalWrite(ledPin3, HIGH);  

    }

する必要があります

  if (incomingVal == 31)
    {
      digitalWrite(ledPin3, HIGH);  

    }
于 2013-11-12T01:57:48.987 に答える
0
わかりましたので、まず、この場合はスイッチ ケースを使用することをお勧めします。
1. 同じ番号を使用して、LED のオンとオフを切り替えることができます。
例:

    ケース 1:
        {
            if(wFlag == false)
            {
               デジタル書き込み (LED、HIGH);
               wFlag = true;
               Serial.println("LED がオン");
            }
            そうでなければ (wFlag == true)
            {
                デジタル書き込み (LED、低);
                wFlag = false;
                Serial.println("LED 消灯");
            }
            壊す;
         }

2.あなたのやり方、あなたの問題はシリアル読み取りがバイトごとにしか取得されないことです
   したがって、1 または 11 を押すと、最初の「1」であるため 1 と表示され、次に If を実行します             
   ステートメント。
   次のように修正できます。

        while (Serial.available())
        {
            IncomingData = Serial.parseInt();
             Temp += String(IncomingData); //一時文字列変数
        }
       DataIN = Temp.toInt(); //DataIN int Var
       温度=""; // 一時文字列を休ませる
        Switch(DataIN) // または if(DataIN == 1)
        {

        }

于 2013-11-12T17:02:27.050 に答える