ultaschallsensor hc sr04 "feintuning"

hallo,

ich experementiere momentan mit dem hc sr04.
ich kann mit dem sketch (unten) die entfernung zwar messen, aber leider springt sie immer zwischen 2-4werten hin und her(um ein paar mm, vielleicht ein cm), obwohl sich die entfernung nicht ändert:

// HC-SR04

float echo = 0;
int ultraSoundSignal = 2; // Ultrasound signal pin
float ultrasoundValue = 0;
float x_old = 0;

void setup()
{
Serial.begin(9600);
pinMode(ultraSoundSignal,OUTPUT);
}

float ping(){
pinMode(ultraSoundSignal, OUTPUT); // Switch signalpin to output
digitalWrite(ultraSoundSignal, LOW); // Send low pulse
delayMicroseconds(2); // Wait for 2 microseconds
digitalWrite(ultraSoundSignal, HIGH); // Send high pulse
delayMicroseconds(5); // Wait for 5 microseconds
digitalWrite(ultraSoundSignal, LOW); // Holdoff
pinMode(ultraSoundSignal, INPUT); // Switch signalpin to input
digitalWrite(ultraSoundSignal, HIGH); // Turn on pullup resistor
// please note that pulseIn has a 1sec timeout, which may
// not be desirable. Depending on your sensor specs, you
// can likely bound the time like this -- marcmerlin
// echo = pulseIn(ultraSoundSignal, HIGH, 38000)
echo = pulseIn(ultraSoundSignal, HIGH); //Listen for echo
ultrasoundValue = (echo / 58.138); //convert to cm
return ultrasoundValue;

}

void loop()
{
float x = ping();

// Anzeige nur ändern wenn neue Entfernung
if(x!=x_old)
{
Serial.print(x);
Serial.println("cm");
delay(1000); //delay
x_old = x; // letze Entfernung speichern
}
}

bilde einen Mittelwert über mehrere Messungen, oder den Median. Running median lib wäre auch ein Versuch Wert.

Hat der hc sr04 nicht separate Pins für Echo und Trigger?

hallo,

vielen dank für die antwort !

ja, der hat seperate anschlüsse.
ich habe allerdings ein sketch gefunden, wo man mit einem pin echo und trigger ansteuern kann.

ich habs jetzt über drei werte und den mittelwert versucht und über ein array
http://macherzin.net/article72-Smooth-Eingehende-Sensorwerte-glatten

beim arry ist der wert "stabil", iegt aber um 1-2cm daneben und ich hab keine kommastelle

ist das array float?

also ich muss gestehen, mit arrys kenn ich mich (noch) nicht aus.......

die variablen sind als int angegeben.

ich hab das int durch ein float ersetzt und es lief nicht mehr...

der code war folgender, nur halt mit dem sketch für mein sensor:

/* Glaettung, einfaches Beispiel

Liest Werte eines analogen Eingangs und bildet einen Mittelwert

Inspiriert durch: http://arduino.cc/en/Tutorial/Smoothing
von David A. Mellis dam@mellis.org
modifiziert 2012-09-04 durch Tom Igoe
modifiziert 2013-02-07 durch fribbe http://macherzin.net

Code ist in der Public Domain
*/

const int anzahlMessungen = 10; // Mittelwert wird aus 10 Werten gebildet
const int intervall = 10; // Messungen alle 10 mS, ggf. anpassen
int messungen[anzahlMessungen]; // Array fuer Messwerte
int zeiger = 0; // Zeiger des aktuellen Messwerts
int gesamtSumme = 0; // aktueller Gesamtwert
int durchschnitt = 0; // Mittelwert
int dieseMessung = 0; // aktueller Messwert
boolean status = 0; // Flag fuer ersten Durchlauf
const int sensorPin = A0; // Sensor an Pin 0 analog

void setup()
{
Serial.begin(9600); // starte serielle Kommunikation
while (!Serial) // warte auf Verbindung serieller Port, nur für Leonardo usw.
{
;
}
}

void loop()
{
gesamtSumme = gesamtSumme - messungen[zeiger]; // substrahiere letzte Messung
messungen[zeiger] = analogRead(sensorPin); // lese Sensor
gesamtSumme = gesamtSumme + messungen[zeiger]; // addiere Wert zur Summe
zeiger = zeiger + 1; // zur naechsten Position im Array
if (zeiger >= anzahlMessungen) // wenn Ende des Arrays erreicht ... zurueck zum Anfang
{
if (status == 1) // wenn Array erstmalig aufgefuellt ...
{
Serial.println(durchschnitt); // geglaettete Ausgabe auf serieller Konsole
}
status = 1; // erste 10 Werte eingelesen, Array ist gefüllt, Status geaendert
zeiger = 0; // und wieder von vorn
}
durchschnitt = gesamtSumme / anzahlMessungen; // berechne Mittelwert
delay(intervall); // zur Stabilisierung
}

// haben fertig und HaLoF

Meines wissens hat der hc sr04 getrennte Anschlüsse für Trigger und Signal. hc sr05 hat eine Anschluß für beides.
Nicht alles was Du im Internet findest ist auch richtig und eien 4 statt eine 5 Schreiben geht schnell.

Bitte benutze die CODE Tags.
Grüße Uwe

wenn das alles int sind, dann speichere da die Rohdaten, die du vom Sensor bekommst und mach nur die durchschnitt float und teile die dann so dass du cm oder mm bekommst.

Ich weiss jetzt nicht, in welcher Grössenordnung die Rohwerte sind, aber Vorsicht, dass dir int nicht überläuft, da es ja nicht mal unsigned int ist

also die anleitung bezog sich schon auf den hc sr04....
hat ja auch funktioniert, nur nicht genau bzw mit abweichung.
habe jetzt noch mal den sketch mit 2pins ausprobiert, aber selbes problem.....

allerdings lies sich das problem inzwischen lösen.......

alle werte ausser zeiger auf float gesetzt und nur iene nachkommastelle

vielen dank !