HC-SR04 unterschiedliche Anzeige LCD / Monitor

Hallo Forengemeinde,
ich habe aus einigen Beiträgen diesen Code erstellt.
Bin ganz froh das es geht und wollte dann die Anzeige nur noch bei einer Änderung aktualisieren.Wenn ich die Zeilen die auskommentiert sind aktiviere stimmen die Werte der Lcd anzeige nicht mehr.
Die Variablen Entfernung und AltEntfernung werden im Monitor richtig angezeigt.

//Bibliotheken um mit dem LCD-Display zu
//kommunizieren
#include <LiquidCrystal_I2C.h>

// Initialisieren des LCD Displays mit der I2C Adresse 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

// Variable für Zeit und Entfernung initialisieren
int Zeit;
int Entfernung;
int AltEntfernung = 200;


/*
void ausgabe() {
  lcd.setCursor(2, 0);
  lcd.print("Entfernung:     ");
  lcd.setCursor(3, 1);
  lcd.print(Entfernung);
  lcd.print(" cm    ");
  // Titel im Plotter, darf keine Leerzeichen enthalten
  Serial.print("Entfernung:");
  Serial.println(Entfernung);
  Serial.print("Laufzeit,");
  Serial.println(Zeit);
//#########
//delay(1000);
}
*/

void setup() {
  Serial.begin(115200);
  pinMode(SENDEN, OUTPUT);
  pinMode(ECHO, INPUT);
  // LCD starten
  lcd.init();
  lcd.backlight();
}


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

  // 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;

  lcd.setCursor(2, 0);
  lcd.print("Entfernung:     ");
  lcd.setCursor(3, 1);
  lcd.print(Entfernung);
  lcd.print(" cm    ");

  //if (AltEntfernung - Entfernung > 10) ausgabe();


  //AltEntfernung = Entfernung;

  //Serial.println(AltEntfernung);
  //Serial.println(Entfernung);
}

Gruß Walter

Das sind nicht 10 Mikrosekunden sondern Milisekunden.

Die Entfernung kann größer oder kleiner werden. Du berücksichtigst nur eine Richtung.
Richtig ist daß Du den Absolutwert bildest.
if (abs(AltEntfernung - Entfernung) > 10) ausgabe();

Grüße Uwe

Die 10 Microsekunden gehören zum Senden zwei Zeilen später.
Dort stehen "5" drin das ist richtig . Zu Beginn schalte ich 10 millisec das Senden aus.

Der Einwand den Absolutwert zu benutzen verändert nichts.
Im Serialmonitor lasse ich jetzt die "Zeit" und "Entfernung" ausgeben
diese ändern sich tatsächlich???? warum

Das ist überflüssig. Senden ist bereits LOW.

Dann passe bitte auch den Kommentar an.

https://reference.arduino.cc/reference/de/language/functions/advanced-io/pulsein/

Rückgabewert

Die Länge des Impulses (in Mikrosekunden) oder 0, wenn kein Impuls vor dem Timeout gemessen wird. Datentyp: unsigned long

Das passt nicht zu

Bitte die richtigen Datentypen verwenden.

Habe die Anpassungen Kommentar und Datentyp geändert jetzt gibt es Anzeigen auf dem Display " 0 " oder " 166 " der Sensor liegt auf dem Tisch und misst zur Zimmerdecke.

Die Anzeige "166" kann ich mit dem Zollstock nachmessen .

ändere Deine 5µSek in 15µsek.

Ich habe die Sendezeit in 5er Schritten bis 25 erhöht leider erfolglos.

Gruß Walter

Zeige mal bitte den Code, mit dem du die Ausgabe oben erzeugt hast.

@wwerner Dies ist der aktuelle Code
ausgegeben in der "ausgabe" Entfernung und Laufzeit
dann im "Loop" AltEntfernung und Entfernung
Dort sehe ich auch das Entfernung und Laufzeit mit "0" ausgegeben werden.

//Bibliotheken um mit dem LCD-Display zu
//kommunizieren
#include <LiquidCrystal_I2C.h>

// Initialisieren des LCD Displays mit der I2C Adresse 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

// Variable für Zeit und Entfernung initialisieren
unsigned long Zeit;
int Entfernung;
int AltEntfernung = 200;



