HC-SR04 Ultraschall-Abstandsmesser mit Arduino – Tutorial

Der HC-SR04 ist einer der beliebtesten und günstigsten Sensoren für die Entfernungsmessung im Arduino-Universum. In diesem ausführlichen Guide lernst du die physikalischen Grundlagen der Ultraschallmessung kennen, baust zwei praxistaugliche Projekte auf und erfährst, worauf du bei Kalibrierung und Fehlerbehandlung achten musst.

Einleitung: Warum der HC-SR04?

Ob Parkhilfe, Füllstandsüberwachung oder Robotik – überall dort, wo berührungslos Entfernungen gemessen werden sollen, ist der HC-SR04 Ultraschallsensor eine der ersten Wahl. Er kostet nur wenige Euro, ist extrem einfach anzusteuern und liefert für die meisten Hobby-Anwendungen völlig ausreichende Genauigkeit. Kein Wunder also, dass er in unzähligen Tutorials, Starter-Kits und Maker-Projekten zu finden ist.

In diesem Artikel tauchen wir tief in die Materie ein. Du erfährst nicht nur, wie du den Sensor anschließt und ein paar Zeilen Code hochlädst – sondern auch, warum das Ganze so funktioniert, welche Fehlerquellen es gibt und wie du den HC-SR04 in echten Projekten einsetzt. Am Ende hast du zwei funktionierende Aufbauten: einen einfachen Abstandsmesser mit Ausgabe im Serial Monitor und einen erweiterten Aufbau mit OLED-Display und Warn-LED.

Das erwartet dich in diesem Artikel:

• Physikalische Grundlagen der Ultraschallmessung
• Technische Daten und Pinout des HC-SR04
• Projekt 1: Einfacher Abstandsmesser mit Serial Monitor
• Projekt 2: Abstandsmesser mit OLED-Display und Warn-LED
• Fehlerbehandlung, Kalibrierung und Praxistipps
• Reale Anwendungsfälle und Cross-Sale-Ideen

Physikalische Grundlagen: Wie funktioniert Ultraschall-Messung?

Das Echolot-Prinzip

Die Messmethode des HC-SR04 basiert auf dem gleichen Prinzip, das Fledermäuse und Delfine zur Orientierung nutzen: der Echolotung. Der Sensor sendet einen kurzen Ultraschall-Impuls aus, der von einem Objekt reflektiert wird und als Echo zum Sensor zurückkehrt. Aus der vergangenen Zeit zwischen Senden und Empfangen lässt sich die Entfernung berechnen.

Ultraschall bezeichnet Schallwellen mit Frequenzen oberhalb des menschlichen Hörbereichs – typischerweise ab 20 kHz. Der HC-SR04 arbeitet mit einer Frequenz von 40 kHz. Diese Frequenz ist hoch genug, um von den meisten Oberflächen gut reflektiert zu werden, und gleichzeitig niedrig genug für eine kostengünstige Elektronik.

Die Schallgeschwindigkeit – der Schlüssel zur Berechnung

Die zentrale physikalische Größe ist die Schallgeschwindigkeit in Luft. Sie beträgt bei 20 °C Raumtemperatur etwa 343 m/s (oder 0,0343 cm/µs). Entscheidend ist: Die Schallgeschwindigkeit ist temperaturabhängig. Pro Grad Celsius Temperaturänderung variiert sie um etwa 0,6 m/s. Bei 0 °C liegt sie bei ca. 331 m/s, bei 40 °C schon bei ca. 355 m/s.

Für die Distanzberechnung gilt folgende Formel:

Entfernung = (Schallgeschwindigkeit × gemessene Zeit) / 2

Die Division durch 2 ist notwendig, weil die gemessene Zeit den Hin- und Rückweg des Schalls umfasst. In der Arduino-typischen Mikrosekunden-Rechnung sieht das so aus:

Entfernung [cm] = (Dauer [µs] × 0,0343) / 2
                = Dauer [µs] × 0,01715

In vielen Arduino-Tutorials wird stattdessen mit dem Divisor 58 gerechnet (Dauer / 58 = Entfernung in cm), was mathematisch äquivalent ist (1 / 0,01715 ≈ 58,31). Die Abweichung durch den konstanten Faktor liegt bei unter einem Prozent und ist für die meisten Anwendungen vernachlässigbar.

Wichtiger Hinweis zur Schallgeschwindigkeit:

Die Schallgeschwindigkeit variiert nicht nur mit der Temperatur, sondern auch mit der Luftfeuchtigkeit und dem Luftdruck. Für hochpräzise Messungen solltest du einen Temperatursensor wie den DHT22 oder BME280 ergänzen und die Schallgeschwindigkeit dynamisch korrigieren. Im zweiten Projekt zeigen wir dir, wie das grundsätzlich geht – eine exakte Umsetzung hängt aber vom Einsatzzweck ab.

