arduino - 我正在尝试使用 Arduino serial monitor 接收输入,如果它是某个整数,则执行某些操作

我正在尝试制作一个简单的程序来打开和关闭激光。在我尝试通过向 serial monitor 输入 2 使其闪烁之前,它工作正常。它闪烁,但只有一次。我试图让它做的是永远闪烁,同时还要等待用户输入一些东西才能停止闪烁。这是我的代码。

int laserPin = 3; 
int laserState; 

void setup()
{
  pinMode(laserPin, OUTPUT);  // set pin10 as output pin
  digitalWrite(laserPin, LOW); // set the pin value on low at the begin
  Serial.begin(9600);
  Serial.println("     Commands");
  Serial.println("--------------------");
  Serial.println("2- makes laser blink");
  Serial.println("1- turns laser on");
  Serial.println("0- turns laser off");
}
void loop()
{
  Serial.println("Set laser state to: "); //Prompt User for Input
  while (Serial.available() == 0) {
    // Wait for User to Input Data
  }
  laserState = Serial.parseInt(); //Read the data the user has input
  Serial.println(laserState);
  if(laserState == 1){
    Serial.println("Turning laser on");
    digitalWrite(laserPin, HIGH);
    }
   else if(laserState == 0){
      Serial.println("Turning laser off");
      digitalWrite(laserPin, LOW);
   }
   else if(laserState == 2){
      Serial.println("Making laser blink");
      while(laserState == 2)
      {
        digitalWrite(laserPin, HIGH);
        delay(1000);
        digitalWrite(laserPin, LOW);
        Serial.println("Set laser state to: "); //Prompt User for Input
        laserState = Serial.parseInt(); //Read the data the user has input
      }
   }
}

这是我为使激光闪烁而编写的代码:

else if(laserState == 2){
  Serial.println("Making laser blink");
  while(laserState == 2)
  {
    digitalWrite(laserPin, HIGH);
    delay(1000);
    digitalWrite(laserPin, LOW);
    Serial.println("Set laser state to: "); //Prompt User for Input
    laserState = Serial.parseInt(); //Read the data the user has input
  }

}

回答1

如果你想让 arduino 一次做不止一件事,你需要让循环继续运行并跟踪状态——而不是用 while 循环来阻止它。

我已经获取了您的代码并对其稍作修改,以允许读取序列号并闪烁激光。

在这个版本中,laserState 通常设置为 -1 - 这意味着除了每次检查串行输入之外,循环不会做任何事情。

当您输入串行 int - 这将更改 laserState 并执行适当的操作。

在打开和关闭激光之后,立即将 laserState 设置回 -1,因此不会发生进一步的操作。

但是 - 如果 laserState 设置为 2,它将在每个循环迭代中停留在该 value 并且激光将继续闪烁,直到接收到另一个串行输入以更改状态。

还有一个标志来确定何时显示提示(尽管每次 LED 闪烁时都会显示)。

这可以通过消除闪光灯中的延迟并使用定时器来确定何时打开和关闭激光来提高响应速度 - 因此您不必等待闪光灯周期来读取下一个串行输入- 但这会有点复杂。

int laserPin = 3; 
int laserState = -1; 
bool showPrompt = true ;

void setup()
{
  pinMode(laserPin, OUTPUT);  // set pin10 as output pin
  digitalWrite(laserPin, LOW); // set the pin value on low at the begin
  Serial.begin(9600);
  Serial.println("     Commands");
  Serial.println("--------------------");
  Serial.println("2- makes laser blink");
  Serial.println("1- turns laser on");
  Serial.println("0- turns laser off");
}
void loop()
{
  if ( showPrompt ) {
    Serial.println("Set laser state to: "); //Prompt User for Input
    showPrompt = false ;
  }
  if (Serial.available()) {
    // Read the User Input Data
    laserState = Serial.parseInt(); //Read the data the user has input
    Serial.println(laserState);
  }

  if(laserState == 1){
    Serial.println("Turning laser on");
    digitalWrite(laserPin, HIGH);
    laserState = -1 ; 
    showPrompt = true ;
  }
  else if(laserState == 0){
    Serial.println("Turning laser off");
    digitalWrite(laserPin, LOW);
    laserState = -1 ; 
    showPrompt = true ;
   }
   else if(laserState == 2){
     Serial.println("Making laser blink");
     digitalWrite(laserPin, HIGH);
     delay(1000);
     digitalWrite(laserPin, LOW);
     delay(1000);
     showPrompt = true ;
   }
}

相似文章

随机推荐

最新文章