Genauigkeit des HC-SR04 Sensors

Hallo,

ich nutze einen HC-SR04 Sensor zur Bestimmung der Entfernung eines Objekts. Auf dem Display (HD44780) wird mir der Messwert in cm ausgegeben. Ich habe den Code unten soweit geändert das mir die Messwerte in cm ausgegeben werden mit zwei Stellen nach dem Komma (mm). Leider springen die mm Messergebnisse sehr. Daher meine Fragen:

Wie kann ich nur cm anzeigen lassen ohne die zwei Nachkommastellen?
Wie ändere ich die Messrate?

Ich nutze folgenden Code:

#include <LiquidCrystal.h> //Load Liquid Crystal Library
LiquidCrystal LCD(10, 9, 5, 4, 3, 2);  //Create Liquid Crystal Object called LCD

int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=11;  //Sensor Echo pin connected to Arduino pin 11
int myCounter=0;  //declare your variable myCounter and set to 0
int servoControlPin=6; //Servo control line is connected to pin 6
float pingTime;  //time for ping to travel from sensor to target and return
float targetDistance; //Distance to Target in inches
float speedOfSound=776.5; //Speed of sound in miles per hour when temp is 77 degrees.

void setup() {
 
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

LCD.begin(16,2); //Tell Arduino to start your 16 column 2 row LCD
LCD.setCursor(0,0);  //Set LCD cursor to upper left corner, column 0, row 0
LCD.print("Abstand Objekt:");  //Print Message on First Row
}

void loop() {
 
 digitalWrite(trigPin, LOW); //Set trigger pin low
 delayMicroseconds(2000); //Let signal settle
 digitalWrite(trigPin, HIGH); //Set trigPin high
 delayMicroseconds(15); //Delay in high state
 digitalWrite(trigPin, LOW); //ping has now been sent
 delayMicroseconds(10); //Delay in high state
 
 pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds
 pingTime=pingTime/1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
 pingTime=pingTime/3600; //convert pingtime to hourse by dividing by 3600 (seconds in an hour)
 targetDistance= speedOfSound * pingTime;  //This will be in miles, since speed of sound was miles per hour
 targetDistance=targetDistance/2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance.
 targetDistance= targetDistance*160934;    //Convert miles to cm by multipling by 63360 (inches per mile)
 
 LCD.setCursor(0,1);  //Set cursor to first column of second row
 LCD.print("                "); //Print blanks to clear the row
 LCD.setCursor(0,1);   //Set Cursor again to first column of second row
 LCD.print(targetDistance); //Print measured distance
 LCD.print(" cm");  //Print your units.
 delay(1000); //pause to let things settle 
 }

Messwert über mehrere Messungen mittel, Oder Median verwenden,

Wie kann ich nur cm anzeigen lassen ohne die zwei Nachkommastellen?

indem du statt

 LCD.print(targetDistance); //Print measured distance
 LCD.print(targetDistance,0); //Print measured distance

verwendest.

Vielen Dank für eure Antwort.

Habe es hinbekommen nur die cm anzuzeigen! Wie kann ich Mitteln oder den Median berrechnen und anzeigen lassen? Danke

ArneDunio:
Habe es hinbekommen nur die cm anzuzeigen! Wie kann ich Mitteln oder den Median berrechnen und anzeigen lassen? Danke

Einfach mal Google fragen: "arduino messwerte mitteln"

versuch es mal so:

#include <LiquidCrystal.h> //Load Liquid Crystal Library
LiquidCrystal LCD(10, 9, 5, 4, 3, 2);  //Create Liquid Crystal Object called LCD

int trigPin=13; //Sensor Trip pin connected to Arduino pin 13
int echoPin=11;  //Sensor Echo pin connected to Arduino pin 11
int myCounter=0;  //declare your variable myCounter and set to 0
int servoControlPin=6; //Servo control line is connected to pin 6
float pingTime;  //time for ping to travel from sensor to target and return
float targetDistance; //Distance to Target in inches
float speedOfSound=776.5; //Speed of sound in miles per hour when temp is 77 degrees.

void setup() {
 
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

LCD.begin(16,2); //Tell Arduino to start your 16 column 2 row LCD
LCD.setCursor(0,0);  //Set LCD cursor to upper left corner, column 0, row 0
LCD.print("Abstand Objekt:");  //Print Message on First Row
}

