Mit dem HC-SR04 Ultraschallsensor kann man den Raspberry Pi kostengünstig und einfach zur Messung von Entfernungen einsetzen. Dabei ist die Messung überraschend genau. Nach Angebe der Anbieter können Entfernungen zwischen 2 cm und ca. 3 Metern mit einer Genauigkeit von 0,3cm gemessen werden und es sind bis zu 50 Messungen pro Sekunde möglich.
Eine Messung wird durch eine fallende Flanke am Triggereingang des HC-SR04 gestartet. Danach sendet der Sensor ein Ultraschallsignal aus und wartet auf dessen Reflektion. Für die Zeit zwischen aussenden des Signals und Empfang des Echos wird das Echo Pin des HC-SR04 auf High gesetzt. Aus der Laufzeit des Signals kann man mit dem Rasperry Pi dann die Entfernung zum Objekt berechnen. Dabei ist zu beachten, dass die Schallgeschwindigkeit temperaturabhängig ist. Mehr dazu und eine Tabelle mit der Schallgeschwindigkeit bei verschiedenen Temperaturen findest Du bei Wikipedia.

Da der HC-SR04 mit TTL-Pegeln arbeitet muss zumindest für den ECHO-Pin eine Pegelwandlung vorgenommen werden, um den Raspberry Pi nicht zu beschädigen, da der GPIO Port nur mit max. 3.3V beschaltet werden darf. Die Pegelwandlung kann über einen einfachen Spannungsteiler mit zwei Widerständen realisiert werden.
Für die Anzeige der Entfernung wird in meinem Projekt ein 7-Segment-Display und ein LED-Strip mit 100 LEDs verwendet.

