#Libraries
import RPi.GPIO as GPIO
import time
#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
#set GPIO Pins
GPIO_TRIGGER = 18
GPIO_ECHO = 24
#set GPIO direction (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
def distance():
# set Trigger to HIGH
GPIO.output(GPIO_TRIGGER, True)
# set Trigger after 0.01ms to LOW
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
StartTime = time.time()
StopTime = time.time()
# save StartTime
while GPIO.input(GPIO_ECHO) == 0:
StartTime = time.time()
# save time of arrival
while GPIO.input(GPIO_ECHO) == 1:
StopTime = time.time()
# time difference between start and arrival
TimeElapsed = StopTime - StartTime
# multiply with the sonic speed (34300 cm/s)
# and divide by 2, because there and back
distance = (TimeElapsed * 34300) / 2
return distance
if __name__ == '__main__':
try:
while True:
dist = distance()
print ("Measured Distance = %.1f cm" % dist)
time.sleep(1)
# Reset by pressing CTRL + C
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()
But the measurement output is not looping, just shows the first measurement and then nothing else. Any ideas?
While many people “you get what you code for”, this code does look sound. Are you getting the same measurement each time, or does it vary based on how far the sensor is from something when you start the code? Is it accurate?
Weird bug, keen to get to the bottom of it with you!
-James
Looks like it’s getting stuck in a while loop then. While crude, I like adding a “waiting for x…” to loops I’m suspicious of, like the one waiting for the return signal from the HC-SR04.
Perhaps a wiring/GPIO-config issue is causing this problem, and the code just waits forever. Are you able to send a photo of how you’ve got everything setup?
FYI, I have just tested this code on a raspberry pi zero, and it executes correctly, this is the second issue im having with gpio on my pi 4, have another post about an i2c error on it.
Could there be some interrupt happening which cause you to miss the high pulse?
Maybe you could use either an interrupt routine yourself or use machine.time_pulse_us() to measure the echo return.
Cheers, Steve
And you can get our latest projects and tips straight away by following us on: