Go Down

Topic: Mittelwert von bestimmtem Messzeitraum ausgeben (Read 81 times) previous topic - next topic

Uhlfred

Jun 23, 2019, 12:58 pm Last Edit: Jun 23, 2019, 01:06 pm by Uhlfred
Hallo liebes Forum.

Vor einer Weile hatte ich einen Höhenmesser angefangen und diesen weitgehend fertig gestellt was das Gehäuse und der Hardware betrifft.

Um voran zu kommen habe ich das Gerät zum laufen gebracht indem jede Sekunde der zuvor gemessene Wert auf dem Display angezeigt wird. Jedoch schwankt der Wert ziemlich und ich möchte das jetzt etwas dämpfen.
Die Idee war alle 100 ms eine Messung zu addieren, diese dann nach 10 Messungen am Ende durch 10 zu dividieren und dann erst anzuzeigen. Von mir aus auch 10 ms delay und 100 Messungen.

Leider tue ich mich als Anfänger etwas schwer. Hier ist anscheinend eine Lösung aber irgendwie bekomme ich es nicht hin:
http://shelvin.de/den-mittelwert-fortlaufend-bilden-mit-einer-funktion/

Da im originalen Programm ein Drehencoder zum einstellen des Atmosphärendruck und das OLED Display usw. eingebunden sind habe ich hier mal nur den Teil der Druckmessung herauskopiert.
Kann mir da jemand etwas weiter helfen? Ist das überhaupt so möglich?

Grüße


Code: [Select]

#include "BMP280.h"
#define P0 1013.25 //mittlere Luftdruck in Meereshöhe (im Programm veränderbar)
BMP280 bmp;

void setup() {}

void loop(void) {
  double T, P;
  char result = bmp.startMeasurment();

  if (result != 0) {
    delay(result);
    result = bmp.getTemperatureAndPressure(T, P);

    if (result != 0) {
      double A = (bmp.altitude(P, P0) * 3.28084); //Umrechnung von Meter in Fuß

      delay(1000);

    }
  }
}

postmaster-ino

Hi

Vll. hilft Dir ein Running_Median.
meine ZIP ist nur einen Klick entfernt - hier im Forum
Du gibst an, wie viele Messwerte Du zusammen fassen willst.
Diese Messwerte werden sortiert.
Bei jedem Messwert, Den Du 'rein schiebst', bekommst Du als Rückgabe den jetzt mittig stehenden Messwert dieser Liste zurück - oder fragst Diesen separat an, ohne einen neuen Wert eingeben zu müssen.

Meine Änderung bestand nur darin, daß ich den Median auf beliebige Datentypen umgestrickt habe, das Original (in der SHARP-Bibliothek) läuft mit int (16 Bit, signed).

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

combie

#2
Jun 23, 2019, 01:13 pm Last Edit: Jun 23, 2019, 01:15 pm by combie
GleitenderMittelwert oder Tiefpassfilter.


Beispiel (aus meiner Wühlkiste):

Code: [Select]
 template<typename DatenType>
    class GleitenderMittelwert   // eher Tiefpassfilter
    {
      private:
        const double factor;
        double mittelwert;
        
      public:
         GleitenderMittelwert(const double factor):factor(factor),mittelwert(0){}
        
         void setInitial(double value)
         {
            mittelwert = value;
         }
        
         DatenType doValue(DatenType value) // neuen Wert verarbeiten
         {
            mittelwert *= 1.0 - factor;
            mittelwert += factor * value;
            return  mittelwert;
         }
        
         DatenType operator= (DatenType value)
         {
            return doValue(value);      
         }
        
         DatenType operator() (DatenType value)
         {
            return doValue(value);      
         }
        
         DatenType operator() () const
         {
            return mittelwert;      
         }
    
         operator DatenType() const
         {
           return mittelwert;
         }  
    };

// 1.0/11.0 entspricht in etwa einem Array mit 11 Zellen für die Berechnung des Mittelwertes
GleitenderMittelwert<uint16_t> gmw(1.0/11.0);


void setup()
{
  Serial.begin(9600);
  gmw.setInitial(analogRead(A0));
}

void loop()
{
  uint16_t value = analogRead(A0);
  Serial.print(value);
  Serial.print("  ");
  Serial.println(gmw(value));
  delay(200);
}

Der Pessimist sieht die Wolke vor der Sonne.
Der Optimist sieht die Sonne hinter der Wolke.

Mantra: Die Sonne scheint immer!

Uhlfred

Hallo und vielen Dank für eure Lösungsansätze.
Wenn ich dazu komme werde ich das testen und berichten.

Go Up