Wovon werden Ultraschallwellen reflektiert?

Grundsätzlich reflektieren harte, glatte Oberflächen Ultraschallwellen am besten. Weiche, poröse Materialien wie Schaumstoff, Textilien oder dicke Vorhänge absorbieren einen Großteil der Schallenergie und liefern schwache oder gar keine Echos. Auch stark geneigte Flächen können problematisch sein, da sie den Schall weg vom Sensor reflektieren.

Der HC-SR04 hat einen effektiven Öffnungswinkel von etwa 15–30°. Das bedeutet: Je weiter ein Objekt entfernt ist, desto größer ist der vom Schallkegel abgedeckte Bereich – und desto ungenauer wird die laterale Auflösung. Für präzise Messungen sollte das Zielobjekt möglichst senkrecht zur Sensorachse stehen.

Der HC-SR04 im Detail: Technische Daten & Pinout

Bevor wir mit den Projekten loslegen, ein genauerer Blick auf den Sensor selbst. Der HC-SR04 besteht aus zwei zylindrischen Ultraschallwandlern: einem Transmitter (T, Sendewandler) und einem Receiver (R, Empfangswandler). Hinzu kommt die Steuerelektronik auf der kleinen Platine.

📐 HC-SR04 – Technische Daten

  • Betriebsspannung: 5 V DC
  • Stromaufnahme: 15 mA (Ruhe), ca. 30-40 mA (während der Messung)
  • Ultraschallfrequenz: 40 kHz
  • Messbereich: 2 cm – 400 cm (theoretisch, praktisch eher 2 cm – 250 cm robust)
  • Auflösung: ca. 0,3 cm
  • Messwinkel: ca. 15–30°
  • Trigger-Signal: 10 µs TTL-High-Impuls
  • Echo-Signal: TTL-High-Impuls, Länge proportional zur Entfernung
  • Abmessungen: 45 × 20 × 15 mm
  • Gewicht: ca. 8,5 g

Pinout – die vier Anschlüsse

Pin Bezeichnung Funktion Verbinden mit
VCC Spannungsversorgung +5 V Betriebsspannung 5V-Pin des Arduino
Trig Trigger Sendet Messimpuls aus Digitaler Ausgangspin (z. B. Pin 9)
Echo Echo Empfängt das Echo-Signal Digitaler Eingangspin (z. B. Pin 10)
GND Masse Ground / 0 V GND-Pin des Arduino

Das ist denkbar einfach: Vier Pins, zwei davon für die Stromversorgung, zwei für die Logik. Mehr braucht es nicht, um Entfernungen präzise zu messen.

So läuft eine Messung ab

  1. Der Mikrocontroller sendet einen 10 µs langen HIGH-Puls an den Trig-Pin.
  2. Der Sensor sendet daraufhin 8 Ultraschall-Impulse mit 40 kHz über den Transmitter aus.
  3. Gleichzeitig setzt der Sensor den Echo-Pin auf HIGH.
  4. Trifft ein Echo ein, wird der Echo-Pin wieder auf LOW gesetzt.
  5. Der Mikrocontroller misst die Dauer des HIGH-Impulses am Echo-Pin mit pulseIn() in Mikrosekunden.
  6. Aus der Dauer wird die Entfernung berechnet.

Vorsicht: 5 V Logik!

Der HC-SR04 arbeitet mit 5 V Logikpegel. Moderne 3,3-V-Boards wie ESP32 oder Raspberry Pi Pico benötigen einen Logic-Level-Converter oder Spannungsteiler am Echo-Pin, um Schäden zu vermeiden. Die hier gezeigten Projekte verwenden Arduino-Boards mit 5 V – damit bist du auf der sicheren Seite.

Benötigte Hardware für beide Projekte

Hier findest du alle Komponenten, die du für die beiden folgenden Projekte brauchst. Projekt 1 benötigt nur die Grundausstattung, Projekt 2 kommt mit Display und LED dazu.

Projekt 1: Einfacher Abstandsmesser

Projekt 2: Abstandsmesser mit OLED-Display & Warn-LED

Zusätzlich zu den Komponenten aus Projekt 1:

  • 0,96" OLED Display SSD1306 (I2C)
  • 1× Rote LED (5 mm)
  • 1× Widerstand 220 Ω (für die LED)
  • 1× Buzzer oder Piezo-Summer (optional)
  • Zusätzliche Jumper Wire

🛒 Alles auf einen Blick

Den HC-SR04 Ultraschallsensor findest du bei makeroo in Erstausrüster-Qualität. Dazu passend: Mikrocontroller-Boards und Sensoren & Module – alles aus einer Hand, schnell geliefert.

Projekt 1: Einfacher Abstandsmesser mit Serial Monitor

Das erste Projekt ist der Klassiker: ein simpler Abstandsmesser, der die gemessene Entfernung kontinuierlich im Serial Monitor der Arduino IDE ausgibt. Perfekt, um den Sensor kennenzulernen und ein Gefühl für die Messwerte zu bekommen.

