gpt4 book ai didi

c - 如何修复 'Distance is not printed on monitor'?

转载 作者:行者123 更新时间:2023-11-30 19:27:06 26 4
gpt4 key购买 nike

我和我的同学有编程作业。我们需要在 Raspberry Pi 上使用 HC-SR04 超声波传感器创建一个“倒车雷达”。

我们的问题是下一个:我们看不到显示器上打印的“距离”变量。

我们尝试在main()中创建一个变量,但仍然没有反应。我们甚至尝试用 Python 来实现它,让它可以正常工作(不,我们不能用 Python 来实现,因为我们的老师希望用 C 来实现)。我从网上复制了一个程序,但也不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

#define TRIG 5
#define ECHO 6

void setup() {
wiringPiSetup();
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);

//TRIG pin must start LOW
digitalWrite(TRIG, LOW);
delay(30);
}

int getCM() {
//Send trig pulse
digitalWrite(TRIG, HIGH);
delayMicroseconds(20);
digitalWrite(TRIG, LOW);

//Wait for echo start
while(digitalRead(ECHO) == LOW);

//Wait for echo end
long startTime = micros();
while(digitalRead(ECHO) == HIGH);
long travelTime = micros() - startTime;

//Get distance in cm
int distance = travelTime / 58;

return distance;
}

int main(void) {
setup();

printf("Distance: %dcm\n", getCM());

return 0;
}

最佳答案

您的 getCM() 函数可能存在无限循环等待回显。如果您的硬件无法正常工作或者范围内没有具有足够字符串反射的对象,则 getCM() 将永远不会退出。

您应该在 getCM() 中设置超时。例如,如果您想要最大范围为三米,则最大回声时间约为 18 毫秒 - 即(距离 x 2)/声速。之后您需要放弃并发送另一个 ping:

给定:

#define MIN_RANGE_CM 4
#define MAX_RANGE_METRES 3
#define SPEED_OF_SOUND_M_PER_SEC 343
#define MAX_TIME_OF_FLIGHT_US (MAX_RAMGE_METRES * 2000000) / SPEED_OF_SOUND_M_PER_SEC
#define MIN_TIME_OF_FLIGHT_US (MAX_RAMGE_CM * 20000) / SPEED_OF_SOUND_M_PER_SEC

您的 getCM() 可能如下所示:

int getCM() 
{
int distance = -1 ;
long startTime = micros() ;
long elapsed_time = 0 ;

// Send ping pulse
digitalWrite(TRIG, HIGH);
delayMicroseconds(20);
digitalWrite(TRIG, LOW);

// Wait for ping end
while( digitalRead(ECHO) == LOW &&
elapsed_time < MIN_TIME_OF_FLIGHT_US )
{
elapsed_time = micros() - startTime ;
}

// If not timed out waiting...
if( elapsed_time < MIN_TIME_OF_FLIGHT_US )
{
// Wait for echo
elapsed_time = 0 ;
while( digitalRead(ECHO) == HIGH &&
elapsed_time < MAX_TIME_OF_FLIGHT_US )
{
elapsed_time = micros() - startTime ;
}

// If not timed out, get distance in cm
if( elapsed_time < MAX_TIME_OF_FLIGHT_US )
{
distance = (elapsed_time * SPEED_OF_SOUND_M_PER_SEC) / 20000 ;
}
}

return distance ;
}

请注意,每个循环都有一个超时。另请注意,您的评论和时机似乎不正确。您正在等待 ping 的结束和 echo 的开始,而不是 echo 的开始和结束。飞行时间是从 ping 开始到检测到第一个回波的时间段。您的实现直到 ping 结束才开始计时。在你的情况下,20us 的 ping 值只有几毫米,所以这可能并不重要。上面的实现使用“最小范围”作为等待 ping 结束的超时 - 任意 5 厘米 - 如果输入在这段时间内没有变低,则存在问题 - 硬件故障或有人敲响他们的 key (这真的可以弄乱超声波传感器 - 试试吧!)。

对于此应用程序,您需要连续测量距离。为此,我建议:

int main(void) 
{
setup();

for( ;; )
{
printf( "Distance: " ) ;

int distance = getCM() ;
if( distance >= 0 )
{
printf( "%dcm \r", distance ) ;
}
else
{
printf( "Out-of-range\r" ) ;
}

fflush( stdout ) ;
delay( 200 ) ;
}

return 0;
}

\r 将重复使用同一行来显示距离,从而防止终端滚动。空格填充确保先前的输出被覆盖。 fflush() 调用可确保立即输出缓冲的输出。

关于c - 如何修复 'Distance is not printed on monitor'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56100770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com