Inhaltsverzeichnis
Aufgabe: Mit den Ultraschallsensor HC-SR04 und verschiedenen Mikrocontrollern soll eine Entfernung gemessen und im Seriellen Monitor angezeigt werden.
Wie funktioniert der Ultraschallsensor HC-SR04?
Der Sensor hat vier Anschlüsse:
VCC (+) Trig (Signal senden) Echo (reflektiertes Signal empfangen Gnd (-)
Der Ultraschallsensor strahlt einen kurzen Schallimpuls aus. Dieser bewegt sich mit Schallgeschwindigkeit in der Luft.
Trifft er auf ein Objekt, wird er dort reflektiert und gelangt als Echo zurück zum Ultraschallsensor. Aus der Zeitspanne zwischen dem Aussenden des Schallimpulses und dem Empfang des Echosignals berechnet der Ultraschallsensor die Entfernung zum Objekt.
Im Programm sendet der Befehl pulseIn() ein HIGH-Signal, startet einen Timer und wartet anschließend darauf, dass das Signal wieder zurückkommt (den Wert LOW hat). Daraufhin wird der Timer gestoppt und die Zeitspanne zwischen dem Senden des Signal (Trigger) und seiner Rückkehr (Echo) wird in Mikrosekunden ermittelt.
Die Geschwindigkeit des Schalls in der Luft beträgt 343,20 m/s. Dieser Wert muss in cm/µs (cm/Mikrosekunde) umgerechnet werden.
Umrechnung m in cm:
343,20 m * 100 = 34.320 cm
Strecke in cm pro ms (Millisekunde):
34.320 cm : 1.000 = 34,32 cm/ms)
Strecke in cm pro Mikrosekunde (µs):
34,32 cm : 1.000 = 0,03432 cm/ µs
Im Programm muss das Komma in der Zahl in die angloamerikanische Schreibweise mit Punkt verwendet werden.
Entfernung im Seriellen Monitor anzeigen
Der Ultraschallsensor misst die Entfernung und zeigt das Ergebnis im Seriellen Monitor an.
Schaltpläne
Der Programmcode
Arduino UNO
// Pin für den Sender
int SENDEN = 7;
// Pin für das vom Objekt reflektierte Signal
int ECHO = 6;
// Variable für die Speicherung der Entfernung
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
// Seriellen Monitor starten
Serial.begin(9600);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal für 10 Micrsekunden senden, danach wieder ausschalten
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
delay(500);
// nur Entfernungen < 100 anzeigen
if (Entfernung < 100)
{
// Messdaten anzeigen
Serial.print("Entfernung in cm: ");
Serial.println(Entfernung);
}
}
Wemos D1 Mini
// Pin für den Sender
int SENDEN = D1;
// Pin für das vom Objekt reflektierte Signal
int ECHO = D2;
// Variable für die Speicherung der Entfernung
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
// Seriellen Monitor starten
Serial.begin(9600);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal für 10 Micrsekunden senden, danach wieder ausschalten
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
delay(500);
// nur Entfernungen < 100 anzeigen
if (Entfernung < 100)
{
// Messdaten anzeigen
Serial.print("Entfernung in cm: ");
Serial.println(Entfernung);
}
}
NodeMCU
// Pin für den Sender
int SENDEN = D1;
// Pin für das vom Objekt reflektierte Signal
int ECHO = D2;
// Variable für die Speicherung der Entfernung
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
// Seriellen Monitor starten
Serial.begin(9600);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal für 10 Micrsekunden senden, danach wieder ausschalten
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
delay(500);
// nur Entfernungen < 100 anzeigen
if (Entfernung < 100)
{
// Messdaten anzeigen
Serial.print("Entfernung in cm: ");
Serial.println(Entfernung);
}
}
ESP32-Wroom
// Pin für den Sender
int SENDEN = 19;
// Pin für das vom Objekt reflektierte Signal
int ECHO = 18;
// Variable fü die Speicherung der Entfernung
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
// Seriellen Monitor starten
Serial.begin(9600);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal für 10 Micrsekunden senden, danach wieder ausschalten
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
delay(500);
// nur Entfernungen < 100 anzeigen
if (Entfernung < 100)
{
// Messdaten anzeigen
Serial.print("Entfernung in cm: ");
Serial.println(Entfernung);
}
}
Rückfahrwarner
Zusätzlich wird eine LED und ein Piezzo-Lautsprecher angeschlossen. Je mehr sich das Objekt nähert, desto schneller blinkt die LED und desto kürzer ist der Abstand zwischen den Tonsignalen.
Das Programm im Film
Schaltpläne
Der Programmcode
Der Programmcode setzt statt einer if-Abfrage einen switch … case Block ein.
Dieser fragt Wertebereiche ab:
in der Klammer nach dem switch-Befehl wird die Variable gesetzt, die abgefragt werden soll.
Der case-Block legt einen Wertebereich fest:
Bei der Programmierung muss beachtet werden:
→ vor und hinter den drei Punkten muss ein Leerzeichen stehen
→ die Wertebereich dürfen sich nicht überlappen
Arduino UNO
int LED = 3;
int LAUTSPRECHER = 4;
int ECHO = 6;
int SENDEN = 7;
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LAUTSPRECHER, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal senden
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
switch (Entfernung)
{
case 13 ... 15:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(500);
break;
case 11 ... 12:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(400);
break;
case 9 ... 10:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(300);
break;
case 7 ... 8:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(200);
break;
case 5 ... 6:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(100);
break;
case 2 ... 4:
tone(LAUTSPRECHER, 1000);
digitalWrite(LED, HIGH);
break;
}
}
Wemos D1 Mini
int SENDEN = D1;
int ECHO = D2;
int LED = D3;
int LAUTSPRECHER = D4;
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LAUTSPRECHER, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal senden
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
switch (Entfernung)
{
case 13 ... 15:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(500);
break;
case 11 ... 12:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(400);
break;
case 9 ... 10:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(300);
break;
case 7 ... 8:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(200);
break;
case 5 ... 6:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(100);
break;
case 2 ... 4:
tone(LAUTSPRECHER, 1000);
digitalWrite(LED, HIGH);
break;
}
}
ESP32-Wroom
int LED = 5;
int LAUTSPRECHER = 17;
int ECHO = 18;
int SENDEN = 19;
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LAUTSPRECHER, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal senden
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
switch (Entfernung)
{
case 13 ... 15:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(500);
break;
case 11 ... 12:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(400);
break;
case 9 ... 10:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(300);
break;
case 7 ... 8:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(200);
break;
case 5 ... 6:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(100);
break;
case 2 ... 4:
tone(LAUTSPRECHER, 1000);
digitalWrite(LED, HIGH);
break;
}
}
NodeMCU
int SENDEN = D1;
int ECHO = D2;
int LED = D3;
int LAUTSPRECHER = D4;
long Entfernung = 0;
void setup()
{
pinMode(SENDEN, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LAUTSPRECHER, OUTPUT);
pinMode(LED, OUTPUT);
}
void loop()
{
// Sender kurz ausschalten um Störungen des Signal zu vermeiden
digitalWrite(SENDEN, LOW);
delay(5);
// Signal senden
digitalWrite(SENDEN, HIGH);
delayMicroseconds(10);
digitalWrite(SENDEN, LOW);
// pulseIn -> Zeit messen, bis das Signal zurückkommt
long Zeit = pulseIn(ECHO, HIGH);
// Entfernung in cm berechnen
// Zeit/2 -> nur eine Strecke
Entfernung = (Zeit / 2) * 0.03432;
switch (Entfernung)
{
case 13 ... 15:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(500);
break;
case 11 ... 12:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(400);
break;
case 9 ... 10:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(300);
break;
case 7 ... 8:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(200);
break;
case 5 ... 6:
tone(LAUTSPRECHER, 1000, 2);
digitalWrite(LED, HIGH);
delay(50);
digitalWrite(LED, LOW);
delay(100);
break;
case 2 ... 4:
tone(LAUTSPRECHER, 1000);
digitalWrite(LED, HIGH);
break;
}
}
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.