Skocz do zawartości

Wyciąganie średniej z pomiarów ADC


kellyq

Pomocna odpowiedź

Hej napisałem taki kod

int liczbaElementow = 10;
int data[10];
int index = 0;
int srednia = 0;

void loop() {

int odczyt = analogRead(sensorPin);

if(index <= liczbaElementow-1){
  data[index] = odczyt;
  index++;  
  if(index == liczbaElementow){
    index = 0;
  }
}

srednia = (data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]+data[8]+data[9])/liczbaElementow;

Program zapisuje do 10-cio pozycyjnej tablicy odczyty z adc celem uśrednienia wyników.

Mam pytanko. Jak mogę zapisać ostatnią linijkę kodu żeby jej nie zmieniać kiedy zmienię sobie liczbę elementów w tablicy

Próbowałe coś takiego ale wychodzą głupoty. Drugie pytanko, jak zmienić liczbę elementów tablicy "data[10]" kiedy zmienię "liczbaElementow" np na 20 czy data[sizeof(liczbaElementow)] jest poprawne bo mi głupoty znowu wychodzą?

for(int i=0; i<=liczbaElementow-1; i++){
int suma += data[i];
if(i==(liczbaElementow-1)){
  srednia = suma/liczbaElementow;
  }
}

 

Link do komentarza
Share on other sites

Nie jest potrzebna ale...

Mogę użyć pętli for z 10 przebiegami i dodawać kolejno wartości z każdego przebiegu, w ostatnim przebiegu, podzielić uzyskaną wartość przez liczbę przebiegów i mam średnią tylko ile to zajmie czasu ta pętla for kiedy walczę o to by pętla loop była jak najkrótsza.

Hmm trzeba by zmierzyć jak długo trwała by  ta pętla for a jak długo by trwało obecne rozwiązanie. 

Druga sprawa jest taka że dane do tablicy uzyskuję z drugiego arduino za pomocą transmisji radiowej. Co za tym idzie częstotliwość ich otrzymywania jest niższa. Czyli na mój rozum blokowałby się tą pętlą for aż do uzyskania tych 10 zmiennych. Dlatego takie rozwiązanie.

A może jest jeszcze inne rozwiązanie?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

 

Nie chcę robić nowego wątku o tym samym praktycznie więc jeszcze raz zapytam. Taki oto kod:

float rozmiarTablicy = EEPROM.get(60, rozmiarTablicy);  
const int wagaArrayCount = 20;      
float wagaArray[wagaArrayCount];              
float wagaSum;   
    float waga = scale.get_units(probkowanie);                  //zlicza wage
      

    for (int i=rozmiarTablicy-1; i>0; i--){
      wagaArray[i] = wagaArray[i-1];
    }
    wagaArray[0] = waga;

    wagaSum = 0;
    for (int i=0; i<rozmiarTablicy; i++)wagaSum += wagaArray[i];
    wagaSum /= wagaArrayCount;

Tym razem dokonuje pomiaru wagi przedmiotu. Generalnie samo ważenie poprzez wyświetlanie zmiennej waga działa oczywiście nienagannie. Problem polega na tym że kiedy wrzucę te dane do tablicy celem zliczania średniej kroczącej dostaje wynik zgoła inny niż oczekiwany -> zmienna wagaSum.

Kiedy realnie przedmiot waży 100g dostaje średnią kroczącą  500g. Rozmiar tablicy jest ustawiony na 20 elementów. Do uśredniania wyników nie wykorzystuje całej tablicy tylko jej część, zmienna rozmiarTablicy zależnie od ustawień zapisywanych w eeprom. 

Co może być nie tak?

 

 

Link do komentarza
Share on other sites

Rozumiem że doszedłeś do 21 pomiaru? Bo tym algorytmem pierwsze 20 będą zafałszowane.

Poza tym po co ta heca z rozmiarTablicy, jak i tak z tego nie korzystasz?

 

Link do komentarza
Share on other sites