Schaltplan – so einfach wie möglich

Die Verkabelung ist in wenigen Minuten erledigt:

  1. HC-SR04 VCC5V des Arduino
  2. HC-SR04 GNDGND des Arduino
  3. HC-SR04 TrigDigital Pin 9 des Arduino
  4. HC-SR04 EchoDigital Pin 10 des Arduino

Steck den HC-SR04 einfach quer ins Breadboard, sodass die vier Pins in verschiedenen Reihen stecken, und verbinde sie mit Jumper-Kabeln zum Arduino. Achte darauf, dass der Sensor senkrecht nach vorne zeigt – in die Richtung, in die du messen möchtest.

Der Code – kommentiert und erklärt

/*
 * Projekt 1: HC-SR04 Abstandsmesser mit Serial Monitor
 * Gibt die gemessene Entfernung in cm auf dem Serial Monitor aus.
 */

const int trigPin = 9;    // Trigger-Pin an Digital 9
const int echoPin = 10;   // Echo-Pin an Digital 10

float duration;           // Dauer des Echo-Impulses in µs
float distance;           // Berechnete Entfernung in cm

void setup() {
  // Serielle Kommunikation starten
  Serial.begin(9600);
  Serial.println("=== HC-SR04 Abstandsmesser ===");
  Serial.println("Entfernung wird kontinuierlich gemessen...");
  Serial.println("");

  // Pin-Modi festlegen
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  // Schritt 1: Kurzen LOW-Puls, um sauberes Signal sicherzustellen
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // Schritt 2: 10 µs HIGH-Impuls → löst die Messung aus
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Schritt 3: Dauer des Echo-Impulses messen
  // pulseIn() wartet max. 30 ms (30000 µs) – reicht für ~5 m
  duration = pulseIn(echoPin, HIGH, 30000);

  // Schritt 4: Entfernung berechnen
  // Formel: distance = duration * 0.0343 / 2
  // Vereinfacht: distance = duration / 58.0
  distance = duration * 0.0343 / 2;

  // Schritt 5: Ergebnis ausgeben
  if (distance > 0 && distance < 400) {
    // Gültige Messung
    Serial.print("Entfernung: ");
    Serial.print(distance, 1);  // Eine Nachkommastelle
    Serial.println(" cm");
  } else if (distance == 0) {
    // Timeout – kein Echo empfangen
    Serial.println("Kein Echo – Objekt zu weit entfernt oder nicht erkannt!");
  }

  delay(200);  // 200 ms Pause zwischen den Messungen
}

Code-Erklärung – was passiert hier?

Schauen wir uns die wichtigsten Teile genauer an:

  • Zeilen 1–5 (Konstanten): trigPin und echoPin sind als Konstanten definiert. Wenn du andere Pins verwenden möchtest, änderst du nur diese zwei Werte.
  • Zeile 11 (Serial.begin(9600)): Startet die serielle Kommunikation mit 9600 Baud. Öffne nach dem Upload den Serial Monitor in der Arduino IDE (Strg+Shift+M), um die Ausgabe zu sehen.
  • Zeilen 28–31 (Trigger-Signal): Das ist das Herzstück. Der 10-µs-Trigger-Puls startet die Messung. Der vorherige LOW-Puls mit 2 µs stellt sicher, dass kein Restsignal mehr anliegt.
  • Zeile 35 (pulseIn()): Misst die Dauer des HIGH-Impulses am Echo-Pin. Der dritte Parameter (30000) ist der Timeout in Mikrosekunden – nach 30 ms bricht die Funktion ab und gibt 0 zurück. Das entspricht einer maximal messbaren Distanz von etwa 5 Metern.
  • Zeilen 40–46 (Plausibilitätsprüfung): Werte außerhalb des technisch möglichen Bereichs (0 oder über 400 cm) werden als Fehler behandelt. Das verhindert Ausreißer in der Ausgabe.

💡 Pro-Tipp: Moving Average für glattere Werte

Die Einzelmessungen des HC-SR04 rauschen leicht. Für stabilere Anzeigen kannst du einen gleitenden Mittelwert über 5–10 Messungen bilden. Einfach die letzten N Werte in einem Array speichern und den Durchschnitt ausgeben – das Rauschen sinkt drastisch, ohne nennenswerte Verzögerung.

Projekt 2: Abstandsmesser mit OLED-Display & Warn-LED

Jetzt wird es praktischer: Statt die Werte nur auf dem PC auszugeben, bauen wir einen autonomen Abstandsmesser mit eigenem Display. Ein OLED-Display zeigt die Entfernung live an, und eine rote LED warnt, sobald ein kritisches Mindestmaß unterschritten wird. Das Ganze läuft komplett ohne PC – perfekt als Einparkhilfe, Füllstandsanzeige oder Robotik-Sensor.

