/*
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();
}