我正在尝试制作一个简单的程序来打开和关闭激光。在我尝试通过向 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 ;
}
}