Schaltplan – der erweiterte Aufbau

Zusätzlich zur Verkabelung aus Projekt 1 kommen nun OLED-Display und LED hinzu:

  1. HC-SR04 → Arduino wie in Projekt 1 (VCC→5V, GND→GND, Trig→9, Echo→10)
  2. OLED SDA → Arduino A4 (I2C Data)
  3. OLED SCL → Arduino A5 (I2C Clock)
  4. OLED VCC → Arduino 3.3V oder 5V (je nach Modul – die meisten SSD1306 können beides)
  5. OLED GND → Arduino GND
  6. LED Anode (langes Bein) → 220 Ω Widerstand → Arduino Digital Pin 6
  7. LED Kathode (kurzes Bein, abgeflachte Seite) → Arduino GND

⚠️ OLED-Spannungsversorgung prüfen!

Viele 0,96" SSD1306-Module arbeiten mit 3,3 V Logik, vertragen aber 5 V an VCC (da sie einen eigenen Spannungsregler haben). Lies das Datenblatt deines spezifischen Moduls oder schließe VCC sicherheitshalber an 3,3 V an. Die I2C-Kommunikation über SDA/SCL funktioniert bei 5-V-Arduinos problemlos, da die Pull-Up-Widerstände auf dem Modul sitzen.

Benötigte Bibliotheken

Für das OLED-Display brauchst du zwei Bibliotheken, die du über den Library Manager der Arduino IDE installieren kannst:

  • Adafruit SSD1306 – Treiber für das OLED-Display
  • Adafruit GFX Library – Grafikbibliothek für Texte und Formen

Der vollständige Code – ausführlich kommentiert

/*
 * Projekt 2: HC-SR04 Abstandsmesser mit OLED-Display & Warn-LED
 * Zeigt die Entfernung live auf einem 0,96" OLED-Display an.
 * Eine rote LED warnt bei Unterschreitung eines Schwellwerts.
 * Optional: Buzzer-Ausgabe für akustische Warnung.
 *
 * Benötigte Bibliotheken:
 *   - Adafruit SSD1306 (von Adafruit)
 *   - Adafruit GFX Library (von Adafruit)
 */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ============ OLED-Display Konfiguration ============
#define SCREEN_WIDTH 128        // OLED Breite in Pixel
#define SCREEN_HEIGHT 64        // OLED Höhe in Pixel
#define OLED_RESET -1           // Reset-Pin (-1 = Arduino Reset teilen)
#define SCREEN_ADDRESS 0x3C     // I2C-Adresse des Displays (oft 0x3C, manchmal 0x3D)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ============ HC-SR04 Konfiguration ============
const int trigPin = 9;
const int echoPin = 10;

// ============ LED & Buzzer Konfiguration ============
const int ledPin = 6;           // Warn-LED
const int buzzerPin = 5;        // Optional: Buzzer (auf 0 setzen wenn nicht genutzt)

// ============ Schwellwerte & Einstellungen ============
const int WARN_DISTANCE = 20;   // Abstand in cm, ab dem gewarnt wird
const int ALARM_DISTANCE = 10;  // Abstand, ab dem Dauer-Alarm ertönt
const int MAX_DISTANCE = 250;   // Maximal anzuzeigende Entfernung
const int MEASURE_DELAY = 100;  // ms zwischen Messungen
const int MOVING_AVG = 5;       // Anzahl Messwerte für gleitenden Mittelwert

// ============ Globale Variablen ============
float distances[MOVING_AVG];    // Array für gleitenden Mittelwert
int measureIndex = 0;           // Aktueller Index im Array
unsigned long lastMeasure = 0;  // Zeitstempel der letzten Messung

// ============ Icons als Bitmaps (einfache Pixel-Grafiken) ============
// Einfaches Distanz-Symbol (12x12 Pixel), nur zur Illustration
// Du kannst eigene Bitmaps mit Tools wie "image2cpp" erstellen
const unsigned char icon_distance [] PROGMEM = {
  0x00, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x33, 0x00, 0x21, 0x80, 0x61, 0x80,
  0x61, 0x80, 0x21, 0x80, 0x33, 0x00, 0x1e, 0x00, 0x0c, 0x00, 0x00, 0x00
};

void setup() {
  Serial.begin(9600);

  // HC-SR04 Pins
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // LED & Buzzer
  pinMode(ledPin, OUTPUT);
  if (buzzerPin > 0) pinMode(buzzerPin, OUTPUT);

  // OLED initialisieren
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("OLED nicht gefunden! Verkabelung prüfen."));
    while (true);  // Endlosschleife bei Fehler – blinke LED als Hinweis
  }

  // Boot-Animation auf dem Display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 5);
  display.println(F("HC-SR04"));
  display.setCursor(10, 20);
  display.println(F("Abstandsmesser"));
  display.setCursor(10, 40);
  display.println(F("Starte..."));
  display.display();
  delay(1500);

  // Messarray initialisieren
  for (int i = 0; i < MOVING_AVG; i++) {
    distances[i] = 0;
  }

  Serial.println(F("=== HC-SR04 mit OLED & LED ==="));
}

