Nr.11 Entfernung messen

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

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.

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 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.
SALE