Seite 1 von 1

Abstandsmessung mit dem HC-SR04

Verfasst: Mo 27. Okt 2025, 12:26
von Heinrichs
In meinem Beitrag Entfernungsmessung mit dem HC-SR04 habe ich bereits dargelegt, wie man mit diesem Modul Entfernungen messen kann; als Mikrocontroller wurde dort ein Attiny2313 benutzt. Hier soll nun stattdessen unser TTGO T-Display eingesetzt werden.


Anschluss des HC-SR04 an den TTGO

Der Anschluss erfolgt nach der folgenden Tabelle:

HC-SR04TTGO
GNDG
VCC5 V
TrigPin 32
EchoPin 38 (Pegelanpassung s. u.)


Beachten Sie: Der HC-SR04 arbeitet mit 5V-Signalen (Eine Messung ergab, dass das ausgegebene Echo-Signal im 1-Zustand eine Spannung von ca. 4,5 V hat , vgl. Abb. 1). Hingegen arbeitet der ESP-32 mit 3,3V-Signalen. Werden höhere Spannungen als 3,6 V an seinen Eingang gelegt, kann dieser dadurch zerstört werden. Deswegen sollte man eine Pegel-Anpassung vornehmen.


Echo.jpg
Echo-Signal des HC-SR04
Echo.jpg (66.72 KiB) 617 mal betrachtet

Eine solche Pegel-Anpassung kann folgendermaßen durchgeführt werden, wobei die 3. Maßnahme eher fragwürdig ist:
  • durch einen Pegelwandler
  • durch eine Potentiometer-Schaltung (Spannungsteiler)
  • durch einen Widerstand R = 1 kOhm zwischen Echo und Pin 38 (?)
Nun sieht man im Internet immer nur Anschluss-Schemata mit direkten Verbindungen zwischen dem Echo-Ausgang des HC-SR04 und dem Eingang des ESP32, so auch in dem sehr guten und ausführlichen Beitrag MicroPython: HC-SR04 Ultrasonic Sensor with ESP32.... Tatsächlich scheinen eine Reihe von Eingängen des ESP32 resistent gegen Spannungen von mehr als 3,6 V zu sein. Nach einem inoffiziellen Dokument von ESP32 verkraftet der in dem genannten Beitrag benutzte ESP32-Eingang (Pin 18) sogar Spannungen von 6,4 V (Weitere Informationen dazu s. https://esp32.com/viewtopic.php?t=877).

Ein eigener Versuch zeigt übrigens tatsächlich, dass auch der von mir benutzte Eingangs-Pin 38 keinen Schaden genommen hat, wenn ich ihn direkt mit dem Echo-Ausgang verbunden habe. Sicherheitshalber benutze ich aber sonst eine Potentiometer-Schaltung zur Pegel-Anpassung.


Programm

Das Programm ist recht einfach:

Code: Alles auswählen

# HC_SR04_Main_1.py
# 26.10.2025
# www.g-heinrichs.de

from hcsr04_esp32 import HCSR04
from time import sleep
import vga1_bold_16x32 as font1  
import st7789
from machine import SPI, Pin

# HC-SR04-Sensor instanziieren:
# sensor = HCSR04(trigger_pin=32, echo_pin=38, echo_timeout_us=30_000) # Standardwert für echo_timeout_us ist 30_000 us, also kürzer:
sensor = HCSR04(trigger_pin=32, echo_pin=38)
time_between_2_measurements = 1 # in s

# Display instanziieren:
spi = SPI(1, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19))
display = st7789.ST7789(spi, 135, 240,  reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
# Landscape
display.init()
display.fill(st7789.BLUE)

display.text(font1, 'HC-SR04', 70, 15, st7789.WHITE, st7789.BLUE)

while True:
    distance = round(sensor.distance_cm(), 1)
    print('Distance:', distance, 'cm')
    display.text(font1, 'd = ' + str(distance) + ' cm   ', 20, 70, st7789.WHITE, st7789.BLUE)
    sleep(time_between_2_measurements)

Der eigentliche Messvorgang erfolgt durch die Methode sensor.distance_cm; sie liefert den aktuellen Abstand (in cm). sensor ist eine Instanz von der Klasse HCSR04:

Code: Alles auswählen

sensor = HCSR04(trigger_pin=32, echo_pin=38)
Die Definition dieser Klasse befindet sich in dem Modul hcsr04_esp32.py; dieses geht im Wesentlichen auf Roberto Sánchez zurück; ich habe nur 2 kleine Änderungen vorgenommen. Sie finden die Datei hcsr04_esp32.py im Anhang; sie muss in den Speicher des ESP32 geladen werden, damit das obige Programm darauf zugreifen kann.

Wie der Messvorgang nun im Prinzip funktioniert, kann man dem Dokument HC-SR04_Manual.pdf aus dem Anhang entnehmen: Zunächst muss unser Mikrocontroller ein Trigger-Signal (10 ms Dauer) an den HC-SR04-Baustein senden. Dieser sendet daraufhin einen Ultraschallimpuls aus und wartet auf das Echo dieses Signals; dabei setzt der HC-SR04-Baustein den Echo-Ausgang solange auf 1 wie das Ultraschall-Signal für den Hin- und Rückweg braucht. Die Dauer dieses Echo-Signals wird mit der Methode time_pulse_us bestimmt: Diese Methode stellt Micropython durch das machine-Modul zur Verfügung; die Zeitdauer wird - wie der Name der Methode schon andeutet - in us angegeben. Aus dieser Laufzeit berechnet die Methode distance_cm schließlich mit Hilfe der Schallgeschwindigkeit den gesuchten Abstand (in cm).

Messungen

Der HC-SR04 kann Entfernungen bis zu ca. 4 m erkennen. Bei größeren Entfernungen kann meist kein Echo-Signal gebildet werden; in diesem Fall wird als "Ergebnis" 500 cm angezeigt. Mit der Variablen time_between_2_measurements können Sie übrigens das Messintervall Ihren Wünschen entsprechend abändern. Diese Wartezeit sollte größer als 60 ms betragen.


.