ADC Mittelwert bestimmen und vergleichen

Hallo liebe Arduino Community!

Ich bin seit kurzem stolzer Besitzer eines Arduino. Das erste Projekt soll ein ADC werden und es funktioniert in Grundzügen auch schon alles.
Nun bin ich beim Einlesen auf ein Problem gestossen, dass ich die Eingangswerte gerne filtern möchte, um fehlerhafte Ausgabewerte zu vermeiden.
Hab mir schon überlegt, Mittelwerte zu bestimmen und miteinander zu vergleichen.
Das soll so funktionieren, dass erst dann ein Signal weitergegeben werden soll, wenn die Mittelwerte nicht zu sehr voneinander abweichen.
Bin noch ein Neuling im programmieren und hoffe ihr könnt mir da weiterhelfen.

Lg maoam120

maoam120:
Nun bin ich beim Einlesen auf ein Problem gestossen, dass ich die Eingangswerte gerne filtern möchte, um fehlerhafte Ausgabewerte zu vermeiden.
Hab mir schon überlegt, Mittelwerte zu bestimmen und miteinander zu vergleichen.
Das soll so funktionieren, dass erst dann ein Signal weitergegeben werden soll, wenn die Mittelwerte nicht zu sehr voneinander abweichen.

Das klingt nach einem Problem, mit dem ich mich auch noch herumschlagen muss – mehr oder weniger bald.

Ein schneller Blick in eine meiner aktuellen Bücher ergab, dass Du wahrscheinlich nach einem „Medianfilter“ suchst. In der Wikipedia fand ich auf die Schnelle: Rangordnungsfilter – Wikipedia.

HTH

Gregor

Am einfachsten addiert man ein paar Werte auf und dividiert durch die Anzahl. Das ist der arithmetische Mittelwert.

Man kann das auch gleitend machen, so dass nach jeder Messung ein End-Wert da ist und nicht erst nach x Messungen.

So oder so muss man dann nichts mehr vergleichen. Ausreißer werden durch die anderen Werte ausgeglichen.

Aber versuchen wir mal draufzukommen wieso die Werte so wechselhaft sind.
Was mißt Du genau?
Grüße Uwe

DU kannst auch die Werte aus dem Alten und aus dem neuen Lesezyklus bewerten und daraus dann einen neuen machen.

Wertneu=analogRead(BlaBla)*10;

AktWert=(Wertalt8+Wertneu2)/10;

Wertalt=Aktwert;

Hiermit wird der neue Wert nur integriert, also eine 100%ig änderung der "neuen" Lesewertes beeinflusst den Aktwert mit maximal 20% in diesem Beispiel. das alles pro Zyklus (die Zeit kommt dann auf dein Programm an)
Ist relativ schnell gemacht und die "Kommastellen" fallen halt runter sind aber hier nicht so wichtig bei einem Integrator.
Okay das ist auch kein Mittelwert, aber damit kann man auch mit Ausreißern nicht so viel "schaden" im Wert haben und wenn man doch sich rapide verändern Werte hat folgt man schon in die richtige Richtung.

Gruß
DerDani

Warum nicht

AktWert=(Wertalt*4+Wertneu)/5;

Die Gewichtung wäre doch gleich, oder?

@agmue
Ich habe ein bisschen auf die 10er geachtet man hätte auch *7/*3 machen könne für 30%
Wenn man das in longs packt kann man das *70/ *30 machen oder Floats *0.7 und 0.3.
Gruß
DerDani

Wenn ihr das ganze verstanden habt und eure Beispiele wie gewünscht laufen, könnt ihr euch die Lib RunningMedian anschauen.

@ElEspanol
Bläst man damit nicht den Sketch auf wenn man eine ganze Lib rein packt wenn man "nur" eine kleine Funktion braucht, da er ja alle Funktionen mit kompiliert und nicht nur die benötigte?
Gruß
DerDani

volvodani:
... wenn man "nur" eine kleine Funktion braucht, da er ja alle Funktionen mit kompiliert und nicht nur die benötigte?

Woher hast Du das denn? Mir wäre neu, dass Funktionen, die gar nicht benötigt werden, compiliert werden.

Gruß

Gregor

Deswegen mein Fragezeichen. Ich weiss eben halt nicht wie das mit Libraries ist.
Nimmt der sich aus den Libs nur die Sachen die er braucht also die :public :private Varibalen?
wenn ja dann war ich bis jetzt auf dem Holzweg.

Mir ist das nur bei den RTC aufgefallen.
Kodiere ich sie selbst (also nur die Sachen die ich brauche leseZeit seiteZeit)
oder nehme ich die RTC-Lib dann waren die Lib Sketche größer obwohl ich
z.B. nur die Zeit lesen/schreibn brauchte und nicht die Funktionen von Datum setzten und Alarme etc.
Gruß
DerDani

volvodani:
Deswegen mein Fragezeichen.

Ach so. Wenn Du eine Frage stellst, fängst Du den Satz am besten mit einem Fragewort (wer, wie, was, warum ...) an.

Wenn das Kompilat mit Lib größer ist, als ohne, ist wohl noch einiges in der Lib, das anders programmiert wurde. Wenn man selbst programmiert, denkt man z. B. selten an Fehlerbehandlung. Die ist in ordentlichen Bibliotheken immer mit drin (sonst wär‘s keine ordentliche Bibliothek, zumindest nicht für die Öffentlichkeit).

Gruß

Gregor

Kann schon sein, dass der Sketck grösser wird, kommt immer auf den Einzelfall an. Aber i.d.R. spielt das keine Rolle. Erst wenn du an die Speichergrenze kommst, würde ich mir über sowas Gedanken machen. Aber ich mach das halt lieber damit, weil:

  1. einmal kapiert, ist schneller programmiert, nur 3 oder vier Zeilen Code
  2. somit weniger fehlerträchtig
  3. durch austauschen von z.B. average gegen median in EINER Zeile sehe ich sofort die Auswirkungen auf die Werte und kann entscheiden, was für meinen Fall besser ist.
  4. Ich kann mir ohne weiteres Programmieren auch die Max und Min Werte ausgeben lassen, dass ich seh, was für Extremausreisser mein Sensor hat und ggf. hardwaremässig korrigierend eingreifen.

Liegt in "meiner" Natur. Komme aus der SPS Prgrammierung und dann macht man halt soviel wie nötig um die Zykluszeit nicht unnötig zu verlängern, wenn da irgendwelche Leichen mit im Programm stehen die man nicht braucht. Okay hier ist die Zykluszeit nicht von "bedeutung"
Wenn man das sich von Anfang an dran gewöhnt ist das halt "später" bei größeren Programmen einfacher.
Aber vielleicht bin ich da auf dem Holzweg.

Klar hat man genug Reserven und es ist einfacher.
Aber man sollte doch nur das Programmieren was man braucht oder?

Gruß
DerDani

Warum ein Rad bauen, wenn du ein ganzes Auto für lau bekommst und der Rest nicht stört. Aber das Bauen des Rades solltest man wenigstens verstanden haben.

Wenn ich nur ein Rad brauche warum ein ganzes Auto kaufen :smiley:
Gruß
DerDani

volvodani:
Wenn ich nur ein Rad brauche warum ein ganzes Auto kaufen :smiley:
Gruß
DerDani

Da hast du ja vollkommen recht. Aber was, wenn du das ganze Auto umsonst zum Rad dazubekommst? Und du Platz in deiner Garage hast.