Obliczanie średniej z czujnika

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Obliczanie średniej z czujnika

Post autor: Borik » 18 lis 2012, 15:14

Witam

Proszę o wskazówki jak obliczyć średnią np z 10 pomiarów. Dokładnie chodzi o to, że mam czujnik temperatury który nie jest dość dokładny i chciałbym żeby pokazał mi średnią z np 10 pomiarów.

Teraz mam taki kod:

Kod: Zaznacz cały

}
void temperatura()					// termometr
{temp = analogRead(1)*5/1024.0;		
 temp = temp - 0.5;
 temp = temp / 0.01;
 Serial.print("Temperatura - ");
 Serial.print(temp);
 Serial.println(*C);
 delay(2000);
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Mateusz88
Młodszy majsterkowicz
Posty: 43
Rejestracja: 16 wrz 2012, 14:41

Re: Obliczanie średniej z czujnika

Post autor: Mateusz88 » 18 lis 2012, 16:32

Sprawdź czy działa mój stary kod, ma 13 pomiarów z sortowaniem od najmniejszego do największego, średnia liczona jest z pięciu środkowych pomiarów, dzięki temu odrzucamy skrajne błędy pomiarowe.

Kod: Zaznacz cały

float temp[14];
float x = 0;
int p;

byte stopnie[8] = {
        B01100,
        B10010,
        B10010,
        B01100,
        B00000,
        B00000,
        B00000,
        B00000
};
void setup()
{
  lcd.createChar(0, stopnie);
};

void loop ()
{
 for (int i = 1; i <= 13; i++)
  { 
    temp[i] = analogRead(0)*5/1024.0;
    temp[i] = temp[i] - 0.5;
    temp[i] = temp[i] / 0.01;
    delay(250);
  }
  
  p = 0;
  while (p == 0)
  {
    p = 1;
    for (int i = 1; i <= 12; i++)
    {
      if (temp[i] > temp[i + 1])
        {
          x = temp[i];
          temp[i] = temp[i + 1];
          temp[i + 1] = x;
          p = 0;
        }     
    }
  }
  
  temp[0] = (temp[5] + temp[6] + temp[7] + temp[8] + temp[9]) / 5;
  lcd.print(temp[0]);
  lcd.write(0);
  lcd.print("C");
};
Spróbuj też podłączyć przy czujniku miedzy vcc a gnd kondensator 100nF

EDIT

Dodałem do kodu znaczek stopni.
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Re: Obliczanie średniej z czujnika

Post autor: Borik » 18 lis 2012, 21:36

Z pomocą twojego kodu zmajstrowałem coś takieo i jest ok

Kod: Zaznacz cały

void temperatura()					// Termometr
{for (int i = 0; i < 2000; i++)		
{temp = temp + analogRead(1);}
temp = temp / 2000;					
wykonywaliśmy pętle
temp = temp*5/1024.0;
 temp = temp - 0.5;
 temp = temp / 0.01;
Wyniki są w 99%jak z twojego kodu. Powiedz mi tylko co da kondesator?

Dzięki
Mateusz88
Młodszy majsterkowicz
Posty: 43
Rejestracja: 16 wrz 2012, 14:41

Re: Obliczanie średniej z czujnika

Post autor: Mateusz88 » 18 lis 2012, 22:12

Kondensator ma za zadanie filtracje zasilania, przy stabilnym zasilaniu może się okazać, że liczenie średniej będzie zbędne. Polecam przeczytać artykuł http://mikrokontrolery.blogspot.com/201 ... olera.html
Borik
Młodszy majsterkowicz
Posty: 24
Rejestracja: 21 paź 2012, 21:43

Re: Obliczanie średniej z czujnika

Post autor: Borik » 18 lis 2012, 22:59

Dzięki za link :)
Teraz już rozumiem po co kondensator.
Kitsibas
Młodszy majsterkowicz
Posty: 17
Rejestracja: 29 paź 2012, 13:10

Re: Obliczanie średniej z czujnika

Post autor: Kitsibas » 19 lis 2012, 11:21

Pytanie uzupełniające początkującego: Jakiego typu powinien to być kondensator? elektrolityczny ?
Mateusz88
Młodszy majsterkowicz
Posty: 43
Rejestracja: 16 wrz 2012, 14:41

Re: Obliczanie średniej z czujnika

Post autor: Mateusz88 » 19 lis 2012, 11:31

Przy mikrokontrolerach i czujnikach powinno się stosować ceramiczne. Elektrolityczne raczej przy np. stabilizatorze napięcia.
Iwerael
Młodszy majsterkowicz
Posty: 1
Rejestracja: 13 gru 2012, 17:39

Re: Obliczanie średniej z czujnika

Post autor: Iwerael » 13 gru 2012, 18:06

To może ja też zamieszczę swój kod z komentarzami, może ktoś skorzysta.

Kod: Zaznacz cały

float temp;
int p=0;                          //zmienna zwiazana z iloscia pomiarow
float suma=0;                     // summa naszych wsystkich pomiarow

void setup() {
  Serial.begin(9600);
}

void loop () {
  
  while(p <10)                     // okresla liczbe pomiarow (prykladowo 10)
  {
  temp = analogRead(2)*5/1024.0;   // dzieli 5V na 1024 (bo przetwornik arduino A/D ma 10 bitów czyli 1024)
  temp = temp - 0.5;               // skalowanie 500mV to 0 stopni(C) dlatego odejmujemy 0,5 
  temp = temp / 0.01;              // czułość czujnika temperatury 10mV/C 
  suma=suma+temp;                  //sumuje poszczegolne wartosci pomiarow
  p++;                             // zwieksza zmianna p o 1 
  Serial.println(temp);            //wyświetla kazdy pomiar (nie jest konieczne)
  delay(200);

}
Serial.print("Srednia temperatura: ");
Serial.println( suma/10);          // wyswietla srednia temperature z 10 pomiarow
p=0;                               // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
suma=0;                            // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
delay (5000);

}
Awatar użytkownika
emiks
Młodszy majsterkowicz
Posty: 10
Rejestracja: 21 sty 2018, 01:05

Re: Obliczanie średniej z czujnika

Post autor: emiks » 5 maja 2018, 07:52

Wiem że odkopuje dinozaura ale chyba warto bo temat bardzo przydatny. Mógłbyś ktoś pomóc przy tym kodzie aby odrzucić z wyników np 3 najniższe i najwyższe wartości i z tego średnią policzyć?


Iwerael pisze:
13 gru 2012, 18:06
To może ja też zamieszczę swój kod z komentarzami, może ktoś skorzysta.

Kod: Zaznacz cały

float temp;
int p=0;                          //zmienna zwiazana z iloscia pomiarow
float suma=0;                     // summa naszych wsystkich pomiarow

void setup() {
  Serial.begin(9600);
}

void loop () {
  
  while(p <10)                     // okresla liczbe pomiarow (prykladowo 10)
  {
  temp = analogRead(2)*5/1024.0;   // dzieli 5V na 1024 (bo przetwornik arduino A/D ma 10 bitów czyli 1024)
  temp = temp - 0.5;               // skalowanie 500mV to 0 stopni(C) dlatego odejmujemy 0,5 
  temp = temp / 0.01;              // czułość czujnika temperatury 10mV/C 
  suma=suma+temp;                  //sumuje poszczegolne wartosci pomiarow
  p++;                             // zwieksza zmianna p o 1 
  Serial.println(temp);            //wyświetla kazdy pomiar (nie jest konieczne)
  delay(200);

}
Serial.print("Srednia temperatura: ");
Serial.println( suma/10);          // wyswietla srednia temperature z 10 pomiarow
p=0;                               // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
suma=0;                            // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
delay (5000);

}
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Obliczanie średniej z czujnika

Post autor: Slawek » 6 maja 2018, 09:46

Stwórz tablicę 10-cio elementową typu int :

int nazwa_tablicy[10];

i zapisuj w pętli while wartości odczytów analogRead() do kolejnych komórek, następnie posortuj dane i wybierz wartości od 3 do 6, zsumuj je i podziel przez 4, i dopiero wtedy dokonaj przeliczenia na float czyli pomnóż najpierw przez 5 i podziel przez 1024.

Pozdr
Awatar użytkownika
emiks
Młodszy majsterkowicz
Posty: 10
Rejestracja: 21 sty 2018, 01:05

Re: Obliczanie średniej z czujnika

Post autor: emiks » 7 maja 2018, 05:52

Dziękuje Slawek za precyzyjną instrukcję.
Jestem początkujący, tablice są dla mnie czymś nowym i wysortowanie ich jest dla mnie niezrozumiałe, uzyskam jeszcze pomoc ??

Kod: Zaznacz cały

#include "DHT.h"                                         // biblioteka czujnika DHT11
#include "Adafruit_Sensor.h"
#define DHTTYPE DHT11 
#define czujnik 8
DHT dht(czujnik, DHTTYPE);                              

//int size = 10;
//int temp;
int p=0;                          //zmienna zwiazana z iloscia pomiarow
int y = 0;
int timer = 100;
int srednia = 0;
float sredniaTemp;
tabelaWynikow[10];

void setup() {
  Serial.begin(9600);
}

void loop () {

  while(p <10)                     // okresla liczbe pomiarow (prykladowo 10)
  {
    tabelaWynikow[y++] = dht.readTemperature();
    delay(timer);
    /////////////////////////////////////////////////

    //sortowanie tablicy

    sortowanie(tabelaWynikow,10);

    ////////////////////////////////////////////////
    p++;                             // zwieksza zmianna p o 1 

  }

  srednia = tabelaWynikow[3] + tabelaWynikow[4] + tabelaWynikow[5] + tabelaWynikow[6] /4;

  sredniaTemp = srednia;

  Serial.print("Srednia temperatura: ");
  Serial.println(sredniaTemp);         
  p=0;                               // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
  delay (1000);

}

void sortowanie(int a[], int size) {
  for(int i=0; i<(size-1); i++) {
    for(int o=0; o<(size-(i+1)); o++) {
      if(a[o] > a[o+1]) {
        int t = a[o];
        a[o] = a[o+1];
        a[o+1] = t;
      }
    }
  }
}
Ostatnio zmieniony 7 maja 2018, 07:51 przez emiks, łącznie zmieniany 1 raz.
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Obliczanie średniej z czujnika

Post autor: Slawek » 7 maja 2018, 07:30

Wracam z delegacji w piatek, dopiero wtedy moge Ci wiecej pomóc.

Pozdr
Awatar użytkownika
Marhef
Złota rączka
Posty: 1134
Rejestracja: 18 lis 2011, 02:18

Re: Obliczanie średniej z czujnika

Post autor: Marhef » 7 maja 2018, 08:49

Z tego, co widzę:
1) zamiast

