Moin @thomas1189 ,
und hier noch eine Lösung mit einer Klasse ...
/*
Forum: https://forum.arduino.cc/t/mittelwert-mit-float/1387560
Wokwi: https://wokwi.com/projects/433205260614079489
Berechnung gleitender und gewichteter Mittelwert im Vergleich
ec2021
2025/06/08
*/
constexpr float messwertZuSpannung {(5.0 / 1023.0) * 6.0};
constexpr int fenster {10};
class AnalogClass {
private:
float gewichtet = 0;
float mittelwert = 0;
unsigned long buff;
uint16_t buffer[fenster];
byte pin;
int index = 0;
void berechneGewichtetenMittelWert() {
buff = buff - buff / fenster + buffer[index];
gewichtet = buff / fenster * messwertZuSpannung;
}
void berechneGleitendenMittelWert() {
unsigned long summe = 0;
for (int i = 0; i < fenster; i++) {
summe += buffer[i];
}
summe = summe / fenster;
mittelwert = summe * messwertZuSpannung;
};
public:
void init(byte aPin) {
pin = aPin;
};
void messen() {
buffer[index] = analogRead(pin);
berechneGleitendenMittelWert();
berechneGewichtetenMittelWert();
index++;
if (index >= fenster) {
index = 0;
}
};
float getGleitend() {
return mittelwert;
}
float getGewichtet() {
return gewichtet;
}
};
byte analogPins[] = {A0, A1, A2};
constexpr int pinZahl = sizeof(analogPins) / sizeof(analogPins[0]);
AnalogClass wert[pinZahl];
void setup()
{
Serial.begin(115200);
for (int i = 0; i < pinZahl; i++) {
wert[i].init(analogPins[i]);
}
}
void loop() {
for (int i = 0; i < pinZahl; i++) {
wert[i].messen();
Serial.print(wert[i].getGleitend());
Serial.print("\t");
}
Serial.println();
for (int i = 0; i < pinZahl; i++) {
Serial.print(wert[i].getGewichtet());
Serial.print("\t");
}
Serial.println();
trennZeile();
delay(100);
}
void trennZeile() {
for (int i = 0; i < pinZahl; i++) {
Serial.print("-------");
}
Serial.println();
}
Zum Ausprobieren und Erweitern auf Wokwi:
https://wokwi.com/projects/433205260614079489
Weitere Analog-Pins müssen nur in dieser Zeile ergänzt werden:
byte analogPins[] = {A0, A1, A2};
z.B.:
byte analogPins[] = {A0, A1, A2, A3, A4};
@my_xy_projekt hat in seinem Sketch einen gleitenden Mittelwert mit einem Fenster von miNums Breite umgesetzt. Du hast im Gegensatz dazu einen gewichteten Mittelwert programmiert. Die Klasse setzt beides parallel um.
Zu Deinem Algorithmus:
// Berechnung gleitender Mttelwert--------------
float mittelwert( float Rohwert, float &buff, float faktor)
{
float mi ;
buff = buff - buff / faktor;
buff = buff + Rohwert;
mi = buff / faktor;
return mi;
}
Das lässt sich auch so schreiben:
buff = buff -buff/faktor+Rohwert
Mit faktor = 10 dann auch so:
buff = 0.9 * buff +Rohwert
Der Wert im Puffer buff ist stabil, wenn 0.9*buff == Rohwert 0.1*buff == Rohwert erreicht ist.
[Edit: Korrigiert, siehe Post 8]
Auf Wokwi lässt sich das zeitliche Verhalten bei einem Fenster von 10 Messwerten und dem Faktor 10 bei der Gewichtung vergleichen.
Gruß
ec2021