Korzystam, zmieniam to w menu, taka opcja. A i w końcu naprawiłem to, trzeba podzielić zsumowane elementy tablicy przez jej aktualną długość a nie zadeklarowaną maksymalną😁 taka mała błachostka się tam schowała.

Pierwsze 20 mogą być zafałszowane, nie ma to znaczenia ważne żeby pod koniec nasypywania na wagę uśredniało dobrze. Wyobraź sobie np. ważenie ziemniaków nasypujesz na wagę do uzyskania 15kg. Załóżmy że jeden ziemniak waży 100g. Kiedy ostatni który ma spaść na wagę o nią udeża cała waga w tej krótkiej chwili nie wzrasta o te 100g tylko o więcej za sprawą udeżenia. Kiedy ostatni ziemniak był by lżejszy np. 50g i udeżył by o wagę, waga pokaże więcej (100g?) zafałszowując wynik. Oczywiście to przy założeniu że jeśli waga osiągnie 15kg to nasypywanie zatrzymuje się.

Jak by coś to można pierwszym odczytem wagi zapełnić całą tablicę na początku, prawda?

Link do komentarza
Share on other sites

7 minut temu, kellyq napisał:

ak by coś to można pierwszym odczytem wagi zapełnić całą tablicę na początku, prawda

Można, albo można brać aktualną ilość wyników w tablicy do sumowania/dzielenia. Drugi sposób jest o tyle lepszy, że wyciąga rzeczywistą średnią z pomiarów, a nie średnią z czort wie czego 🙂

Jeśli to ziemniaki co spadają na wagę zastanowiłbym się, czy naprawdę taka prosta średnia to dobry pomysł. Tak na rybkę - odrzucenie wyniku jeśli następny był mniejszy?

 

Link do komentarza
Share on other sites

7 minut temu, ethanak napisał:

albo można brać aktualną ilość wyników w tablicy do sumowania/dzielenia

mogło by i tak być, muszę to podszlifować jeszcze

 

8 minut temu, ethanak napisał:

odrzucenie wyniku jeśli następny był mniejszy?

Możesz rozwinąć, nie rozumiem?

Link do komentarza
Share on other sites

18 minut temu, kellyq napisał:

Możesz rozwinąć, nie rozumiem?

Przypuśćmy masz wyniki:

  1. 500 g
  2. 800 g
  3. 640 g

Wiadomo, że ziemniaki nie ulatują w powietrze, czyli kolejny wynik powinien być albo taki sam jak poprzedni (nie ma nowych ziemniaków) albo większy (jest nowy ziemniak). W sytuacji jak wyżej widać, że wynik 800 g jest ewidentnie nieprawidłowy, bo po nim następuje 640. Wniosek: ziemniak uderzył w wagę, czyli wynik jest nieprawidłowy.

Reasumując: ciąg wyników powinien być monotoniczny, a wyniki zaburzające ową "monotonię" można odrzucić.

Nie wiem czy dobrze kombinuję, ważenie ziemniaków to nie moja działka, ale tak mi się wydaje... co o tym sądzisz?

Link do komentarza
Share on other sites

Niby racja ale... wtedy pojawia się kolejny problem. Odrzucisz błędny wynik ale ziemniaka już nie cofniesz z powrotem na taśmę.

Teraz mam tak, że mam ustawioną zadaną wagę na ileś tam np.1kg i to nie koniecznie ziemniaków. Po osiągnięciu tej wagi wyłączam taśmę nasypującą i wchodzę w pętlę while oczekującą na wciśnięcie przycisku opróżnienia wagi. Chyba przy tym zostanę. W sumie to mam do dyspozycji teraz 2 parametry próbkowanie i właśnie długość tablicy. A i jeszcze taśma mi zwalnia kiedy osiągnę 95% zadanej wagi. Wcześniej miałem taki bardzo banalny sterownik kiedy chciałem ważyć 1kg to nastawiałem 1,05kg. Teraz powinno być dużo lepiej.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.