arduino超声波测距程序时间和刹车距离Conflict


#include <MsTimer2.h>
int distance;
void setup() {
  MsTimer2::set(500,IRQ_Timer);
  MsTimer2::start();
  pinMode(11,OUTPUT);
  pinMode(12,INPUT);
}

void loop(){

}

void IRQ_Timer(){
  echo();
}
//这个部分关系到停车↓↓
void echo(){
  unsigned long p_time=millis();
  while(1){
    unsigned long c_time=millis();
    digitalWrite(11, LOW);
    delayMicroseconds(2);
    digitalWrite(11, HIGH);
    delayMicroseconds(10); 
    digitalWrite(11, LOW);
    distance = pulseIn(12, HIGH)/58.3;
    if(c_time>=p_time+5){
      break;
    }
  }
  return;
 
}

以上是arduino的代码。我们想让arduino在指定范围内停车。关系到这个功能的函数是void echo()。问题是,运行这个函数的时间超出了我们的预期,等到它执行完,我们的车已经跑出指定范围了。要如何改动才可以使这个函数运行时间减少,或者是测距的时候和停车的行为协调?
就是停车的时候,刹车距离和反应时间过长

以下是来自chatgpt的内容:
在这个程序中,函数echo()中存在一个死循环,因此程序会一直等待直到检测到距离。如果这个循环运行的时间超过了你设定的停车范围,那么车辆可能会超出这个范围。

为了解决这个问题,你可以使用定时器来控制echo()函数的执行时间,从而确保在指定时间范围内完成距离检测。你可以使用MsTimer2库来创建一个定时器,并在定时器中执行echo()函数。

另外,为了使车辆在检测到距离后能够在指定范围内停车,你需要考虑反应时间,也就是从检测到距离到实际刹车的时间。你可以根据这个时间计算出车辆需要前进的距离,从而确保车辆能够在指定范围内停车。

以下是修改后的程序:

#include <MsTimer2.h>

int distance;
bool detection_complete;
unsigned long detection_start_time;

const float SOUND_SPEED = 0.034;   // 单位:cm/μs
const float CAR_SPEED = 10.0;     // 单位:m/s
const float BRAKING_ACCELERATION = 3.0;  // 单位:m/s^2
const float SAFETY_DISTANCE = 2.0;   // 单位:m

void setup() {
  MsTimer2::set(500, timerISR);
  MsTimer2::start();
  pinMode(11, OUTPUT);
  pinMode(12, INPUT);
}

void loop() {
  if (detection_complete) {
    // 计算停车距离
    unsigned long reaction_time = millis() - detection_start_time;
    float braking_distance = CAR_SPEED * reaction_time + pow(CAR_SPEED, 2) / (2.0 * BRAKING_ACCELERATION);

    // 在安全距离内刹车
    if (distance <= (SAFETY_DISTANCE + braking_distance)) {
      // 停车操作
    }
    detection_complete = false;
  }
}

void timerISR() {
  digitalWrite(11, LOW);
  delayMicroseconds(2);
  digitalWrite(11, HIGH);
  delayMicroseconds(10);
  digitalWrite(11, LOW);
  unsigned long duration = pulseIn(12, HIGH);
  distance = duration * SOUND_SPEED / 2.0;
  detection_complete = true;
  detection_start_time = millis();
}

在这个程序中,我们使用定时器来控制距离检测的时间。在timerISR()函数中,我们执行超声波测距操作,并在检测完成后设置detection_complete标志。在loop()函数中,我们检测是否完成了检测,并计算反应时间和刹车距离。如果车辆需要在安全距离内刹车,则执行停车操作。

请注意,我在这个代码中只是列出了用于计算停车距离的基本公式,实际情况可能更加复杂,需要进一步优化计算方法和刹车控制。另外,你还需要根据你的具体需求调整上述参数的值,以确保程序可以正确工作。