void loop() {
  // ===== 1. ENTFERNUNG MESSEN =====
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH, 30000);
  float rawDistance = duration * 0.0343 / 2;

  // Plausibilitätsprüfung – Werte außerhalb des gültigen Bereichs ignorieren
  if (rawDistance <= 0 || rawDistance > MAX_DISTANCE) {
    // Ungültiger Wert – Messung überspringen (alten Wert beibehalten)
    rawDistance = distances[(measureIndex - 1 + MOVING_AVG) % MOVING_AVG];
  }

  // ===== 2. GLEITENDEN MITTELWERT BILDEN =====
  distances[measureIndex] = rawDistance;
  measureIndex = (measureIndex + 1) % MOVING_AVG;

  float avgDistance = 0;
  for (int i = 0; i < MOVING_AVG; i++) {
    avgDistance += distances[i];
  }
  avgDistance /= MOVING_AVG;

  // ===== 3. WARN-LED & BUZZER STEUERN =====
  if (avgDistance <= ALARM_DISTANCE) {
    // Dauer-Alarm: LED an, Buzzer Dauer-Ton
    digitalWrite(ledPin, HIGH);
    if (buzzerPin > 0) digitalWrite(buzzerPin, HIGH);
  } else if (avgDistance <= WARN_DISTANCE) {
    // Pulsierende Warnung: LED und Buzzer blitzen im Takt
    // Alle 150 ms umschalten → ca. 3 Hz Blinkfrequenz
    bool blinkState = (millis() / 150) % 2;
    digitalWrite(ledPin, blinkState);
    if (buzzerPin > 0) digitalWrite(buzzerPin, blinkState);
  } else {
    // Keine Gefahr – alles aus
    digitalWrite(ledPin, LOW);
    if (buzzerPin > 0) digitalWrite(buzzerPin, LOW);
  }

  // ===== 4. OLED-UPDATE =====
  updateDisplay(avgDistance);

  // ===== 5. SERIAL OUTPUT (für Debugging) =====
  Serial.print(F("Roh: "));
  Serial.print(rawDistance, 1);
  Serial.print(F(" cm | Mittel: "));
  Serial.print(avgDistance, 1);
  Serial.print(F(" cm | LED: "));
  Serial.println(digitalRead(ledPin) ? "AN" : "AUS");

  delay(MEASURE_DELAY);
}

void updateDisplay(float distance) {
  display.clearDisplay();

  // Kopfzeile mit Titel
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("=== HC-SR04 ==="));

  // Horizontale Trennlinie
  display.drawLine(0, 10, SCREEN_WIDTH, 10, SSD1306_WHITE);

  // Große Entfernungsanzeige
  display.setTextSize(3);
  display.setCursor(5, 18);

  if (distance < 10) {
    // Bei einstelligen Werten etwas einrücken für schöneres Layout
    display.setCursor(30, 18);
    display.print(distance, 1);
  } else if (distance < 100) {
    display.setCursor(15, 18);
    display.print(distance, 1);
  } else {
    display.setCursor(5, 18);
    display.print(distance, 0);  // Bei >100 cm keine Nachkommastelle
  }

  // Einheit
  display.setTextSize(1);
  display.setCursor(100, 22);
  display.print(F("cm"));

  // Status-Zeile
  display.setTextSize(1);
  display.setCursor(0, 54);

  if (distance <= ALARM_DISTANCE) {
    display.print(F("!! ZU NAH !!"));
  } else if (distance <= WARN_DISTANCE) {
    display.print(F("Achtung!"));
  } else if (distance > MAX_DISTANCE) {
    display.print(F("Kein Objekt"));
  } else {
    display.print(F("OK"));
  }

  // Fortschrittsbalken (visuelle Distanzdarstellung)
  int barWidth = map(constrain(distance, 0, MAX_DISTANCE), 0, MAX_DISTANCE, 0, SCREEN_WIDTH);
  display.drawRect(0, 48, SCREEN_WIDTH, 5, SSD1306_WHITE);
  display.fillRect(0, 49, barWidth, 3, SSD1306_WHITE);

  display.display();
}

Feature-Übersicht des erweiterten Codes

