Messung erfolgt immer nach 1 sec statt vorgegeben...

Liebe Community,

ich habe an meinem Arduino einen Ultraschallsensor angeschlossen und diesen programmiert. Auf dem Serialmonitor konnte ich dann die gemessenen Abstände sehen. Diese wurden anfangs alle 100ms gemessen und auch auf dem Monitor gezeigt.

Seit gestern, egal welchen Delay-Wert ich eingebe, erfolgt die Messung immer in 1sec...

Ist mein Board kaputt oder was ist da los? Anfangs ging das ja problemlos...

Danke schonmal Grüße

Poste uns doch mal deinen Sketch, dann ist es einfacher zu helfen.

const int TRIG_PIN = 12;
const int ECHO_PIN = 13;
 
void setup() {
  // initialize serial communication:
  Serial.begin(9600);
 
  pinMode(TRIG_PIN,OUTPUT);
  pinMode(ECHO_PIN,INPUT);
}
 
void loop()
{
   long duration, distanceCm, distanceIn;
 
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  duration = pulseIn(ECHO_PIN,HIGH);
 
  // convert the time into a distance
  distanceCm = duration / 29.1 / 2 ;
  distanceIn = duration / 74 / 2;
 
  if (distanceCm <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distanceIn);
    Serial.print("in, ");
    Serial.print(distanceCm);
    Serial.print("cm");
    Serial.println();
  }
  delay(100);
}

Hiermit hat es am Anfang ganz normal funktioniert und momentan ist es so, egal was ich für einen Wert ich ins Delay schreibe, ob 10 oder 10000 der zeigt mir alles immer in 1 Sec Abstand an.

ga69jot: Ist mein Board kaputt oder was ist da los?

HellseherModus AN

Eine Sekunde ist die Standard-Timeout Zeit der pulseIn-Funktion von Arduino.

So lange dauert ein Aufruf von "pulseIn", wenn der zu messende Impuls nicht erkannt wird.

HellseherModus AUS

Ich weiß nicht woran es gelegen hat, aber momentan funktioniert es wieder problemlos...komisch aber gut, hauptsache es geht :)

Es ist auch nicht notwendig, das gleiche Thema in 2 Topics zu packen. Aber jetzt ist ja alles schick, gut so.

Ja stimmt, doppelt war unnötig.

Aber eine Frage hätte ich noch, wie kann ich den Code ändern, dass er mir die Entfernung mit einer Nachkommastelle berechnet?

Momentan zeigt er mir ja 17,18,19 cm an. Wie kann ich es machen, dass er mir 17,5, 17,6 usw. auch anzeigt?

Du mußt "distanceCm" als float deklarieren.

long kann, wie int, keine Nachkommastellen.

Da hat GuntherB natürlich Recht, aber warum rechnest du nicht in mm ? Statt distanceCm = duration / 29.1 / 2 ;

unsigned long distance = duration / 6;  // Distanz in mm ( Auflösung größer als Genauigkeit ! )

Es wird hier wohl nicht drauf ankommen, und wenn dann mal eine Regelung draus wird, brauchst du sowieso float, aber generell tun sich µController schwer mit float.

michael_x: unsigned long distance = duration / 6;  // Distanz in mm ( Auflösung größer als Genauigkeit ! )

Es wird hier wohl nicht drauf ankommen

Er könnte aber trotzdem mit einer genaueren Schallgeschwindigkeit rechnen, wie beim Wert in Zentimetern:

unsigned long distance = duration *100L/ 582;  // Distanz in mm ( Auflösung größer als Genauigkeit ! )

Dafür müsste er aber noch die Temperatur messen, a=sqrt(gamma*R*T) .. usw. genauer gehts ja immer ;) Wie genau ist eigentlich der Sensor bzg. zeitlicher Auflösung?

Wie genau ist eigentlich der Sensor bzg. zeitlicher Auflösung?

Keine Ahnung, vermutlich besser als Arduino.
Der liefert Microsekunden in 4er Schritten. Das gilt auch für pulseIn().

4 * 100UL / 582 oder 4 / 6 ist in beiden Fällen eine Auflösung < 1mm

Also kann ga69jot bei der Entfernungsmessung jeden mm Unterschied sehen,
was die eigentlliche Frage ( cm mit einer Nachkommastelle ) war.

Ob man mit 100/581 statt mit 1/6 rechnend, eine größere Chance hat, einen Eichstempel vom TÜV zu bekommen,
ist natürlich für uns viel interessanter :wink:

Selbstverständlich hat jurs Recht: *100/581 bringt vermutlich ein genaueres Ergebnis und braucht deutlich weniger Resourcen als float- Arithmetik.