#116Mittel

ESP32 HC-SR04 Ultraschall-Entfernungsmesser

Der Ultraschallsensor HC-SR04 berechnet die Entfernung, indem er die Zeit misst, die die von ihm ausgesendete Schallwelle benötigt, um auf ein Objekt zu treffen und zurückzukehren (Time of Flight). In diesem Projekt senden wir mit dem ESP32 einen 10-Mikrosekunden-Impuls an den TRIG-Pin und lesen die vom ECHO-Pin kommende Echozeit mit `pulseIn()`. Die berechnete Entfernung geben wir in cm auf einem 16x2-I2C-LCD aus. Da der HC-SR04 mit 5 V betrieben wird, ist ein **Spannungsteiler** am ECHO-Pin zw

4.9(28)
44 abgeschlossen
ESP32 HC-SR04 Ultraschall-Entfernungsmesser
Ein kleines Gerät, das dir ohne Lineal sagt, wie weit deine Hand oder eine Schachtel entfernt ist. Der Abstandssensor schickt einen Ton aus, den du nicht hören kannst, und lauscht auf das Echo; der ESP32 schreibt das Ergebnis in Zentimetern auf ein kleines Display und meldet, wenn etwas außer Reichweite ist. So siehst du auf deinem Schreibtisch, wie Fledermäuse im Dunkeln ihren Weg finden.

Video

Schaltplan

ESP32 HC-SR04 Ultraschall-Entfernungsmesser - Circuit

Quellcode

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 HC-SR04 Ultraschall-Entfernungsmesser
4// ─────────────────────────────────────────
5// Löst den HC-SR04 mit einem TRIG-Impuls aus, berechnet aus der ECHO-Zeit
6// den Abstand (cm) und zeigt ihn alle 0.2 s auf einem 16x2-I2C-LCD an.
7// Kommt kein Echo zurück, zeigt der Bildschirm "Menzil disinda" (außer
8// Reichweite).
9//
10// Pins:
11//   GPIO 5  -> HC-SR04 TRIG
12//   GPIO 18 -> HC-SR04 ECHO (über einen Spannungsteiler)
13//   Teiler: ECHO -> 1k -> GPIO 18 -> 2k -> GND
14//   GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
15//   HC-SR04 und LCD VCC -> 5V (VIN), GND -> GND
16
17#include <Wire.h>
18#include <LiquidCrystal_I2C.h>
19
20// Pin-Definitionen
21const int TRIG_PIN = 5;
22const int ECHO_PIN = 18;   // Braucht einen Spannungsteiler aus 1k + 2k
23
24// LCD-Adresse 0x27 oder 0x3F
25LiquidCrystal_I2C lcd(0x27, 16, 2);
26
27const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Schallgeschwindigkeit (cm/us)
28const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Echo-Timeout (~5 m)
29
30void setup() {
31  pinMode(TRIG_PIN, OUTPUT);
32  pinMode(ECHO_PIN, INPUT);
33  digitalWrite(TRIG_PIN, LOW);
34
35  // Standard-I2C-Pins des DevKit V1
36  Wire.begin(21, 22);
37
38  lcd.init();
39  lcd.backlight();
40
41  // Splashscreen 3 s
42  lcd.setCursor(3, 0);
43  lcd.print("BlueGrays");
44  lcd.setCursor(1, 1);
45  lcd.print("HC-SR04 v1.0");
46  delay(3000);
47
48  // Hauptbildschirm
49  lcd.clear();
50  lcd.setCursor(0, 0);
51  lcd.print("Mesafe:");
52}
53
54// Liest den Abstand in cm, -1 bei Fehler
55float readDistanceCm() {
56  // Ein 10 us TRIG-Impuls startet eine Messung
57  digitalWrite(TRIG_PIN, LOW);
58  delayMicroseconds(2);
59  digitalWrite(TRIG_PIN, HIGH);
60  delayMicroseconds(10);
61  digitalWrite(TRIG_PIN, LOW);
62
63  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
64  if (duration == 0) return -1.0f;
65  // Hin und zurück, daher durch 2 teilen
66  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
67}
68
69void loop() {
70  float distance = readDistanceCm();
71
72  // Untere Zeile löschen
73  lcd.setCursor(0, 1);
74  lcd.print("                ");
75  lcd.setCursor(0, 1);
76
77  if (distance < 0) {
78    lcd.print("Menzil disinda");
79  } else {
80    lcd.print(distance, 1);   // 1 Nachkommastelle
81    lcd.print(" cm");
82  }
83
84  delay(200);
85}
86

FAQ

Warum wird in die ECHO-Leitung ein Spannungsteiler eingebaut?▾

Der HC-SR04 wird mit 5 V betrieben und liefert am ECHO-Pin 5 V; die ESP32-Eingänge akzeptieren maximal 3,3 V. Der mit 1-kΩ- und 2-kΩ-Widerständen aufgebaute Spannungsteiler senkt die 5 V auf etwa 3,3 V ab und schützt so den ESP32.

Wird für den TRIG-Pin ebenfalls ein Teiler benötigt?▾

Nein. TRIG ist ein Signal, das vom ESP32 zum Sensor geleitet wird; der 3,3-V-HIGH-Pegel des ESP32 wird vom HC-SR04 in der Regel zuverlässig erkannt.

Ist bei Verwendung des HC-SR04P ein Teiler erforderlich?▾

Modelle wie der HC-SR04P und der RCWL-1601 können mit 3,3 V betrieben werden; in diesem Fall beträgt die Spannung am ECHO-Ausgang ebenfalls 3,3 V, sodass kein Spannungsteiler erforderlich ist.

Wie lässt sich die Entfernungsmessung genauer gestalten?▾

Die Schallgeschwindigkeit ändert sich mit der Temperatur (bei 20 °C beträgt sie etwa 343 m/s). Die Korrektur der Schallgeschwindigkeit mithilfe eines Temperatursensors und die Ermittlung des Medians aus mehreren Messungen erhöhen die Genauigkeit.

ESP32 HC-SR04 Ultraschall-Entfernungsmesser | BlueGrays