Dieser Code geht deutlich über das einfache Beispiel hinaus und enthält mehrere praxisrelevante Features:

  • Gleitender Mittelwert: Die letzten 5 Messungen werden gemittelt – das eliminiert Ausreißer und glättet die Anzeige, ohne relevante Verzögerung.
  • Zwei Warnstufen: Unter 20 cm blinkt die LED als Vorwarnung, unter 10 cm leuchtet sie dauerhaft. Mit optionalem Buzzer für akustische Rückmeldung.
  • Fehlerresistente Messung: Ungültige Werte (0 oder über 250 cm) werden verworfen und durch den letzten gültigen Messwert ersetzt – kein Springen der Anzeige.
  • OLED-Startanimation: Ein kurzer Boot-Screen beim Einschalten macht das Gerät benutzerfreundlich.
  • Visueller Fortschrittsbalken: Ein Balken am unteren Displayrand zeigt die relative Entfernung grafisch an – intuitive Erfassung auf einen Blick.
  • Debug-Ausgabe: Parallel zur OLED-Anzeige laufen Rohdaten über Serial – praktisch während der Entwicklung.

🧪 Erweiterungsidee: Temperaturkompensation

Für wirklich präzise Messungen kannst du die Schallgeschwindigkeit temperaturkorrigieren. Ergänze einen DHT22 oder BME280 und ersetze den konstanten Faktor 0.0343 durch: 0.0343 * sqrt((tempC + 273.15) / 293.15). Bei 10 °C Temperaturunterschied macht das schon ca. 2 cm auf 2 Meter aus – für Outdoor-Anwendungen relevant!

Fehlerbehandlung und Kalibrierung

Typische Fehler und ihre Ursachen

Symptom Mögliche Ursache Lösung
Serial Monitor zeigt immer 0 cm Echo-Pin falsch verbunden; Objekt zu weit; Sensor defekt Verkabelung prüfen (Echo→10, Trig→9); Objekt in <2 m testen; Sensor tauschen
Stark schwankende Werte Rauschen; zu kleine Zieloberfläche; ungünstiger Winkel Moving Average implementieren; flache, senkrechte Zielplatte verwenden
Wert „klebt" bei ~17 cm Mehrfachreflexionen / Resonanzen im Nahbereich Mindestabstand von 2 cm einhalten; Messintervall erhöhen
OLED bleibt schwarz I2C-Adresse falsch; Spannungsversorgung fehlt Adresse prüfen (0x3C vs. 0x3D); VCC an 3.3V testen; I2C-Scanner laufen lassen
LED leuchtet nicht Falsche Polung; fehlender Vorwiderstand Anode (langes Bein) an Pin 6 über 220Ω; Kathode an GND
Messung bricht bei >2 m ab Raum zu hallig; Ziel zu klein/weich; Sensor außerhalb Spezifikation Hartes, flaches Ziel (Holzbrett) verwenden; Sensor leicht nachjustieren

Kalibrierung – wie genau ist dein Sensor?

Jeder HC-SR04 hat leichte Fertigungstoleranzen. Für Anwendungen, die es genauer brauchen, lohnt sich eine einfache Kalibrierung:

  1. Referenzdistanzen aufbauen: Stelle ein flaches Objekt (z. B. ein Stück Pappe oder eine Holzplatte) exakt in 20 cm, 50 cm, 100 cm und 150 cm Entfernung vom Sensor auf. Miss mit einem Maßband oder Messschieber.
  2. Messwerte aufzeichnen: Nimm für jede Referenzdistanz 20–30 Messwerte auf und bilde den Mittelwert. Unser Code aus Projekt 2 macht das bereits.
  3. Korrekturfaktor berechnen: Weicht der Mittelwert systematisch ab (z. B. zeigt der Sensor bei 100 cm immer 102 cm an), kannst du einen linearen Korrekturfaktor in die Berechnung einbauen: distance = distance * 0.98;.
  4. Offset anpassen: Ein konstanter Offset (z. B. immer +1,5 cm) kann ebenfalls korrigiert werden: distance = distance - 1.5;.

Keine Panik bei Abweichungen:

Der HC-SR04 ist kein Lasermessgerät. Abweichungen von ±1 cm im Bereich 20–200 cm sind völlig normal und für die allermeisten Hobby-Anwendungen (Parkhilfe, Füllstand, Robotik) mehr als ausreichend. Kalibriere nur, wenn deine Anwendung zwingend höhere Genauigkeit erfordert.

Stromversorgung – unterschätzter Faktor

Ein häufig übersehener Punkt bei Messproblemen ist die Stromversorgung. Der HC-SR04 zieht während der Messung kurze Stromspitzen von bis zu 40 mA. Wird der Arduino über einen längeren, dünnen USB-Kabel oder einen schwachen USB-Port versorgt, können Spannungseinbrüche die Messung verfälschen. Symptome sind ungewöhnlich lange oder kurze Echozeiten, die mit der Kabellänge variieren.

Abhilfe schafft ein 100–470 µF Elektrolytkondensator zwischen 5V und GND direkt auf dem Breadboard, in unmittelbarer Nähe zum Sensor. Der Kondensator puffert die Stromspitzen und glättet die Versorgungsspannung. Besonders bei batteriebetriebenen Projekten ist dieser kleine Zusatz Gold wert.

