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

you've got semi colons after your if statements, which terminates the if statement. So all your intended if blocks get executed.

for example...

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

    }

needs to be

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

    }
于 2013-11-12T01:57:48.987 回答
0
好的,所以首先在这种情况下使用 Switch Case 会更好:
1. 您可以使用相同的数字来打开和关闭 LED
例子:

    情况1:
        {
            如果(wFlag == 假)
            {
               数字写入(LED,高);
               wFlag =真;
               Serial.println("LED 亮");
            }
            否则如果(wFlag == true)
            {
                数字写入(LED,低);
                wFlag = 假;
                Serial.println("LED 熄灭");
            }
            休息;
         }

2. 你这样做的方式,你的问题是串行读取只能逐字节读取
   因此,当您按 1 或 11 时,它会看到 1,因为它是第一个“1”,然后执行您的 If             
   声明。
   你可以像这样修复它:

        而(Serial.available())
        {
            IncomingData = Serial.parseInt();
             临时 += 字符串(传入数据);//临时字符串变量
        }
       DataIN = Temp.toInt(); //DataIN int Var
       温度=“”;// 休息临时字符串
        Switch(DataIN) // 或者 if(DataIN == 1)
        {

        }

于 2013-11-12T17:02:27.050 回答