如何根据按钮按下 (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;
}