HC-SR04 dauerhaft auf 0 wenn Reichweite zu hoch

Sehr geehrte Damen und Herren,

Ich habe mir einen HC-SR04 zugelegt, an meinen Arduino UNO angeschlossen und programmiert und habe festgestellt, dass wenn ich ein Objekt weiter als 80cm vom Sensor entfernt halte, die Entfernungsangabe auf 0 springt und die Taktrate wie oft es ausgegeben wird sinkt. Damit er wieder anständig funtkioniert muss ich ihn wieder neu einstecken.
Ich habe viele Sketches aus dem Internet probiert, doch keiner scheint anständig zu funtkionieren.

Hat eventuell jemand eine Idee woran es liegen könnte? Ist der Sensor/Arduino kapput?

Vielen Dank im Vorraus
Ralf Rumbler

Sketch:

// Trigger = 7
// Echo = 8

long entf;
long entfcm;

void setup()
{
Serial.begin(9600);
}

void loop()
{
pinMode(7,OUTPUT);
pinMode(8,INPUT);

digitalWrite(7,LOW);
delayMicroseconds(2);
digitalWrite(7,HIGH);
delayMicroseconds(5);
digitalWrite(7,LOW);

entf = pulseIn(8,HIGH);
entfcm = (entf*34)/2000;

Serial.print(entfcm);
Serial.println("cm");

delay(1000);
}

guten tag Ralf, vielleicht is deinen object zu klein? vielleicht kunten sie einen grossere object probieren.
entschuldigung für meinen sehr slechte Deutsch, ich bin Niederländsich.
gruss, Merijn

Hallo,

ich befürchte, deine Formel stimmt nicht ganz.

Nimm mal diesen Sketch, den verwende ich selber und der funktioniert.
Der ist von der Seite: Funduino

Und du solltest besser deinen Sketch in Code-Tags setzen (Schaltfläche </>)

Auch setzte "Pinmode" besser in das Setup, außer du musst es in der Laufzeit ändern.

int trigger = 7;
int echo = 6;
long dauer = 0;
long entfernung = 0;

void setup() {
  Serial.begin (9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
}

void loop()
{
  digitalWrite(trigger, LOW);
  delay(5);
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) / 29.1;
  if (entfernung >= 500 || entfernung <= 0)
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  delay(1000);
}

HotSystems:
Hallo,

ich befürchte, deine Formel stimmt nicht ganz.

Nimm mal diesen Sketch, den verwende ich selber und der funktioniert.
Der ist von der Seite: Funduino

Und du solltest besser deinen Sketch in Code-Tags setzen (Schaltfläche </>)

Auch setzte "Pinmode" besser in das Setup, außer du musst es in der Laufzeit ändern.

int trigger = 7;

int echo = 6;
long dauer = 0;
long entfernung = 0;

void setup() {
 Serial.begin (9600);
 pinMode(trigger, OUTPUT);
 pinMode(echo, INPUT);
}

void loop()
{
 digitalWrite(trigger, LOW);
 delay(5);
 digitalWrite(trigger, HIGH);
 delay(10);
 digitalWrite(trigger, LOW);
 dauer = pulseIn(echo, HIGH);
 entfernung = (dauer / 2) / 29.1;
 if (entfernung >= 500 || entfernung <= 0)
 {
   Serial.println("Kein Messwert");
 }
 else
 {
   Serial.print(entfernung);
   Serial.println(" cm");
 }
 delay(1000);
}

Ups, die pinModes kommen natürlich ins Setup, leider Funktioniert es immernoch nicht... Wenn ich kein Objekt vor den Sensor halte wird in dem Fall wieder nur "Kein Messwert" dauerhaft ausgegeben :confused:... Trotzdem Danke für dein Kommentar ;)!

Wie groß ist denn dein Objekt?
Miss mal gegen eine größere Fläche.

