Projekt I02 - Entfernung messen mit Schallwellen
Grundlagen der digitalen Ein-/Ausgabe, Verstaendnis von Funktionen und Variablen
Was du brauchst
Sendet Ultraschall-Impulse (40kHz) und misst die Zeit bis zum Echo. Damit laesst sich die Entfernung zu Objekten bestimmen.
Messbereich: 2cm - 400cm
Der HC-SR04 arbeitet mit 5V-Logik und ist perfekt fuer den Arduino Uno geeignet. Keine zusaetzlichen Bauteile noetig!
Schallgeschwindigkeit: 343 m/s = 0.0343 cm/us
Das sind 29.1 us pro cm
Entfernung = (Zeit / 2) / 29.1
TRIGGER:
ββββ ββββββββββββ
β β
βββββββ (10us Puls)
ECHO:
ββββββββ ββββ
β β
βββββββββββββ
|<-- Zeit -->|
Zeit = Hin + Zurueck
β Teilen durch 2!
Messbereich: 2cm bis 400cm
Genauigkeit: ca. 3mm
Verbindungen zum Arduino
Arduino Uno HC-SR04
βββββββββββββ ββββββββββββ
β β β ββββ β
β 5V βββββββΌβββββββΌβ VCC β
β β β β
β Pin 6 ββββΌβββββββΌβ TRIG β
β β β β
β Pin 7 ββββΌβββββββΌβ ECHO β
β β β β
β GND ββββββΌβββββββΌβ GND β
β β β ββββ β
βββββββββββββ ββββββββββββ
// Schritt 1: Pin-Definitionen und Setup
#define TRIGGER_PIN 6 // Trigger an Pin 6
#define ECHO_PIN 7 // Echo an Pin 7
void setup() {
Serial.begin(9600);
// Trigger ist Ausgang (wir senden)
pinMode(TRIGGER_PIN, OUTPUT);
// Echo ist Eingang (wir empfangen)
pinMode(ECHO_PIN, INPUT);
Serial.println("HC-SR04 Ultraschall-Sensor");
}
void loop() {
// Noch leer
}#define - Konstante ohne SpeicherTRIGGER ist OUTPUT (senden)ECHO ist INPUT (empfangen)Praeprozessor ersetzt den Text vor dem Kompilieren. Spart Speicher im Vergleich zu const int.
// Schritt 2: Trigger-Signal erzeugen
float measureDistance() {
// Trigger auf LOW setzen (sauberer Start)
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
// 10 Mikrosekunden HIGH-Puls senden
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Echo messen (kommt als naechstes...)
return 0;
}Der HC-SR04 benoetigt einen 10 Mikrosekunden langen HIGH-Puls am TRIG-Pin. Danach sendet er automatisch 8 Ultraschall-Impulse bei 40kHz aus.
delay() arbeitet in Millisekunden (1/1000 Sekunde).
delayMicroseconds() arbeitet in Mikrosekunden (1/1.000.000 Sekunde) - viel praeziser!
// Schritt 3: Echo-Dauer messen und Entfernung berechnen
float measureDistance() {
// Trigger-Signal senden
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Echo-Puls messen (Timeout: 30ms = ca. 5m)
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
return -1; // Timeout oder Fehler
}
// Entfernung = (Zeit / 2) / 29.1 us/cm
float distance = (duration / 2.0) / 29.1;
return distance;
}Schall braucht 29.1us pro cm. Die gemessene Zeit ist Hin + Zurueck, daher teilen wir durch 2.
// I02: HC-SR04 Ultraschall-Entfernungsmesser
#define TRIGGER_PIN 6
#define ECHO_PIN 7
void setup() {
Serial.begin(9600);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.println("HC-SR04 Ultraschall-Sensor");
}
float measureDistance() {
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) return -1;
return (duration / 2.0) / 29.1;
}
void loop() {
float dist = measureDistance();
if (dist > 0) {
Serial.print("Entfernung: ");
Serial.print(dist, 1);
Serial.println(" cm");
} else {
Serial.println("Messfehler");
}
delay(500);
}Simulation in Wokwi
Probiere diese Aufgaben aus
Fuege eine LED hinzu, die bei Entfernung unter 20cm leuchtet.
Ein Buzzer piept schneller, je naeher ein Objekt kommt (wie ein Einparksensor).
Miss 5x und berechne den Durchschnitt fuer stabilere Werte.
3 LEDs (gruen/gelb/rot) zeigen Entfernungszonen an: >50cm, 20-50cm, <20cm.
Du kannst jetzt Entfernungen messen
10us Puls zum Sensor senden
Echo-Dauer in Mikrosekunden
Schallgeschwindigkeit 343 m/s
I03: Servo-Motor - Praezise Winkelsteuerung mit PWM