void loop() {
 
 digitalWrite(trigPin, LOW); //Set trigger pin low
 delayMicroseconds(2000); //Let signal settle
 digitalWrite(trigPin, HIGH); //Set trigPin high
 delayMicroseconds(15); //Delay in high state
 digitalWrite(trigPin, LOW); //ping has now been sent
 delayMicroseconds(10); //Delay in high state
 
 pingTime = pulseIn(echoPin, HIGH);  //pingTime is presented in microceconds
 pingTime=pingTime/1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
 pingTime=pingTime/3600; //convert pingtime to hourse by dividing by 3600 (seconds in an hour)
 targetDistance= speedOfSound * pingTime;  //This will be in miles, since speed of sound was miles per hour
 targetDistance=targetDistance/2; //Remember ping travels to target and back from target, so you must divide by 2 for actual target distance.
 targetDistance= targetDistance*160934;    //Convert miles to cm by multipling by 63360 (inches per mile)

  static uint16_t mess[10];
  static uint16_t mess_ges;
  static uint16_t ausgabe;
  static uint8_t index;
 mess[index] = targetDistance;
 mess_ges += mess[index];
 index ++;
 if(index>9) index=0;
 ausgabe = mess_ges / 10);
 mess_ges -= mess[index];
 
 LCD.setCursor(0,1);  //Set cursor to first column of second row
 LCD.print("                "); //Print blanks to clear the row
 LCD.setCursor(0,1);   //Set Cursor again to first column of second row
 LCD.print(ausgabe); //Print measured distance
 LCD.print(" cm");  //Print your units.
 delay(1000); //pause to let things settle 
 }

Sollte man nicht den index mit 0 initialisieren?

Und mir schwant bei deiner Durchschnittsberechnung beim Überfliegen, dass irgendwas nicht passt.

Und das delay hättest du auch noch eliminieren können, wenn du schon mal dran bist.

Ich nehm bei sowas lieber die Lib RunningMedian

Und mir schwant bei deiner Durchschnittsberechnung beim Überfliegen, dass irgendwas nicht passt.

stimmt. Habe ich berichtigt.

Danke euch . Ihr seit echt Klasse! Ich werde mich heute abend mal dran setzen.

Der zusätzliche Code:

static uint16_t mess[10];
static uint16_t mess_ges;
static uint16_t ausgabe;
static uint8_t index;
mess[index] = targetDistance;
mess_ges += mess[index];
index ++;
if(index>9) index=0;
ausgabe = mess_ges / 10);
mess_ges -= mess[index];

Funktioniert nich zu Überprüfen. Fehler: expected';' before ')' token in Zeile 9

was soll ich tuene?

Deinen Code in Codetags setzen (</> Button oben links im Forumseditor) und Dir dann die Zeile 9 mal ganz genau anschauen. Das sollte selbst jemanden ohne jegliche Programmierkenntnisse auffallen.

Gruß Tommy

Ich finde es nicht, sorry!

Wenn Du auf Reply klickst, kommst Du in den Editor des Forums.
Dort ist oben links der Button </>.

Gruß Tommy

Den Fehler finde ich nicht;)

Hi

Eigentlich genau, was der Compiler anmeckert:

ausgabe = mess_ges / 10);

Da fehlt dem Compiler eigentlich nur eine Klammer ... oder es ist Eine zu viel.

MfG

Merkwürdig hatte wohl zwei Fehler drin. Als ich als erstes die Klammer gelöscht habe und überprufen wollte hat es nicht geklappt. Hab es nochmal neu aufgesetzt jetzt klappt es. Wo kann ich was über die:

static uint16_t mess[10];
static uint16_t mess_ges;
static uint16_t ausgabe;
static uint8_t index;
mess[index] = targetDistance;
mess_ges += mess[index];
index ++;
if(index>9) index=0;
ausgabe = mess_ges / 10;
mess_ges -= mess[index];

Nachlesen? Ist mir sehr kryptisch alles.

Mit solchen Fragmenten und wieder ohne Codetags gewinnst Du keinen Blumentopf.
Zum Nachlesen: Die Arduino-Referenz, ein C/C++-Buch, ...

Gruß Tommy

u unsigned (vorzeichenlos, keine Minus-Zahlen)
int ohne Kommastellen, also Ganzzahlen
16 Bit breit
_t Überbleibsel aus der Urzeit

static uint16_t mess[10]; erzeuge ein Array mit dem Namen mess und 10 Elementen (0...9), Dessen Inhalt eine Breite von 16 Bit hat, vorzeichenlos (0...65535). Die Werte bleiben nach Funktionsende erhalten.

static Die Variable wird 1x initialisiert, ist nur in dieser Funktion gültig, wird aber nicht bei Funktionsende zerstört - der Wert bleibt erhalten und steht beim nächsten Aufruf zur Verfügung
a[y] Array 'a' mit Index 'y'
+= Addiere Wert zur eigenen Variable
++ erhöhe Variable um 1
if (index>9) index=0; wenn index>9 ist, wird index auf Null gesetzt - ohne Block {} gilt nur die nächste Anweisung für diese IF

MfG

was genau ist dir kryptisch?
zu spät.

Was genau der Code macht ist mir nicht ganz klar?