RRumbler:
Ups, die pinModes kommen natürlich ins Setup, leider Funktioniert es immernoch nicht... Wenn ich kein Objekt vor den Sensor halte wird in dem Fall wieder nur "Kein Messwert" dauerhaft ausgegeben :confused:... Trotzdem Danke für dein Kommentar ;)!

Im übrigen ist das mit "Kein Messwert" doch korrekt, wenn du nichts davor hälst.

Hallo,
ich glaube es hängt mit der Länge des delays zusammen.
Wenn der Arduino zu kurz auf den Schall wartet kann es sein das er ab einer bestimmten Entfernung nicht mehr ankommt.
Die konkrete Stelle sehe ich allerdings nicht.

Deshalb hier ein Code der sicher funktioniert:

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  39  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     37  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
  delay(50);                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  Serial.print(uS / US_ROUNDTRIP_CM);
  Serial.println("cm");
}

MfG.
Daniel

HotSystems:
Wie groß ist denn dein Objekt?
Miss mal gegen eine größere Fläche.

Nene daran liegt es hundertprozentig nicht

RRumbler:
Nene daran liegt es hundertprozentig nicht

Dann schreib doch mal, wo gegen du misst.

Deine Angaben sind bisher leider sehr dürftig.
Wie soll man da helfen.

Und lies die Antwort in Post #5

HotSystems:
Im übrigen ist das mit "Kein Messwert" doch korrekt, wenn du nichts davor hälst.

Jaja aber das ganze gibt dann dauerhaft kein Messwert aus, egal was ich davor halte...

RRumbler:
Jaja aber das ganze gibt dann dauerhaft kein Messwert aus, egal was ich davor halte...

Und du hast den Sketch aus Post #2 genommen?

Wenn ja, dann scheint irgend etwas an der Hardware nicht zu stimmen.
Der Code läuft bei mir fehlerfrei.

Überprüfe mal deine Anschlüsse. Verwendest du ein Steckbrett? Meist sind die Kontakte schlecht.

HotSystems:
Und du hast den Sketch aus Post #2 genommen?

Wenn ja, dann scheint irgend etwas an der Hardware nicht zu stimmen.
Der Code läuft bei mir fehlerfrei.

Überprüfe mal deine Anschlüsse. Verwendest du ein Steckbrett? Meist sind die Kontakte schlecht.

Ich denke es liegt einfach an der schlechten Qualität des Sensors, der Jenige der ihn mir gegeben hat hat gesagt er ist aus China :s...

RRumbler:
Ich denke es liegt einfach an der schlechten Qualität des Sensors, der Jenige der ihn mir gegeben hat hat gesagt er ist aus China :s...

Das der aus China ist, sagt nichts über die Qualität aus.
Ich bestelle regelmäßig Teile direkt (ebay) in China und habe sehr selten Ausfälle.

Natürlich kann der defekt sein, aber der Fehler kann auch an vielen anderen Dingen liegen.

Das weiß man erst, wenn man einen direkten Vergleich hat.

Aber da du nicht bereit bist, weiteres zu prüfen bzw. Angaben darüber zu machen, bin ich hier raus.

HotSystems:
Das der aus China ist, sagt nichts über die Qualität aus.
Ich bestelle regelmäßig Teile direkt (ebay) in China und habe sehr selten Ausfälle.

Natürlich kann der defekt sein, aber der Fehler kann auch an vielen anderen Dingen liegen.

Das weiß man erst, wenn man einen direkten Vergleich hat.

Aber da du nicht bereit bist, weiteres zu prüfen bzw. Angaben darüber zu machen, bin ich hier raus.

Ich habe doch gesagt das der Sensor einfach irgendwann kein Signal mehr gibt, egal was ich davor halte...

Dann häng doch mal einen LA dran, damit du siehst was los ist

ElEspanol:
Dann häng doch mal einen LA dran, damit du siehst was los ist

Was ist denn ein LA?

LogicAnalyzer, ist ähnlich einem Oszi, stellt dedoch nur dar, ob ein Ausgang Low oder High ist. Und speichert das auch ab, so dass man es später in aller Ruhe betrachten und analysieren kann.