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;
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;
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