如何根据按钮按下 (Arduino) 跳出 运行 'while' 循环?
How to break out of a running 'while' loop based on button press (Arduino)?
所以我正在研究一个避障机器人。到目前为止一切正常,除了这个:
我有两种模式。空闲和避障。空闲基本上是闪烁一些 LED 并停止任何 activity 机器人可能正在执行的操作。按下按钮即可进行模式切换。这是执行此操作的函数:
void manageRobotState() {
if (digitalRead(button) == LOW) {
robotState = 0;
halt();
idlePose();
blinkLED(leftLED, 1000);
blinkLED(rightLED, 1000);
} else if (digitalRead(button) == HIGH) {
robotState = 1;
digitalWrite(leftLED, HIGH);
digitalWrite(rightLED, HIGH);
simpleObstacleAvoidence();
}
delay(100);
}
所以这里的关键是单击按钮后 robotState
变量会发生变化。现在这段代码有效,除了机器人转向的情况。
void smartTurnLeft() {
turning();
while (currentDistanceAhead <= minimumDistance) {
Serial.println("turning");
if (robotState == 0) {
break;
}
scanAhead();
leftMotor.setSpeed(50);
rightMotor.setSpeed(50);
leftMotor.run(BACKWARD);
rightMotor.run(BACKWARD);
blinkLED(leftLED, 20);
digitalWrite(rightLED, LOW);
delay(20);
}
}
我感觉当这个循环是运行时就不会发生其他事情了?我按下按钮,但是这个 while 循环继续执行。有什么可以做的吗?
完整代码可见HERE
免责声明:我对 Arduino 一无所知,但认为它就像 C。
所以我找到了 this 关于 Arduino 中 volatile
关键字的参考资料。它就像 C 一样工作。问题是您对 if (robotState == 0)
的测试正在优化,因为编译器可以看到 robotState
没有在循环中更新。
volatile
关键字告诉编译器此内存地址可能会在正常程序流之外更新(因为它是硬件寄存器或因为它可能通过另一个执行线程更新)。所以你需要做的代码更改是 robotState
的声明。您可能对其他变量有类似的问题。
我认为您唯一需要做的就是在 smartTurnLeft()
函数中的 while loop
中调用 manageRobotState()
函数,就像这样
manageRobotState();
if (robotState == 0) {
break;
}
所以我正在研究一个避障机器人。到目前为止一切正常,除了这个:
我有两种模式。空闲和避障。空闲基本上是闪烁一些 LED 并停止任何 activity 机器人可能正在执行的操作。按下按钮即可进行模式切换。这是执行此操作的函数:
void manageRobotState() {
if (digitalRead(button) == LOW) {
robotState = 0;
halt();
idlePose();
blinkLED(leftLED, 1000);
blinkLED(rightLED, 1000);
} else if (digitalRead(button) == HIGH) {
robotState = 1;
digitalWrite(leftLED, HIGH);
digitalWrite(rightLED, HIGH);
simpleObstacleAvoidence();
}
delay(100);
}
所以这里的关键是单击按钮后 robotState
变量会发生变化。现在这段代码有效,除了机器人转向的情况。
void smartTurnLeft() {
turning();
while (currentDistanceAhead <= minimumDistance) {
Serial.println("turning");
if (robotState == 0) {
break;
}
scanAhead();
leftMotor.setSpeed(50);
rightMotor.setSpeed(50);
leftMotor.run(BACKWARD);
rightMotor.run(BACKWARD);
blinkLED(leftLED, 20);
digitalWrite(rightLED, LOW);
delay(20);
}
}
我感觉当这个循环是运行时就不会发生其他事情了?我按下按钮,但是这个 while 循环继续执行。有什么可以做的吗?
完整代码可见HERE
免责声明:我对 Arduino 一无所知,但认为它就像 C。
所以我找到了 this 关于 Arduino 中 volatile
关键字的参考资料。它就像 C 一样工作。问题是您对 if (robotState == 0)
的测试正在优化,因为编译器可以看到 robotState
没有在循环中更新。
volatile
关键字告诉编译器此内存地址可能会在正常程序流之外更新(因为它是硬件寄存器或因为它可能通过另一个执行线程更新)。所以你需要做的代码更改是 robotState
的声明。您可能对其他变量有类似的问题。
我认为您唯一需要做的就是在 smartTurnLeft()
函数中的 while loop
中调用 manageRobotState()
函数,就像这样
manageRobotState();
if (robotState == 0) {
break;
}