Inhaltsverzeichnis
Für dieses Projekt benötigst du
Wie funktioniert der Ultraschallsensor HC-SR04?
Aufgabe: Mit den Ultraschallsensor HC-SR04 und verschiedenen Mikrocontrollern soll eine Entfernung gemessen und im Seriellen Monitor angezeigt werden.
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.
https://www.high-endrolex.com/39
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 bis zu 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.