Uśrednianie wyników pomiaru

User avatar
shimano73
Posts: 753
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Wed Jul 03, 2019 2:24 pm

Witajcie , czasem zdarza się iż nasze czujniki mają dziwne odczyty pomiarów jakby z kosmosu , chyba najczęściej pojawia się to w DTH22 i podobnych ale również w BME czy SHT31 również się to zdarza.
Rozmyślałem jak by temu tu zaradzić a że słaby ze mnie programista , poszukałem w necie i znalazłem coś takiego.
Wygląda to tak, zapisujemy do tablicy kilkunastu element-owej kolejne wyniki pomiarów, potem sortujemy je od najniższej do najwyższej , następnie bierzemy np pięć wyników ze środka tabeli i liczymy z niej średnią . W wyniku czego odrzucamy najniższe i najwyższe wartości , wówczas wykres nie będzie już posiadał dziwnych pików.
Poniżej przykład dla czujnika bme280 , u mnie wygląda to tak :

Code: Select all


 case 0:         
            //*temp = myBME280.readTemperature();
           if (nr_measurement <=13)
           {
            nr_measurement++;   // ustawiamy kolejny nr komórki tablicy
           }
           else { 
            nr_measurement=1;  //  jeśli się przepełni to ustaw na 1
           }
           
          tab_measurement[nr_measurement] = myBME280.readTemperature(); // aktualny pomiar wpisujemy do tablicy 

          p = 0;
          while (p == 0)
          {
            p = 1;
            for (int sort = 1; sort <= 13; sort++)   // w pętli wykonuje się sortowanie w górę
            {
              if (tab_measurement[sort] > tab_measurement[sort + 1])
                {
                  temp_measurement = tab_measurement[sort];
                  tab_measurement[sort] = tab_measurement[sort + 1];
                  tab_measurement[sort + 1] = temp_measurement;
                  p = 0;
                }     
            }
          }
          // poniżej  liczymy średnią z pięciu wyników ze środka tabeli i zapisujemy do zerowej komórki 
          tab_measurement[0] = (tab_measurement[5] + tab_measurement[6] + tab_measurement[7] + tab_measurement[8] + tab_measurement[9]) / 5;
          
          *temp=tab_measurement[0];  // a tu wpisujemy wyliczoną średnią 
            Serial.print("measurement = ");
            Serial.println(nr_measurement);
            
            Serial.print("Temperature = ");
            Serial.print(tab_measurement[0]);
            Serial.println(" *C");
    
            *humidity = myBME280.readHumidity(); 
            Serial.print("Humidity = ");
            Serial.print(myBME280.readHumidity());
            Serial.println(" %");
            if ( isnan(*temp) || isnan(*humidity) ) {
                *temp = -275;
                *humidity = -1;
            }
          break;
W identyczny sposób można to zrobić dla pomiaru wilgotności i innych czynników których pomiar dokonujemy
pozostaje jeszcze zadeklarować zmienne , u mnie wygląda to tak :

Code: Select all

 Adafruit_BME280 myBME280; // I2C
 double tab_measurement[15];  // tablica z 16 komórkami - bo liczymy od "0" 
 double temp_measurement;     // zmienna  na pomiar tymczasowy
 int nr_measurement = 1;          // licznik komórek
 int p;                                             
i powinno działać , przynajmniej tak jest w moim przypadku :D

Podczas startu programu należy chwile odczekać aż cała tablica zapełni się wynikami z których zacznie wyliczać średnią
Należy zwrócić uwagę przy zwiększaniu tablicy aby nie doszło do jej niekontrolowanego przekroczenia co zaowocuje zawieszeniem programu. Pół biedy gdy układ jest na stole , niestety moja stacja pogodowa jest na dachu i aktualizowałem ja po WiFi .
Teraz muszę z laptopem wejść na dach :lol:
User avatar
Espablo
Posts: 1384
Joined: Wed Jun 29, 2016 5:04 pm
Location: Oświęcim
Contact:

Wed Jul 03, 2019 9:14 pm

To jest jest typowa średnia mediana
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu. :? :roll:
https://github.com/Espablo
User avatar
slawek
Posts: 2185
Joined: Mon Mar 14, 2016 11:48 pm
Location: Biała Podlaska

Wed Jul 03, 2019 9:17 pm

shimano73 wrote:
Wed Jul 03, 2019 2:24 pm
Teraz muszę z laptopem wejść na dach :lol:
To chyba nie najlepsze miejsce na stację pogodową... oczywiście zdaję sobie sprawę, że miarą są możliwości...
Gdy wszystkie możliwe sposoby zawiodą - pozostaje przeczytać instrukcję...
User avatar
shimano73
Posts: 753
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Wed Jul 03, 2019 9:18 pm

slawek wrote:
Wed Jul 03, 2019 9:17 pm
shimano73 wrote:
Wed Jul 03, 2019 2:24 pm
Teraz muszę z laptopem wejść na dach :lol:
To chyba nie najlepsze miejsce na stację pogodową... oczywiście zdaję sobie sprawę, że miarą są możliwości...
Bez obaw dach ... garażu ... jest płaski 😁
User avatar
slawek
Posts: 2185
Joined: Mon Mar 14, 2016 11:48 pm
Location: Biała Podlaska

Wed Jul 03, 2019 9:25 pm

shimano73 wrote:
Wed Jul 03, 2019 9:18 pm
slawek wrote:
Wed Jul 03, 2019 9:17 pm
shimano73 wrote:
Wed Jul 03, 2019 2:24 pm
Teraz muszę z laptopem wejść na dach :lol:
To chyba nie najlepsze miejsce na stację pogodową... oczywiście zdaję sobie sprawę, że miarą są możliwości...
Bez obaw dach ... garażu ... jest płaski 😁
Chodziło mi raczej o wysokość od gruntu... i poprawki na nagrzany dach ;)
Gdy wszystkie możliwe sposoby zawiodą - pozostaje przeczytać instrukcję...
andrew01
Posts: 11
Joined: Fri May 24, 2019 6:49 am

Wed Jul 03, 2019 9:32 pm

A czy nie prościej byłoby określić sensowne min i max dla danego pomiaru i jeśli wynik wykracza poza przyjęty zakres poprawny to go nie wysyłamy na serwer?

Pozdrawiam
Andrzej
User avatar
pzygmunt
Posts: 5997
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Wed Jul 03, 2019 9:45 pm

Ja bym szedł w min i max plus dążenie do wartości pomiaru dodając procent od różnicy. Wtedy nie robimy średniej, a wylecą samoczynnie odchyłki związane z błędami.
Simono
Posts: 194
Joined: Mon Sep 17, 2018 5:26 pm

Thu Jul 04, 2019 2:54 pm

Przy okazji DS mierzy maksymalną temperaturę do 125 stopni dlaczego cloud przewiduje tylko 85 stopni?
User avatar
pzygmunt
Posts: 5997
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Thu Jul 04, 2019 3:05 pm

Gdzie wyczytałeś, że cloud przewiduje 85 ?
Jest tylko dolny limit (zero absolutne). W górę ile wciśniesz w zmienną.
User avatar
shimano73
Posts: 753
Joined: Sun Feb 28, 2016 12:27 pm
Location: Orzesze

Thu Jul 04, 2019 3:08 pm

Ja na kanale tym ma czujnik naświetlenia i pokazuje nawet 60.000 lux
Post Reply