void ausgabe() {
  lcd.setCursor(2, 0);
  lcd.print("Entfernung:     ");
  lcd.setCursor(3, 1);
  lcd.print(Entfernung);
  lcd.print(" cm    ");
  // Titel im Plotter, darf keine Leerzeichen enthalten
  Serial.print("Entfernung:");
  Serial.println(Entfernung);
  Serial.print("Laufzeit,");
  Serial.println(Zeit);
  //#########
  delay(500);
}


void setup() {
  Serial.begin(115200);
  pinMode(SENDEN, OUTPUT);
  pinMode(ECHO, INPUT);
  // LCD starten
  lcd.init();
  lcd.backlight();
}


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

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

  // 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;
  /*
  lcd.setCursor(2, 0);
  lcd.print("Entfernung:     ");
  lcd.setCursor(3, 1);
  lcd.print(Entfernung);
  lcd.print(" cm    ");
*/
  if (abs(AltEntfernung - Entfernung) > 10) ausgabe();


  AltEntfernung = Entfernung;

  Serial.println(AltEntfernung);
  Serial.println(Entfernung);
}

Versuche es bitte mal so:

//Bibliotheken um mit dem LCD-Display zu kommunizieren
#include <LiquidCrystal_I2C.h>

// Initialisieren des LCD Displays mit der I2C Adresse 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

// Variable für Zeit und Entfernung initialisieren
unsigned long Zeit;
int Entfernung;
int AltEntfernung = 200;

void ausgabe() {
  lcd.setCursor(2, 0);
  lcd.print("Entfernung:     ");
  lcd.setCursor(3, 1);
  lcd.print(Entfernung);
  lcd.print(" cm    ");
}

void setup() {
  Serial.begin(115200);
  pinMode(SENDEN, OUTPUT);
  pinMode(ECHO, INPUT);
  // LCD starten
  lcd.init();
  lcd.backlight();
}

void loop() {
  delay(100);  
  digitalWrite(SENDEN, HIGH);
  delayMicroseconds(10); // Signal für x Mikrosekunden senden
  digitalWrite(SENDEN, LOW);// Sender ausschalten
  
  Zeit = pulseIn(ECHO, HIGH); // pulseIn -> Zeit messen, bis das Signal zurückkommt
  if (Zeit>0){
    /*
    Entfernung in cm berechnen
    Zeit/2 -> nur eine Strecke soll berechnet werden
    Umrechnung in cm
    */
    Entfernung = (Zeit / 2) * 0.03432;
    if (abs(AltEntfernung - Entfernung) > 10) {
      ausgabe();
	}  
  
    Serial.print("Entfernung:");
    Serial.println(Entfernung);
	Serial.print("AltEntfernung:");
	Serial.println(AltEntfernung);
    Serial.print("Laufzeit:");
    Serial.println(Zeit);
	
	AltEntfernung = Entfernung;
  } else {
    Serial.println("Keine Zeit erkannt");
  }  
}

@wwerner
Dies scheint besser zu sein,jetzt gibt es nicht mehr die Anzeige "166" / "0" .
Im Serialmonitor gibt es keine Ausgabe "Keine Zeit erkannt" .
Wenn ich jetzt die Distanz vor dem Sensor verkleinere wird das korrekt angezeigt.
Wenn ich dann die Distanz wieder vergrößere wird das auch korrekt angezeigt.

Was mich als Anfänger verwirrt

  1. warum die geschweifte Klammer um Ausgabe
  2. dann die Ausgabe
  3. den else Zweig

gehört zu einer if abfrage zwingend ein else Zweig

Kann ich die Ausgabe des Serialmonitors auch umleiten in eine Datei.

Die ist tatsächlich überflüssig. Ich wollte es erst anders strukturieren.

Nein, aber hier macht er Sinn, um zu erkennen wann pulseIn keinen Wert liefert.

In der IDE bin ich überfragt. Mit einem externen Terminal Programm geht es auf jeden Fall.

Vielen Dank an alle die mir wiedermal geholfen haben die Arduino Welt ein bisschen
näherzukommen.Ich hab noch so viele Fragen!
Setze das Thema mal auf gelöst im Post 10 ist das korrekt so?

Gruß Walter

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.