Kod: Zaznacz cały

while(p<10)
dałbym

Kod: Zaznacz cały

for ( p = 0 ; p < 10 ; p++ )
Zadziała tak samo, a nie musisz martwić się o zerowanie zmiennej p.
2) po co jako indeks tablicy dodajesz dodatkową zmienną? Użyj zmiennej p, zapisz:

Kod: Zaznacz cały

tabelaWynikow[p] = dht.readTemperature();
Przy okazji, zmienna y już przy drugiej serii pomiarów wyskoczy poza rozmiar tablicy.
3) funkcję sortowanie wywołaj raz, po zakończeniu pomiarów, nie musi być wywoływana przy każdym pomiarze.
4) nie wiem, czy powinienem tak wprost napisać, zamiast próbować naprowadzić na rozwiązanie (podanie gotowego rozwiązania niewiele uczy). Funkcję sortowanie zrobiłbym inaczej. A konkretnie, inaczej zapisałbym pętle:

Kod: Zaznacz cały

for ( int i = 0 ; i < ( size - 1 ) ; i++) {
    for ( int o = ( i + 1 ) ; o < size ; o++ )
I resztę bez zmian.
Te punkty to to, co zauważyłem na szybko. Możliwe, że czegoś nie zauważyłem.
Awatar użytkownika
ethanak
Złota rączka
Posty: 759
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Obliczanie średniej z czujnika

Post autor: ethanak » 7 maja 2018, 10:11

@emiks: Jest do tego gotowa biblioteka - popatrz tutaj.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
Awatar użytkownika
emiks
Młodszy majsterkowicz
Posty: 10
Rejestracja: 21 sty 2018, 01:05

Re: Obliczanie średniej z czujnika

Post autor: emiks » 11 maja 2018, 08:26

Kod: Zaznacz cały

void medianaCzujnikaDHT5(){    //funkcja obliczajaca srednia temperature czujnika po odrzuceniu skrajnych wartosci i wyliczeniu sredniej

  float sredniaTemp;
  float sredniaWilg;  
  float tabelaWynikowTemp[10];
  float tabelaWynikowWilg[10];
  int p = 0; 
  int x = 0;
  int s = 0; 
  int y = 0;

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////  Temperatura  ///////////////////////////////////////////////////////////////////////////////

  while(p <10) 
  {
    tabelaWynikowTemp[x++] = dht5.readTemperature();

    /////////////////////////////////////////////////
    //sortowanie tablicy
    sortowanie(tabelaWynikowTemp,10);
    ////////////////////////////////////////////////
    p++; // zwieksza zmianna p o 1
  }

  sredniaTemp = (tabelaWynikowTemp[3] + tabelaWynikowTemp[4] + tabelaWynikowTemp[5] + tabelaWynikowTemp[6])/4;   
  // pobranie probek czujnika odzrucenie trzech najmniejszych i najwiekszych 
  // wyników z reszty policzona srednia wynikow

  p=0; // zerowanie zmiennej aby program na nowo rozpatrywal pomiary  
  x=0; // zerowanie zmiennej dodajacej tabele 

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////////////////  Wilgotnosc  ////////////////////////////////////////////////////////////////////////////////
  while(s <10) 
  {
    tabelaWynikowWilg[y++] = dht5.readHumidity();

    /////////////////////////////////////////////////
    //sortowanie tablicy
    sortowanie(tabelaWynikowWilg,10);
    ////////////////////////////////////////////////
    s++; // zwieksza zmianna p o 1
  }

  sredniaWilg = (tabelaWynikowWilg[3] + tabelaWynikowWilg[4] + tabelaWynikowWilg[5] + tabelaWynikowWilg[6])/4;   
  // pobranie probek czujnika odzrucenie trzech najmniejszych i najwiekszych 
  // wyników z reszty policzona srednia wynikow 

  s=0; // zerowanie zmiennej aby program na nowo rozpatrywal pomiary
  y=0; // zerowanie zmiennej dodajacej tabele




  ///////////////////////////////////////           ZMIENNA GLOBALNA           ////////////////////////////////////////////////////////////
  temperaturaWylotowa = sredniaTemp;    // zmiennaGlobalna = sredniaTemp;   zmienna globalna odpowiedzialna za czujnik dht 
  ///////////////////////////////////////           ZMIENNA GLOBALNA           //////////////////////////////////////////////////////////// 
  wilgotnoscWylotowa = sredniaWilg;     // zmiennaGlobalna = sredniaWilg;   zmienna globalna odpowiedzialna za czujnik dht 


}

Kod: Zaznacz cały

void sortowanie(float a[], int size) {        // funkcja sortowania tablicy  probek czujnika
  for(int i=0; i<(size-1); i++) {
    for(int o=0; o<(size-(i+1)); o++) {
      if(a[o] > a[o+1]) {
        float t = a[o];
        a[o] = a[o+1];
        a[o+1] = t;
      }
    }
  }
}
ODPOWIEDZ

Strony partnerskie: