Uśrednianie wyników pomiaru

Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

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 :

Kod: Zaznacz cały


 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 :

Kod: Zaznacz cały

 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:
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
Espablo
Posty: 1754
Rejestracja: śr cze 29, 2016 5:04 pm
Lokalizacja: Oświęcim
Kontakt:

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:
Awatar użytkownika
slawek
Posty: 2465
Rejestracja: pn mar 14, 2016 11:48 pm
Lokalizacja: Biała Podlaska

shimano73 pisze: śr lip 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...
TEORIA jest wtedy gdy wszystko wiemy i nic nie działa
PRAKTYKA jest wtedy gdy wszystko działa a my nie wiemy dlaczego
My łączymy teorię z praktyką czyli nic nie działa i nikt nie wie dlaczego
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

slawek pisze: śr lip 03, 2019 9:17 pm
shimano73 pisze: śr lip 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 😁
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
Awatar użytkownika
slawek
Posty: 2465
Rejestracja: pn mar 14, 2016 11:48 pm
Lokalizacja: Biała Podlaska

shimano73 pisze: śr lip 03, 2019 9:18 pm
slawek pisze: śr lip 03, 2019 9:17 pm
shimano73 pisze: śr lip 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 ;)
TEORIA jest wtedy gdy wszystko wiemy i nic nie działa
PRAKTYKA jest wtedy gdy wszystko działa a my nie wiemy dlaczego
My łączymy teorię z praktyką czyli nic nie działa i nikt nie wie dlaczego
andrew01
Posty: 162
Rejestracja: pt maja 24, 2019 6:49 am

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
Awatar użytkownika
pzygmunt
Posty: 18284
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

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
Posty: 407
Rejestracja: pn wrz 17, 2018 5:26 pm

Przy okazji DS mierzy maksymalną temperaturę do 125 stopni dlaczego cloud przewiduje tylko 85 stopni?
Awatar użytkownika
pzygmunt
Posty: 18284
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Gdzie wyczytałeś, że cloud przewiduje 85 ?
Jest tylko dolny limit (zero absolutne). W górę ile wciśniesz w zmienną.
Awatar użytkownika
shimano73
Posty: 1968
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze
Kontakt:

Ja na kanale tym ma czujnik naświetlenia i pokazuje nawet 60.000 lux
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie

Wezmę udział w Supla Offline Party 2024 :)
ODPOWIEDZ

Wróć do „Ogólna dyskusja”