使用串行监视器arduino控制LED

时间:2018-02-02 13:12:45

标签: c++ arduino

我的项目是通过串行监视器发送'1'或'0'来控制LED。 我对这个项目的任务是当通过串行监视器发送'1'时,Led ON PIN 3需要每2000ms打开和关闭一次。然后,当通过串行监视器发送'0'时,需要关闭LED直到发送下一个'1',这样Led ON PIN 3可以再次打开和关闭2000ms。但它对我的代码不起作用,任何人都可以告诉我我的代码有什么问题。以下是我的代码:

char data = 0;            //Variable for storing received data
void setup()
{
    Serial.begin(115200);   //Sets the baud for serial data transmission                               
    pinMode(3, OUTPUT);  //Sets digital pin 3 as output pin
}
void loop()
{
   if(Serial.available()>0 )      // Send data only when you receive data:
   {
      data = Serial.read();        //Read the incoming data send via serial monitor & store into data
    Serial.print(data);          //Print Value inside data in Serial monitor
     Serial.print("\n");        


            while(data == '1')          //Do looping so that when '1' send via serial monitor, the LED can blink
            {
                digitalWrite(3, HIGH);   
                delay(2000);
               digitalWrite(3, LOW);
               delay(2000);

            }

      while(data == '0')         //  Checks whether value of data is equal to 0
         digitalWrite(3, LOW);    //If value is 0 then LED turns OFF

}
}

2 个答案:

答案 0 :(得分:1)

你有几个明显的错误......主要是你已经将执行锁定到while循环中。因此,执行路径变为“while data ==”,当数据等于该值时,它将保持在那里。该值虽然不能改变,因为您只读取函数循环()开头的数据值。唯一可行的方法是if循环由定时器函数提供服务并在两个线程之间共享。

用ifs替换你的whiles,并使用while(1){loop();}运行它;你可能会发现它。 TBH,我在while循环级别添加Delay 2000,并且每2000mS只查询一次串口。在飞轮循环中锤击东西是不好的业力。

答案 1 :(得分:0)

更改循环的结构。 让循环每2000毫秒执行一次。如果有数据可从串行读取,则读取并解析它以更新for (String h : webDriver.getWindowHandles()) { webDriver.switchTo().window(h);} WebElement element= webDriver.findElement(By.xpath("//*[@id='Standard']/p[1]")); Actions a = new Actions(webDriver); a.moveToElement(element).build().perform(); / 1状态。 取决于状态,要么让LED的状态在打开和关闭之间切换,要么让它处于关闭状态。