Hallo,
ich will in der Hauptschleife den Mittelwert aus den drei oder x letzten Werten berechnen,
wie kann ich das lösen?
Muss ich händisch alle Werte immer in einer Variablen speichern und umschichten oder gibt es eine einfache Möglichkeit?
Gruß
Hallo,
ich will in der Hauptschleife den Mittelwert aus den drei oder x letzten Werten berechnen,
wie kann ich das lösen?
Muss ich händisch alle Werte immer in einer Variablen speichern und umschichten oder gibt es eine einfache Möglichkeit?
Gruß
Nein.
Einfach den Wert der Messungen zusammenzählen und dann durch die Anzahl der Messungen Teilen.
Was lernt man heutzutage in der Schule ??
Gruß
Pucki
... und wo bekommt er die letzten Messungen her?
Das ist doch der Kern der Frage...
[pucki katapultiert sich wieder in die Liga der Nichtleser / Versteher]
nimm ein Array mit 3 Felder.
dazu einen Schreibe-Index.
du befüllst einen Wert in den Schreibe-Index.
du erhöhst den Schreibe Index um eins (wrap arround auf 0 beachten) fürs nächste mal.
wenn du den Durchschnitt haben willst ... zähl deine 3 Variablen zusammen und dividiere durch 3.
wichtig KEIN "umschichten". Es gibt einfach eine Schreibposition an die du den neuen Wert schreibst.
Andere Variante: Addiere die Werte auf eine Variable Summe auf, zähle die Messungen mit. Wenn Anzahl erreicht Summe / Anzahl und Summe auf 0.
Gruß Tommy
Hallo,
wenn es immer von unbekannter Anzahl Messungen ist, würde ja ein Ringbuffer benötigt wovon immer die letzten x Werte weiterverarbeitet werden.
Oder es reicht eine gleitende Mittelwertbildung bzw. Tiefpass. Dann könnte man sich mehrere Instanzen anlegen mit unterschiedlicher Anzahl Messwerte die gefiltert werden. Wird zugegeben umfangreicher.
@ TO (einen sinnvollen Namen hast dir nicht suchen können oder?)
/*
Durchschnittsberechnung mit einem Ringbuffer
https://forum.arduino.cc/t/mittelwert-der-letzten-x-werte/1237432
2024-04-19 by noiasca
*/
template <typename T, size_t size>
class Avg {
T store[size] {0};
size_t index = 0;
bool wraparound = false;
public:
void add(T in) {
store[index] = in;
index++;
if (index >= size) {
index = 0;
wraparound = true;
}
}
T getAvg() {
T result = 0;
if (wraparound) {
for (auto &i : store) result += i; // Normalbetrieb
return result / size;
}
if (index == 0) return 0; // Anfangsproblem
for (size_t i = 0; i < index; i++) result += store[i]; // bis zum einmalig durchlauf aller Werte
return result / index;
}
};
Avg <int, 3>average; // integer speicher für 3 Variablen
void setup() {
Serial.begin(115200);
Serial.println("Average");
Serial.println(average.getAvg());
average.add(100);
Serial.println(average.getAvg());
average.add(200);
Serial.println(average.getAvg());
average.add(300);
Serial.println(average.getAvg());
average.add(400);
Serial.println(average.getAvg());
average.add(400);
Serial.println(average.getAvg());
average.add(400);
Serial.println(average.getAvg());
}
void loop() {
// put your main code here, to run repeatedly:
}
gibt aus:
Average
0
100
150
200
300
366
400
Ein Zeitreisender beehrt uns: Wie war/wird Ostern 2024 ?
NEIN, der Kern deine Frage ist, wieso macht man Messungen wenn man sie nicht braucht.
Das belastet den Sensor (viele Sensoren wollen zwischen 2 Messungen sogar eine Pause) und ist völlig unnötig.
Ich mache die Anzahl Messungen die ich brauche, addiere sie, und teile Sie durch die Anzahl der Messungen die ich gemacht habe. Fertig.
Das spart Strom, schont wie getippt den Sensor und meine Nerven.
Der einzige sinnvolle Grund wäre, wenn ich die Daten irgendwo speichere. Dann würde ich mir überlegen was ich mache. Und die Antwort hängt dann stark davon ab, wie viele Messungen ich für mein Durchschnittswert brauche. Ab einer gewissen Anzahl ist es dann nämlich Sinnvoll einfach den Speicher auszulesen, anstatt ein fettes Array aufzubauen. Besonders wo die MC-Teile dazu neigen, einen sehr knapp bemessenen Speicher zu haben.
Ach ja, bei bis 5 Messungen würde ich ein Array aufbauen und vor der Messung einfach den Wert ein Hoch schieben im Array. a(i) = a(i+1);
Gruß
Pucki
Wie du meinen?
Geht er eher kaputt?
Woher du wissen was für Messungen sind das?
Noch einer was kritische Wahrheit nicht verträgt.
Welchen Sinn soll das bei einem Mittelwert haben?
Gruß Tommy
Das ist sowas von unsinnig.
So wie auch die gesamte Erklärung vorher auch.
Es kann sehr wohl einen Sinn haben, einen Sensor dauerhaft abzufragen.
Und dann daraus einen gleitenden Mittelwert zu bilden.
Oder einen Mittelwert unter Nichtberücksichtigung bestimmter Werte in der Messreihe.
Das ist aber nicht die Frage und damit irrelevant.
Daten werden durch das kopieren weder schöner noch auf eine andere Art irgendwie besser.
Ganz einfach.
Er will ja (wie mir gesagt wurde) die letzten X Messungen haben. Also schiebe ich VOR der Messung die alten Messungen ein Hoch im Array. Dan mache ich die Messung, schiebe sie ins letzte Feld des Array , Rechne in einer 2. Schleife die Summe aller Werte im Array und Teile sie durch die Anzahl der Messungen.
Fertig ist.
JE nach Sensor und Auskunft des Hersteller JA. Steht so in der Anleitung meines Sensors z.b. für die Blumenkasten-Überwachung.
Gruß
Pucki
Unnötig und damit Unsinnig!
Was für Überwachung ?
Erdfeuchtigkeit dann wurden falsche gekauft.
Ist mir jetzt auch klar.
Gruß
Pucki
Richtig, aber Einsicht kennt Pucki007 nicht.
Gruß Tommy
Ob man sie braucht weiß man erst, wenn man sie gemacht hat.
Das allereinzigste was an Puckis Beitrag Sinn macht, ist das ein gleitender Mittelwert erfordert, dass man alle alten Werte die man noch braucht, aufheben muss. Was bei großem n und kleinem Controller Probleme machen kann, weswegen man stattdessen auch gern einen Tiefpass-Filter nimmt. Oder sich fragt, wofür man einen Mittelwert der letzten n Werte braucht: Ist nicht Min und Max der letzten Periode (Beispiel Tages-Temperatur) interessanter?