美好的一天,我有一个我正在使用的超声波传感器的代码,但结果不准确,我想以厘米为单位显示目标距离。
sortedRefs
我将不胜感激。
答案 0 :(得分:2)
您正在loop
的每次迭代中执行大量浮点计算。您可以预先计算一个将pingTime
转换为以厘米为单位的距离的乘数,而不是执行这些计算。
首先,我们需要从776.5英里/小时计算声音的公制速度。
776.5英里/小时* 1609.34(一英里米)= 1249652.51米/小时
1249652.51米/小时/ 3600 = 347.126米/秒
所以我们可以按如下方式预先计算乘数:
float speedOfSound = 347.126; // metres per second
float speedOfSound_cm_p_us = speedOfSound * 100 / 1000000; // speedOfSound in centimetres per microsecond
显然,这可以简化为:
float speedOfSound_cm_p_us = 0.0347126; // cm per microsecond
接下来,我们可以通过将speedOfSound_cm_p_us
除以2来预先计算乘数,因为声音必须传到反射表面然后再返回。
float pingTime_multiplier = speedOfSound_cm_p_us / 2; // The sound travels there and back so divide by 2.
同样,我们可以简单地用以下步骤替换此步骤:
float pingTime_multiplier = 0.0173563;
但是,您的代码中应记录此 magic 号。
一旦我们计算pingTime_multiplier
,loop
函数变得更加简单。只需将pingTime
乘以pingTime_multiplier
即可得到以厘米为单位的距离。
pingTime = pulseIn(echoPin, HIGH); // pingTime is presented in microseconds
targetDistance = pingTime * pingTime_multiplier;
这大大减少了Arduino每次循环时必须完成的工作量。
答案 1 :(得分:1)
我想以厘米为单位显示目标距离。
Google称一英寸是2.54厘米,所以只需将结果乘以这个数字。
结果不准确
要获得更准确的结果,请取一些样本(3个或更多)的平均值,然后您可以实施一些启发式操作,这些启发式扫描会大大超出范围内的结果。
如果三个读数相距约0-5厘米,那么40厘米之外的第四个读数很可能是一个错误。所以只需做三个相似结果的平均值。
答案 2 :(得分:1)
通过乘以2.54
将英寸转换为厘米float targetDistanceCentimeters = targetDistance*2.54;
您的代码看起来正确,所以我的猜测是这是一个硬件问题。根据我的经验,超声传感器通常很难测量到任何不是墙壁或其他具有相对平坦表面的大物体的物体的距离。因此,如果您想测试系统的准确性,请针对此类对象(墙或书)进行测试。 如果您的传感器在进行测量时正在移动,请确保其移动速度不会太快。 如果要测量距离较小或较薄物体的距离,则需要进行滤波并取平均值。这完全取决于你想要的准确度,我会说平均过滤测量的二十左右会给你合适的结果。
需要考虑的另一个问题是,您具有正确的电源电压,并且传感器不会以某个角度对着地板,因为这可能会产生不必要的反射。