Go Down

Topic: Median of Ultra Soniv values without delay (Read 688 times) previous topic - next topic

Gigantkiller

Jan 18, 2014, 02:59 pm Last Edit: Jan 18, 2014, 03:03 pm by uwefed Reason: 1
Hallo,ich bin am verzweifeln.
Ich möchte aus den werten meines US-sensors die Medianwerte haben. Sensor auslesen ist kein Problem,die Median Werte mit delay auszurechnen auch nicht,allerdings habe ich noch andere Sensoren, daher muss ich einen Delay vermeiden.


folgender code steht in der loop:

Code: [Select]

 if((du < arraysizeu)&&(millis() - timeStampu > ledDelayu))
        {  
     du= du +1;
  unsigned int uS = sonar.ping();
  timeStampu = millis();
 bu =  uS / US_ROUNDTRIP_CM;  
  rangevalueu = bu;
  eu= eu +1;  
  if(eu=25)
 {
  isortu(rangevalueu, arraysizeu);
    int midpoint = arraysizeu/2;  
    cu =rangevalueu[midpoint];
    USD=cu;
    eu=0;
    du=0;
    }
}


wobei USD das Ergebnis sein soll.
die Funktion isortu:

Code: [Select]
void isortu(int *a, int n)            
{
 for (int i = 1; i < n; ++i)
 {
   int j = a;
   int k;
   for (k = i - 1; (k >= 0) && (j < a[k]); k--)
   {
     a[k + 1] = a[k];
   }
   a[k + 1] = j;
 }
}


wenn ich eine gleichung wie eu=100; in die erste if schleife einfüge, und dann später per serial ausgebe,ist eu weiterhin 0(der Startweert).
Wenn ich allerdings in der ersten if schleife USD=bu schreibe gibt es den unbearbeiteten wert aus.

mfg

pylon

1. Post den vollständigen Code
2. Formatiere in anständig (in der IDE gibt's dafür eine Automatik-Funktion)
3. Füge Kommentare ein, damit wir einfacher Deine Gedankengänge nachvollziehen können

Zusätzlich wäre es hilfreich, wenn die Variablen vernünftige Namen kriegen würden, wobei das mit genügend Kommentaren teilweise kompensiert werden kann.

Hilfreich wäre es auch, wenn Du Links auf die verwendete Hardware posten würdest, dann können wir uns ein Bild machen, was genau als Input dient.
Dann solltest Du uns auch mitteilen, wieso Du einen delay() verwenden willst, um den Median zu berechnen, meiner Meinung nach ist das eine statistische Funktion, die einfach ein Array mit mehreren (vorangegangenen) Daten braucht. Hast Du eine andere Definition von Median?

jurs

#2
Jan 18, 2014, 05:55 pm Last Edit: Jan 18, 2014, 06:54 pm by jurs Reason: 1

Hallo,ich bin am verzweifeln.


Au weia, das hört sich ja extrem schlimm an.
Nicht verzweifeln!
Hast Du es schon mal bei der Telefonseelsorge probiert? Der Anruf ist kostenfrei!


Ich möchte aus den werten meines US-sensors die Medianwerte haben. Sensor auslesen ist kein Problem,die Median Werte mit delay auszurechnen auch nicht,allerdings habe ich noch andere Sensoren, daher muss ich einen Delay vermeiden.


Aufrufe von "delay" beim Programmieren sollte man fast immer vermeiden.
Ist das ein Problem?
Und warum brauchst Du den Median?
Reicht für Deinen Anwendungsfall nicht eine "exponentielle Glättung" der Messwerte?


folgender code steht in der loop:


Wenn der Code zum Sortieren des Integer-Arrays nicht funktioniert, wird er wohl falsch sein.
Und wo liegt nun das konkrete Problem?
Einen funktionierenden Code für das Sortieren eines Integer-Arrays im WWW zu finden?
Ist das WWW nicht voll mit Seiten, auf denen Sortiercode für alle möglichen Programmiersprachen vorgestellt wird, einschließlich C++?

BTW: Die AVR-libc Library hat schon eine Quicksort-Funktion fix und fertig (und funktionierend!) dabei, die kann man direkt benutzen. Man braucht dafür nur eine eigene Vergleichsfunktion schreiben und die Funktion passend aufrufen:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#gafd4bf2faec43342e7ad3d2ab37bac1fe
Erfordert ein bisschen Einarbeitung, aber wobei ist das nicht der Fall?

Edit: Möchtest Du in Deinem Code mit "if(eu=25)" wirklich eine Zuweisung machen? Oder vielleicht einen Vergleich mit "if(eu==25)"?

Go Up