Ent­fer­nun­gen auf dem LCD anzeigen

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Ein Ultra­schall­sen­sor misst die Ent­fer­nung zu einem Objekt und zeigt die Ent­fer­nung auf einem LCD an.

So sieht es aus:

Schlie­ße das LCD an:

LCD

Nor­ma­ler­wei­se wäre eine kom­ple­xe Ver­ka­be­lung zum Betrieb eines LCDs nötig. Der ➨I2C-Bus regelt über einen eige­nen Mikro­pro­zes­sor die Kom­mu­ni­ka­ti­on der Daten­lei­tun­gen unter­ein­an­der. Es wer­den des­halb nur vier Anschlüs­se benötigt.

Die Hel­lig­keit kann mit einem Poten­tio­me­ter auf der Rück­sei­te des LCDs ein­ge­stellt werden.

HC-SR04

Der Ultra­schall­sen­sor arbei­tet nach einem ein­fa­chen Prinzip:

„Der Ultra­schall­sen­sor strahlt zyklisch einen kur­zen, hoch­fre­quen­ten Schall­im­puls aus. Die­ser pflanzt sich mit Schall­ge­schwin­dig­keit in der Luft fort.
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 intern die Ent­fer­nung zum Objekt.“

Quel­le: 🔗https://​www​.micro​so​nic​.de/​d​e​/​s​e​r​v​i​c​e​/​u​l​t​r​a​s​c​h​a​l​l​s​e​n​s​o​r​e​n​/​p​r​i​n​z​i​p​.​htm (exter­ner Link abge­ru­fen am 23.02.23)

Im Pro­gramm sen­det der Befehl pul­seIn() ein HIGH-Signal, star­tet einen Timer und war­tet anschlie­ßend auf das zurück­kom­men­de Signal (den Wert LOW hat). Dar­auf­hin wird der Timer gestoppt und die Zeit­span­ne zwi­schen dem Sen­den des Signal (Trig­ger) und sei­ner Rück­kehr (Echo) wird in Mikro­se­kun­den ermittelt.

Umrech­nung in cm343,2 m • 100 = 34.320 cm
Stre­cke pro ms (Mil­li­se­kun­de)34.320 : 1.000 = 34,32 cm/ms
Stre­cke pro µs (Mikro­se­kun­de)34,32 : 1.000 = 0,03432 cm/µs

Sen­der und Emp­fän­ger müs­sen nach vorn zei­gen, damit das Signal unge­hin­dert gesen­det und emp­fan­gen wer­den kann. Die Lei­tungs­dräh­te wer­den auf der Rück­sei­te eingesteckt.

Benö­tig­te Bauteile:

  • Ultra­schall­sen­sor HC-SR04
  • LCD-Dis­play I2C 1602
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Das Bei­spiel­pro­gramm zeigt die Ent­fer­nung im Seri­el­len Plot­ter an.

Den Seri­el­len Plot­ter fin­dest du unter Werk­zeu­ge → Seri­el­ler Plotter ...

... oder als Sym­bol in der Statusleiste.

// Pins für Senden/Empfangen definieren
# define SENDEN 9
# define ECHO 8

// Variable für Zeit und Entfernung initialisieren
long Zeit;
long Entfernung;

void setup() 
{
  Serial.begin(9600);
  pinMode(SENDEN, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop() 
{
  // Sender kurz ausschalten um Störungen des Signals zu vermeiden
  digitalWrite(SENDEN, LOW);
  delay(10);

  // Signal für 10 Mikrosekunden senden
  digitalWrite(SENDEN, HIGH);
  delayMicroseconds(10);

  // Sender ausschalten
  digitalWrite(SENDEN, LOW);

  // pulseIn -> Zeit messen, bis das Signal zurückkommt
  Zeit = pulseIn(ECHO, HIGH);
  /*
    Entfernung in cm berechnen
    Zeit/2 -> nur eine Strecke soll berechnet werden
    Umrechnung in cm
  */
  Entfernung = (Zeit / 2) * 0.03432;

  // 400 cm ist die maximal messbare Entfernung
  if (Entfernung < 400) 
  {
    // Titel im Plotter, darf keine Leerzeichen enthalten
    Serial.print("Entfernung:");
    Serial.print(Entfernung);
    Serial.println(",");
    delay(500);
  }
}

Benö­tig­te Bibliothek:

Für die Ver­wen­dung des LCDs benö­tigst du eine Bibliothek:

Ergän­ze das Pro­gramm für die Aus­ga­be auf dem LCD:

Im Kopf des Pro­gramms wird das LCD definiert:

#include "LCDIC2.h"

// 4-zeiliges Display
LCDIC2 lcd(0x27, 20, 4);

// 2-zeiliges Display
// LCDIC2 lcd(0x3f, 16, 2);

// Pins für Senden/Empfangen definieren
# define SENDEN 9
# define ECHO 8

// Variable für Zeit und Entfernung initialisieren 
long Zeit;
long Entfernung;

Im set­up-Teil wird das LCD gestartet ...

void setup() 
{ 
  pinMode(SENDEN, OUTPUT); 
  pinMode(ECHO, INPUT); 

  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);
}

... und der loop-Teil wird durch die Aus­ga­be auf dem LCD ergänzt.

void loop() 
{  
  // Sender kurz ausschalten um Störungen des Signals zu vermeiden   
  digitalWrite(SENDEN, LOW);
  delay(10); 

  // Signal für 10 Mikrosekunden senden 
  digitalWrite(SENDEN, HIGH); 
  delayMicroseconds(10);

  // Sender ausschalten
  digitalWrite(SENDEN, LOW); 

  // pulseIn → Zeit messen, bis das Signal zurückkommt 
  Zeit = pulseIn(ECHO, HIGH);

  /*
    Entfernung in cm berechnen   
    Zeit/2 → nur eine Strecke soll berechnet werden      
    Umrechnung in cm  
  */ 
  Entfernung = (Zeit / 2) * 0.03432;   

  // 200 cm ist die maximal messbare Entfernung 
  if (Entfernung < 200) 
  {  
    /*
      2-zeiliges LCD
      lcd.setCursor(0, 0);
      lcd.print("Entfernung: ");
      lcd.print(String(Entfernung));
      lcd.print(" cm    ");
    */

    // 4-zeiliges LCD
    lcd.setCursor(0, 0);
    lcd.print("Entfernung messen");
    lcd.setCursor(0, 1);
    lcd.print("--------------------");
    lcd.setCursor(0, 2);
    lcd.print("Entfernung: ");
    lcd.print(String(Entfernung));
    lcd.print(" cm    ");
    delay(1000);
  }
}

Für den Ent­fer­nungs­mes­ser ist auch eine Biblio­thek verfügbar:

# include "NewPing.h"
# define SENDEN 9
# define ECHO 8
# define MAX_ENTFERNUNG 200
NewPing sonar(SENDEN, ECHO, MAX_ENTFERNUNG);

void setup()
{
  Serial.begin(9600);
  // auf serielle Verbindung warten
  while (!Serial) {;}
}

void loop()
{
  delay(50);
  Serial.print("Entfernung: ");
  Serial.print(sonar.ping_cm());
  Serial.println(" cm");
  delay(1000);
}

Abge­wan­del­tes Bei­spiel aus:  🔗https://​play​ground​.ardui​no​.cc/​C​o​d​e​/​N​e​w​P​ing (exter­ner Link abge­ru­fen am 22.07.23)


Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 2. Mrz 2024 @ 9:06