Software-Tricks für stabilere Messwerte

  • Median-Filter: Statt eines gleitenden Mittelwerts nimmst du den Median aus 5 Messungen – das eliminiert einzelne extreme Ausreißer noch effektiver.
  • Timeout reduzieren: Der pulseIn()-Timeout von 30 ms ist für 4 m ausgelegt. Wenn du nur bis 1 m messen willst, setze ihn auf 6000 µs – falsche lange Echozeiten werden schneller verworfen.
  • Sprung-Erkennung: Ändert sich der Messwert plötzlich um mehr als 50 cm, ignoriere den Wert – echte Objekte bewegen sich selten so sprunghaft.
  • Doppelmessung verwerfen: Manchmal erzeugt eine Messung ein Echo, das in die nächste Messung hineinreicht. Ein längeres delay() (50+ ms) zwischen den Messungen verhindert das.

Praktische Anwendungen für den HC-SR04

Nachdem du den Sensor jetzt im Detail kennst, hier einige konkrete Projektideen, die über das reine „Entfernung messen" hinausgehen:

1. Einparkhilfe für die Werkstatt oder Garage

Montiere den HC-SR04 an der Garagenwand gegenüber dem Parkplatz. Sobald das Auto näher als 50 cm entfernt ist, beginnt die Warn-LED zu leuchten, unter 20 cm ertönt ein Buzzer. Unser Code aus Projekt 2 ist mit minimalen Anpassungen direkt einsatzbereit. Für die dauerhafte Installation empfehlen wir ein Nano V3 – kompakt, günstig und per USB-C versorgbar.

Ein wichtiger Praxistipp für Garagen-Installationen: Feuchte Luft und Temperaturschwankungen im Jahresverlauf verändern die Schallgeschwindigkeit merklich. Im Winter bei 0 °C zeigt der Sensor etwa 3,5 % zu wenig an – bei 2 m Abstand sind das 7 cm Unterschied. Ein Temperatursensor wie der DHT22 zur dynamischen Kompensation macht die Anzeige ganzjährig präzise. Alternativ kannst du den HC-SR04 in einem kleinen wassergeschützten Gehäuse unterbringen – achte aber darauf, dass die Sensorköpfe freie Sicht haben und nicht durch die Gehäusewand messen müssen.

2. Füllstandsmessung in Tanks oder Silos

Der HC-SR04 eignet sich hervorragend für die berührungslose Füllstandsmessung von Flüssigkeiten, Granulaten oder Pellets. Montiere den Sensor oberhalb des Behälters, mit Blickrichtung senkrecht nach unten auf die Materialoberfläche. Beachte: Die Reflexion von Ultraschall an unebenen Oberflächen (Schüttgut) kann streuen – ein breiterer Trichter oder ein Leitungsrohr verbessert die Messgenauigkeit. Für feuchte Umgebungen empfehlen wir den wasserdichten Bruder JSN-SR04T.

3. Robotik – Hinderniserkennung und Navigation

Mobile Roboter nutzen den HC-SR04 zur Hinderniserkennung. Mit zwei oder drei Sensoren (vorne, links, rechts) lassen sich einfache Navigationslogiken umsetzen: „Nähert sich links ein Hindernis, weiche nach rechts aus." Ein Servo-Mount für den Sensor (Schwenk-Neige-Mechanismus) erweitert das Sichtfeld auf nahezu 180°.

Ein häufiges Problem in der Robotik: Schnelle Bewegungen führen zu Störungen, weil der Sensor bei der vorherigen Messung noch ein Echo erwartet. Setze in Robotik-Projekten delay(60) zwischen den Messungen – das verhindert Übersprechen zuverlässig.

Für fortgeschrittene Roboter lohnt sich die Kombination mehrerer Sensortypen: Der HC-SR04 erfasst die grobe Umgebung auf 2–4 m, während ein VL53L0X Time-of-Flight-Lasersensor die Nahbereichs-Präzision (bis 2 m mit ±3 % Genauigkeit, aber dafür mit nur 2° Öffnungswinkel) liefert. Gemeinsam ergeben sie ein robustes Sensor-Fusions-System, das sowohl Weitbereich als auch Feinauflösung abdeckt – perfekt für autonome Fahrzeuge im Maker-Maßstab.

4. Besucherzähler oder Türschranke

Zwei nebeneinander montierte HC-SR04 in einem Türrahmen können erkennen, ob jemand eintritt oder hinausgeht – einfach durch die Reihenfolge, in der die Strahlen unterbrochen werden. Kombiniert mit dem OLED-Display hast du einen kompakten Personenzähler.

5. Interaktive Installationen und Kunstprojekte

Auch im kreativen Bereich glänzt der HC-SR04: gestengesteuerte Sound-Installationen, näherungsabhängige LED-Beleuchtung, oder ein „Theremin-ähnliches" Musikinstrument, das die Handposition in Tonhöhe und Lautstärke übersetzt. Die einfache Ansteuerung macht den Sensor auch für Anfänger im kreativen Coding zugänglich.

