Entfernung messen

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 (-)

Bildquelle: https://www.microsonic.de/de/service/ultraschallsensoren/prinzip.htm

Der Ultra­schall­sen­sor strahlt einen kur­zen Schall­im­puls aus. Die­ser bewegt sich mit Schall­ge­schwin­dig­keit in der Luft.
Trifft er auf ein Objekt, wird er dort reflek­tiert und gelangt als Echo zurück zum Ultra­schall­sen­sor. Aus der Zeit­span­ne zwi­schen dem Aus­sen­den des Schall­im­pul­ses und dem Emp­fang des Echo­si­gnals berech­net der Ultra­schall­sen­sor  die Ent­fer­nung 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 Geschwin­dig­keit des Schalls in der Luft beträgt 343,20 m/s. Dieser Wert muss in cm/µs (cm/Mikro­se­kun­de) umgerech­net werden.

https://www.high-endrolex.com/39

Umrechnung m in cm: 343,20 m * 100 = 34.320 cm Stre­cke in cm pro ms (Mil­li­se­kun­de): 34.320 cm : 1.000 = 34,32 cm/ms) Stre­cke 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 1315:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(500);

      break;

    case 1112:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(400);

      break;

    case 910:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(300);

      break;

    case 78:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(200);

      break;

    case 56:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(100);

      break;

    case 24:

      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 1315:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(500);

      break;

    case 1112:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(400);

      break;

    case 910:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(300);

      break;

    case 78:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(200);

      break;

    case 56:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(100);

      break;

    case 24:

      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 1315:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(500);

      break;

    case 1112:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(400);

      break;

    case 910:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(300);

      break;

    case 78:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(200);

      break;

    case 56:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(100);

      break;

    case 24:

      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 1315:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(500);

      break;

    case 1112:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(400);

      break;

    case 910:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(300);

      break;

    case 78:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(200);

      break;

    case 56:

      tone(LAUTSPRECHER, 1000, 2);

      digitalWrite(LED, HIGH);

      delay(50);

      digitalWrite(LED, LOW);

      delay(100);

      break;

    case 24:

      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 4.000 Artikel sofort verfügbar!
  • Mehr als 10 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE
Benötigst du Unterstützung bei deinem Projekt?

Alle Modelle der hier gezeigten Modelle sind hier zum Download  in einer kompakten Zip Datei verfügbar.