Wątek przeniesiony 2018-11-12 19:19 z C/C++ przez furious programming.

Poprawność kodu obsługi potencjometru – liczenie średniej

0

Witam wszystkich. Mam do wszystkich użytkowników pytanie czy ten kod jest poprawnie skonstruowany? Bo nadal są wahania potencjometru mimo iż ich nie powinno być. Wydaje mi się , iż złą wartość skaluje - czy mógłby ktoś zajrzeć na ten kod?

Zmienne :

int potencjometr = A0;                // odczyt napiecia z potentcjometru pinem analogowym 0
int wartosc = 0;                       // zmienna przechowujaca wartosc napiecia odczytanego
int dane[5]; // do potencjometru do sredniej
int i=0;  // do potencjometru do sredniej
int srednia;  // do potencjometru do sredniej

 void loop() {
wartosc = analogRead(A0);
 dane[i]=wartosc; // do sredniej potencjoemtru
i++;
if(i==5){
 i=0;
}
for(int j=0;j<5;j++){
  srednia+=dane[j]; // do sredniej potencjoemtru
}
srednia/=5.0; // do sredniej potencjoemtru
 wartosc  = map(wartosc, 0, 1023, 0, 100);           // skalowanie od 0 do 100 
}

2

Skalowanie jest prawidłowe – za to w końcu odpowiada funkcja map. Zastanawiam się nad tym, dlaczego mapujesz odczytaną wartość na sam koniec funkcji loop? Ma to jakiś sens? No i najważniejsze – nigdy nie zerujesz zmiennej srednia, więc jej wartość ciągle będzie nieprawidłowa.

void loop()
{
  dane[i] = analogRead(A0);
  wartosc = map(dane[i], 0, 1023, 0, 100);
  
  i = (i + 1) % 5;
  srednia = 0;
  
  for(int j = 0; j < 5; j++)
    srednia += dane[j];
  
  srednia /= 5.0;
}

Przy okazji – nie widzę funkcji setup.

0

Zamieściłem tylko ten fragment kodu w którym jest potencjometr. A to kiedy mam wyzerwować tę wartość?

1

Chyba nie Czytasz co Ci napisał furious. Zmodyfikował nieco kod, i, m. in.. dodał linię: srednia = 0; . Teraz, tak jak powinno być, przed każdym kolejnym liczeniem średniej w funkcji loop, będzie ona zerowana.

1

Dzięki wielkie, to chyba jedno z najlepszych for - zawsze ktoś coś doradzi i pomoże. Można zamknąć :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1