我目前正在研究一个超声波感应器(和温度,但这对这个问题并不重要)在我的覆盆子Pi,这是我如何建立它由于空间限制,我不能使用面包板。我以前在Arduino上使用过超声波传感器,它的工作非常好,但是我对raspberry和python的编码还不熟悉,所以如果我正在做的事情有什么问题,请纠正我。
编辑
是的,我把电阻焊到树莓皮本身,因为板只用于这个功能。

下面是我用来计算距离的脚本,它读取了最后10个值,并计算了所述值的平均值。
import RPi.GPIO as GPIO
import time, sys
import statistics
GPIO.setmode(GPIO.BCM)
log=__import__("logger")
TRIG = 23
ECHO = 24
log.log("Settng up Distance module...","distance.py")
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
history=[]
total=0
count=0
distance=0
avg=0
dist=[]
distlist=[]
scan=False
GPIO.setmode(GPIO.BCM)
TRIG = 23
ECHO = 24
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
def status():
history=[]
starttime=time.time()
for i in range(10):
GPIO.output(TRIG, False)
time.sleep(0.1)
#print("Waiting for sensor to settle...")
#print("Please wait...")
# ==========
# GPIO Setup
# ==========
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
#print("Sending...")
start=time.time()
pulse_start=start
while GPIO.input(ECHO)==0 and pulse_start-start<=0.0005:
pulse_start=time.time()
if round(pulse_start-start,3)>=0.300:
print(timeout)
else:
#print("Receiving...")
pulse_end=0
pulse_duration=0
while GPIO.input(ECHO)==1 and pulse_duration<2:
pulse_end=time.time()
pulse_duration=pulse_end-pulse_start
#print("Measuring...")
pulse_duration=pulse_end-pulse_start
# ====================
# Calculating Distance
# ====================
distance=pulse_duration*17150
distance=round(distance,2)
history.append(distance)
validcount=0
total=0
print(history)
for i in history:
if i<150:
validcount+=1
total+=i
if validcount>1:
avg_dist=round(total/validcount,2)
print("Average distance:",avg_dist)
if avg_dist<=50:
return([avg_dist,True,avg_dist,avg_dist])
else:
return([avg_dist,False,avg_dist,avg_dist])
else:
print("Timeout")
return([999,False,999,999])
while True: print(status()); time.sleep(1)下面是我站在靠近传感器时从传感器得到的读数。
Average distance: -4590081542678.66
[-4590081542678.66, True, -4590081542678.66, -4590081542678.66]
[185.12, 341.6, 17.71, 188.05, 185.94, 185.55, 188.08, 185.58, 184.6, 185.09]
Timeout
[999, False, 999, 999]
[185.58, 186.09, 185.2, 184.4, 185.11, 185.6, 185.56, 186.47, 186.81, 187.24]
Timeout
[999, False, 999, 999]
[187.71, 186.07, 185.59, 185.6, 185.12, 185.61, 185.56, 186.83, 186.41, 184.68]
Timeout
[999, False, 999, 999]
[2243.37, 2245.42, 22.79, 24.57, 2245.48, 2243.77, 2245.33, 2245.12, 2245.18, 2245.28]
Average distance: 23.68
[23.68, True, 23.68, 23.68]
[2244.04, 2246.04, 348.54, 348.56, 348.58, 349.46, 349.44, 348.51, 350.32, 348.05]
Timeout
[999, False, 999, 999]
[348.65, 104.17, 103.76, 100.39, 348.94, 99.49, 348.99, 348.5, 348.14, 348.59]
Average distance: 101.95
[101.95, False, 101.95, 101.95]
[2244.2, 2245.87, 2246.03, 2246.21, 2243.82, 2246.09, 2245.4, 2245.17, 2245.98, 2245.81]
Timeout
[999, False, 999, 999]
[2243.19, 2245.8, 2245.89, 2245.82, 2245.66, 2245.76, 2245.65, 2245.69, 2245.58, 2245.89]
Timeout
[999, False, 999, 999]
[2242.55, 2245.85, 25.14, 24.11, 23.9, 23.2, 2243.35, 2246.04, 2246.33, 2245.93]
Average distance: 24.09
[24.09, True, 24.09, 24.09]
[2243.13, 19.03, 18.33, 17.64, 2246.25, 2244.32, 2245.29, 2245.44, 2245.78, 2246.06]
Average distance: 18.33
[18.33, True, 18.33, 18.33]
[2242.59, 2245.8, 2245.47, 2245.62, 2245.73, 2245.8, 2245.86, 2246.05, 2246.22, 2245.91]
Timeout
[999, False, 999, 999]
[2243.81, 2246.36, 2246.1, 2246.07, 2246.09, 2246.05, 2246.13, 2245.92, 2246.07, 2246.3]
Timeout
[999, False, 999, 999]
[2243.94, 2246.02, 2246.03, 2246.21, 2246.15, 2245.89, 2245.9, 2245.99, 2245.96, 2245.99]
Timeout
[999, False, 999, 999]
[2242.87, 2245.97, 18.78, 17.93, 17.81, 2243.93, 2246.01, 2245.86, 2245.95, 2246.04]
Average distance: 18.17所以我的程序是从传感器上取出最后的10位数字,然后计算出列表中这个值的平均值,但正如你所看到的,即使我站在接近它的地方,读数也超过了数千。
我知道这个问题的Distance Sensor (HC-SR04) Recording Inconsistent Values 页面,虽然它确实给了我对这个问题的洞察力,但不幸的是,没有找到解决办法。然而,我猜测问题在于触发了超过6秒的脉冲,这导致了链接页面中提到的高值,但我不确定这是否是唯一的问题,或者如何解决它。
如有任何反馈、建议或回答,我将不胜感激。提前谢谢你。
发布于 2020-11-27 04:14:35
因此,在我做了一些故障排除后,我发现我的电阻上的焊料在覆盆子圆周板上没有焊好,所以我给了它适当的焊料后,它给出了一致的读数,但高价值的问题没有改变。它仍然会给出很高的价值,所以我为解决这个问题所做的工作就是有一个过滤器,过滤掉高值。
for i in history:
if i<150:
validcount+=1
total+=i
if validcount>1:
avg_dist=round(total/validcount,2)
print("Average distance:",avg_dist)
if avg_dist<=50:
return([avg_dist,True,avg_dist,avg_dist])
else:
return([avg_dist,False,avg_dist,avg_dist])
else:
print("Timeout")
return([999,False,999,999])通过加快读取数据的速度。
for i in range(10):
GPIO.output(TRIG, False)
time.sleep(0.1)
#print("Waiting for sensor to settle...")
#print("Please wait...")
# ==========
# GPIO Setup
# ==========
GPIO.output(TRIG, True)
time.sleep(0.00001) #lowered the delay on the reading
GPIO.output(TRIG, False)
#print("Sending...")
start=time.time()
pulse_start=start
while GPIO.input(ECHO)==0 and pulse_start-start<=0.0005:
pulse_start=time.time()
if round(pulse_start-start,3)>=0.300:
print(timeout)
else:
#print("Receiving...")
pulse_end=0
pulse_duration=0
while GPIO.input(ECHO)==1 and pulse_duration<2:
pulse_end=time.time()
pulse_duration=pulse_end-pulse_start
#print("Measuring...")
pulse_duration=pulse_end-pulse_start
# ====================
# Calculating Distance
# ====================
distance=pulse_duration*17150
distance=round(distance,2)这实际上提供了更快的读取速度,如果出现一个有效值,它将忽略突然出现的高值。我希望这对其他有同样问题的人有帮助。
https://stackoverflow.com/questions/64926010
复制相似问题