Hallo liebe Community,
an meinem Pro Mini hängt ein Sensor der mir alle 20ms einen INT wert liefert.
nun möchte ich die qualität der sensordaten verbessern und immer drei dieser Werte zusammenfassen und dann mit dem Mittelwert arbeiten.
Wie gehe ich das an?
brauch ich nen FiFo Speicher?
schönen abend 
Du kannst die Werte einfach addieren und dann durch 3 teilen. Oder durch 4 oder so ...
Geht einfach per Schleife.
Gibt auch andere Verfahren, aber für den Anfang reichts vielleicht.
Was sind das für Werte, wenn die alle 20 ms kommen?
ich möchte halt immer 3 zusammenfassen
das heisst nicht immer 3 neue werte nehmen und dann teilen
sondern
ich nehme mir 3 werte, dann mittelwert ermittlung -> dann den aller erster wert weg und nen neuen holen. die zwei alten werte bleiben. dann wieder mittelwert
wie geht das?
outtacontrol:
ich möchte halt immer 3 zusammenfassen
das heisst nicht immer 3 neue werte nehmen und dann teilen
sondern
ich nehme mir 3 werte, dann mittelwert ermittlung -> dann den aller erster wert weg und nen neuen holen. die zwei alten werte bleiben. dann wieder mittelwert
wie geht das?
Dann zeig uns deinen Sketch, wie du die Werte einliest, da können wir sicher weiter helfen.
Poste bitte den kompletten Sketch hier in Code-Tags (Schaltfläche </>) dazu verwenden.
Einen neuen Wert reinstopfen, Mittelwert der letzten drei zurückbekommen (für ints)
int mittelWert(int neu) {
const byte MaxWerte = 3;
static int werte[MaxWerte];
static byte index;
werte[index] = neu;
if (++index>3) {
index = 0;
}
return (int)(0L + werte[0] + werte[1] + werte[2]) / 3;
}
Schade, dass du zwarconst byte MaxWerte = 3;
definierst, hinterher aber nicht überall verwendest.
Ist ausserdem ein kleiner fieser Fehler drin.
Gegenvorschlag:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(mittelWert(millis() & 0x7FFF));
delay(100);
}
int mittelWert(int neu) {
const byte MaxWerte = 3;
static int werte[MaxWerte];
static byte index;
static long summe;
summe += neu - werte[index];
werte[index] = neu;
if (++index >= MaxWerte ) index = 0;
return (int)(summe / MaxWerte);
}
Bei der fixen Länge von drei Werten halte ich meine korrigierte Version auch für brauchbar.
int mittelWert(int neu) {
static int werte[3];
static byte index;
werte[index] = neu;
if (++index > 2) {
index = 0;
}
return (int)(0L + werte[0] + werte[1] + werte[2]) / 3;
}
Bei der fixen Länge von drei Werten halte ich meine korrigierte Version auch für brauchbar.
Klar, da gebe ich dir Recht.
Das "schade" war wörtlich gemeint. Wäre hübscher gewesen, wennMaxWerte
auch konsequent verwendet worden wäre.
Und um 3 Werte zu addieren, braucht man keine Schleife oder Hilfsvariable, da gebe ich dir auch Recht.
Auch der Fehler ist draussen. + + + 
Die Variante mit variabler Lauflänge ist praktisch wenn man es später 'noch glatter' haben möchte.
habs mit der Lauflänge
läuft
dankesehr
In der Praxis ist der Vorschlag von Whandall nicht verkehrt. Allerdings macht man das dann eher , um Messfehler auszuschließen, das man mehrere Werte mittelt und das max und min vor dem mitteln abzieht. Oder nur Werte die nahe beianander liegen mittelt.
Stichwörter wären dann mean und median