Auf meinem Youtube Kanal findest Du ein Einsteiger Tutorial – LED Strip Ansteuerung mit dem Raspberry Pi
Amazon Links
*Werbung! Wenn Du auf einen der Amazon Links klickst und anschließend ein beliebiges Produkt auf Amazon kaufst, unterstützt Du meine Seite mit einem kleinen Anteil. Dir entstehen dadurch KEINE Mehrkosten und Du zahlst den ganz normalen Preis. Danke!
HC-SR04 Ultraschall-Modul – 1 Stück – https://amzn.to/3e7upKH
HC-SR04 Ultraschall-Modul – 5 Stück – https://amzn.to/3dY2Cfo
Source Code
Hier der Source Code mit Polling des Signals: Abstandssensor.py
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
# Ultraschall Sensor Konfiguration
US_SENSOR_TRIGGER = 23
US_SENSOR_ECHO = 24
Messung_Max = 1 # in sekunden
Messung_Trigger = 0.00001 # in sekunden
Messung_Pause = 0.2 # in sekunden
Messung_Faktor = (343460 / 2) # Schallgeschwindigkeit durch 2 (hin und zurück) in mm/s
# Schallgeschwindigkeit gem. https://de.wikipedia.org/wiki/Schallgeschwindigkeit
# +20°C 343,46m/s
# 0°C 331,50m/s
# −20°C 319,09m/s
Abstand_Max = 4000 # Max value in mm
Abstand_Max_Error = Abstand_Max + 1
def US_SENSOR_GetDistance():
# setze TRIGGER für min 0.01ms
GPIO.output(US_SENSOR_TRIGGER, True)
time.sleep(Messung_Trigger)
GPIO.output(US_SENSOR_TRIGGER, False)
# speichere Startzeit
StartZeit = time.time()
MaxZeit = StartZeit + Messung_Max
# warte aus steigende Flanke von ECHO
while StartZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 0:
StartZeit = time.time()
# speichere Stopzeit
StopZeit = StartZeit
# warte aus fallende Flanke von ECHO
while StopZeit < MaxZeit and GPIO.input(US_SENSOR_ECHO) == 1:
StopZeit = time.time()
if StopZeit < MaxZeit:
# berechne Zeitdifferenz zwischen Start und Ankunft im Sekunden
Zeit = StopZeit - StartZeit
# berechne Distanz
Distanz = Zeit * Messung_Faktor
else:
# setze Fehlerwert
Distanz = Abstand_Max_Error
# Distanz als Ganzzahl zurückgeben
return int(Distanz)
if __name__ == '__main__':
# Ultraschall Sensor Initialisierung GPIO-Pins
GPIO.setmode(GPIO.BCM) # GPIO Modus (BOARD / BCM)
GPIO.setup(US_SENSOR_TRIGGER, GPIO.OUT) # Trigger-Pin = Raspberry Pi Output
GPIO.setup(US_SENSOR_ECHO, GPIO.IN) # Echo-Pin = raspberry Pi Input
try:
while True:
Abstand = US_SENSOR_GetDistance()
if Abstand >= Abstand_Max:
# Ausgabe Text
print ("Kein Objekt gefunden")
else:
# Ausgabe Text
print ("Gemessene Entfernung = %i mm" % Abstand)
time.sleep(Messung_Pause)
# Beim Abbruch durch STRG+C: GPIO Port freigeben
except KeyboardInterrupt:
print("Messung vom User gestoppt")
GPIO.cleanup()
oder mit Verwendung einer Interrupt-Routine: Abstandssensor_Interrupt.py
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
# Ultraschall Sensor Konfiguration
US_SENSOR_TRIGGER = 23
US_SENSOR_ECHO = 24
Messung_Max = 0.1 # in sekunden
Messung_Trigger = 0.00001 # in sekunden
Messung_Pause = 0.2 # in sekunden
Messung_Faktor = (343460 / 2) # Schallgeschwindigkeit durch 2 (hin und zurück) in mm/s
# Schallgeschwindigkeit gem. https://de.wikipedia.org/wiki/Schallgeschwindigkeit
# +20°C 343,46m/s
# 0°C 331,50m/s
# −20°C 319,09m/s
Abstand_Max = 4000 # Max value in mm
Abstand_Max_Error = Abstand_Max + 1
def US_SENSOR_EchoInterrupt(US_SENSOR_ECHO):
global StartZeit, StopZeit
# Speichere Zeit
Zeit = time.time()
if GPIO.input(US_SENSOR_ECHO) == 1:
# steigende Flanke
StartZeit = Zeit
else:
# fallende Flanke
StopZeit = Zeit
def US_SENSOR_GetDistance():
global StartZeit, StopZeit
# setze TRIGGER für min 0.01ms
GPIO.output(US_SENSOR_TRIGGER, True)
time.sleep(Messung_Trigger)
GPIO.output(US_SENSOR_TRIGGER, False)
# setzte Defaultwerte
StartZeit = 0
StopZeit = 0
# warte Messzeit auf Interrupts
time.sleep(Messung_Max)
if StartZeit < StopZeit:
# berechne Zeitdifferenz zwischen Start und Ankunft im Sekunden
Zeit = StopZeit - StartZeit
# berechne Distanz
Distanz = Zeit * Messung_Faktor
else:
# setze Fehlerwert
Distanz = Abstand_Max_Error
# Distanz als Ganzzahl zurückgeben
return int(Distanz)
if __name__ == '__main__':
# Ultraschall Sensor Initialisierung GPIO-Pins
GPIO.setmode(GPIO.BCM) # GPIO Modus (BOARD / BCM)
GPIO.setup(US_SENSOR_TRIGGER, GPIO.OUT) # Trigger-Pin = Raspberry Pi Output
GPIO.setup(US_SENSOR_ECHO, GPIO.IN) # Echo-Pin = raspberry Pi Input
GPIO.add_event_detect(US_SENSOR_ECHO, GPIO.BOTH, callback = US_SENSOR_EchoInterrupt)
try:
while True:
Abstand = US_SENSOR_GetDistance()
if Abstand >= Abstand_Max:
# Ausgabe Text
print ("Kein Objekt gefunden")
else:
# Ausgabe Text
print ("Gemessene Entfernung = %i mm" % Abstand)
time.sleep(Messung_Pause)
# Beim Abbruch durch STRG+C: GPIO Port freigeben
except KeyboardInterrupt:
print("Messung vom User gestoppt")
GPIO.cleanup()
Guten Tag
Ich würde gerne deinen Code in meinem Projekt an der Fachhochschule Nordwestschweiz Windisch verwenden. Ist das möglich?
Freundliche Grüsse
Andrea Notaro
Hallo Andrea,
Du kannst den Code gerne verwenden wo immer Du willst.
Gruß
Joe
Hallo Joe 703,
ich hab eine Frage und zwar, Ich möchte eine LED dazuschalten sobald die Entfernung unter 100 mm ist. Wie wäre es zu realisieren, wäre für deine Hilfe dankbar!
Gruß Oleg