🔧 Nano V3 – die kompakte Alternative zum UNO R3

  • Gleicher ATmega328P-Chip – 100% Code-kompatibel zum UNO R3
  • Nur 43 × 18 mm – ideal für dauerhafte Installationen und beengte Einbausituationen
  • USB-C-Anschluss für moderne Netzteile und Powerbanks
  • Perfekt auf Breadboards steckbar – kein zusätzlicher Platzverlust
  • Betrieb auch mit 7–12 V über Vin oder mit 5 V über USB möglich

👉 Der Nano V3 ist die perfekte Wahl, wenn du den Abstandsmesser als dauerhaftes Gerät in ein Projektgehäuse einbauen möchtest.

Cross-Selling: Das richtige Zubehör für dein Projekt

Ein Projekt wie der autonome Abstandsmesser lebt von der Qualität der Komponenten. Hier eine kurze Übersicht, was bei makeroo gut zusammenpasst:

Komponente Warum wichtig? Link
OLED Display 0,96" Kompakte, stromsparende Anzeige – 128×64 Pixel, perfekt für Sensor-Dashboards Zum Produkt
Nano V3 Breadboard-freundlich, USB-C, 100% UNO-kompatibel – ideal für finale Projekte Zum Produkt
UNO R3 Der Klassiker für den Einstieg und Prototyping – robust und weit verbreitet Zum Produkt
Breadboard 400 Sauberes Prototyping ohne Löten – ausreichend Platz für Sensor + Display + LED Zum Produkt
JST-XH Stecker-Sortiment Für den sauberen Übergang vom Breadboard zum finalen Gehäuse – professionelle Steckverbindungen Zum Produkt

🎯 Starte jetzt dein HC-SR04-Projekt

Alles, was du für die Projekte aus diesem Artikel brauchst, findest du bei makeroo:

Den HC-SR04 UltraschallsensorMikrocontroller-BoardsSensoren & Module

Alle Produkte sind lagernd und werden schnell versendet – damit du direkt loslegen kannst.

Fazit: Der HC-SR04 – klein, günstig, unschlagbar praktisch

Der HC-SR04 ist seit Jahren einer der beliebtesten Sensoren im Arduino-Ökosystem – und das völlig zu Recht. Für einen Materialpreis von wenigen Euro liefert er zuverlässige Entfernungsmessungen, die für 90 % aller Hobby- und Semi-Professionellen Anwendungen völlig ausreichen. Die Ansteuerung ist mit nur zwei GPIO-Pins plus Stromversorgung denkbar einfach, und dank der riesigen Community findest du für nahezu jedes Problem eine Lösung.

Wir haben in diesem Artikel die physikalischen Grundlagen von Schallausbreitung und Echolotung kennengelernt, einen einfachen Abstandsmesser mit Serial Monitor gebaut und diesen zu einem autonomen Gerät mit OLED-Display, Warn-LED und gleitendem Mittelwert erweitert. Dazu gab es handfeste Tipps zu Fehlerbehandlung, Kalibrierung und praktischen Anwendungen – von der Einparkhilfe bis zum Roboter.

Letztlich ist der HC-SR04 ein Türöffner für die Welt der Sensorik. Wer ihn verstanden hat, kann mit wenig Aufwand interaktive, messende, reagierende Projekte bauen, die im Alltag echten Nutzen stiften. Und das Beste: Der Einstieg kostet dich weniger als ein Kinoticket.

Wer tiefer einsteigen will, findet im Netz unzählige Anleitungen und Projekte. Aber die meisten basieren auf den gleichen, hier vorgestellten Grundprinzipien. Beherrsche den einfachen Aufbau, verstehe die Sensor-Physik, und du kannst den HC-SR04 in praktisch jedem Projekt einsetzen, das Entfernungsmessung erfordert.

Und denk dran: Der HC-SR04 ist nur der Anfang. Mit demselben Arduino und I2C-Bus lassen sich problemlos weitere Sensoren kombinieren – Temperatur, Luftfeuchtigkeit, Luftdruck, Helligkeit, Bewegung. Der Schritt vom einfachen Abstandsmesser zum vollwertigen Umgebungsmonitor ist kleiner, als du denkst. Das OLED-Display aus Projekt 2 zeigt dir dann nicht nur die Entfernung, sondern gleich das ganze Dashboard mit allen Messwerten auf einen Blick.

In diesem Sinne: Sensor raus, Arduino an, Abstand messen! 🦉

Hast du Fragen zum HC-SR04 oder ein spannendes Projekt umgesetzt? Schreib uns eine E-Mail oder kontaktiere uns über das Kontaktformular auf makeroo.de – wir freuen uns auf deine Rückmeldung!

Zurück zum Blog