Inhaltsverzeichnis
Entfernungen mit einem HC-SR04 Ultraschallsensor am Arduino messen
Aufgabe: Mit den Ultraschallsensor HC-SR04 und einem Arduino Mikrocontroller soll eine Entfernung gemessen und mit dem „serial-monitor“ angezeigt werden.
Wie funktioniert der Ultraschallsensor HC-SR04?
Der Sensor hat vier Anschlüsse: a) 5V(+) b) GND (–) c) echo d) trigger
Die Anschlüsse 5V und GND verstehen sich von selbst, sie versorgen den Sensor mit Energie.
Der Pin „trigger“ bekommt vom Mikrocontroller-Board ein kurzes Signal (5V), wodurch eine Schallwelle vom Ultraschallsensor ausgelöst wird. Sobald die Schallwelle gegen eine Wand oder sonstigen Gegenstand stößt, wird sie reflektiert und kommt irgendwann auch wieder zum Ultraschallsensor zurück. Sobald der Sensor diese zurückgekehrte Schallwelle erkennt, sendet der Sensor auf dem „echo“ Pin ein 5V Signal an das Mikrocontroller-Board. Dieser misst dann lediglich die Zeit zwischen dem Aussenden und der Rückkehr der Schallwelle und rechnet diese Zeit dann in eine Entfernung um. Auf gehts!
Der Schaltplan

Der Programmcode
int trigger=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
int echo=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
if (entfernung >= 500 || entfernung <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert"); //dann soll der serial monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
}
else // Ansonsten…
{
Serial.print(entfernung); //…soll der Wert der Entfernung an den serial monitor hier ausgegeben werden.
Serial.println(" cm"); // Hinter dem Wert der Entfernung soll auch am Serial Monitor die Einheit "cm" angegeben werden.
}
delay(1000); //Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.
}
Erweiterung: Ultraschallsensor mit akustischem Signal
Wenn ein Abstand unter 80cm gemessen wird, soll ein Piezo-Lautsprecher piepsen. Wir erweitern den oben stehenden Programmcode daher um einen Piezo-Speaker an Pin 5.
Der Programmcode
int trigger=7;
int echo=6;
long dauer=0;
long entfernung=0;
int piezo=5; //Das Wort piezo ist jetzt die Zahl 5
void setup()
{
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(piezo, OUTPUT); //Der Piezo-Lautsprecher an Pin5 soll ein Ausgang sein (Logisch, weil der ja vom Mikrokontroller-Board ja eine Spannung benötigt um zu piepsen.
}
void loop()
{
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) * 0.03432;
if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}
else
{
Serial.print(entfernung);
Serial.println(" cm");
}
//Es wird eine weitere IF-Bedingung erstellt:
if (entfernung <= 80)//Wenn der Wert für die Entfernung unter oder gleich 80 ist, dann...
{
digitalWrite(piezo,HIGH); //...fange an zu piepsen.
}
else //Und wenn das nicht so ist...
{
digitalWrite(piezo,LOW); //...dann sein leise.
}
delay(1000);
}
Erweiterung: Rückfahrwarner
Mit diesem Code lässt sich ein Rückfahrwarner konstruieren. An Pin12 wird dafür zusätzlich eine LED angeschlossen. Je näher ein Objekt in den Messbereich des Entfernungssensors kommt, desto schneller blinkt die LED.
Ein Bild folgt… kannst du den Rückfahrwarner trotzdem schon konstruieren?
Der Programmcode
int trigger=7;
int echo=6;
long dauer=0;
int LED=12;
long entfernung=0;
void setup()
{
Serial.begin (9600);
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
pinMode(12, OUTPUT);
}
void loop()
{
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH);
entfernung = (dauer/2) * 0.03432;
if (entfernung >= 500 || entfernung <= 0)
{
Serial.println("Kein Messwert");
}
else
{
Serial.print(entfernung);
Serial.println(" cm");
}
if (entfernung <= 40)
{
digitalWrite(LED, HIGH);
delay(entfernung*3);
digitalWrite(LED, LOW);
delay(entfernung*3);
}
}
Funduino - Dein Onlineshop für Mikroelektronik
-
Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
-
Mehr als 3.500 Artikel sofort verfügbar!
-
Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.