Arduino Polska Forum

Pełna wersja: Średnia krocząca p- funkcja
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witajcie.

Długo szukałem średniej kroczącej - tzn takiej średniej żeby brał z ostatnich kilku/kilkunastu wyników i wyliczał średnią.
No i nic nie znalazłem, a wiem że to się przydaje w zasadzie wszędzie.

Dlatego napisałem funkcję. Funkcja jest o tyle ciekawa że od razu ma wbudowaną kalibrację i działa niezależnie od napięcia referenyjnego.

Jakie argumenty podajemy do funkcji
Na pierwszym miejscu podajemy dowolną unikatową cyfrę. Przy tylko jednym wywołaniu funkcji nie ma znaczenia co wpiszemy, ale jeśli chcemy w jednym sketchu kilka razy policzyć funkcje to trzeba je rozdzielić. Pierwsza funkcja 0, druga 1, trzecia 2 itd..
Drugi argument określa z którego wejścia analogowego ma odczytywać (ja to określiłem definicją)
trzeci i czwarty argument kalibruje nam od razu wyświetlanie wyników.
Wiadomo że domyślnie jeśli mamy 10biiowy przetwornik to mamy 0-1023 rozdzielczość.
Dla napięcia odniesienia 5V 1023 oznacza 5V a dla 3,3V 1023 oznacza 3,3V. No ale jeśli zrobimy sobie jakiś dzielnik to 1023 może oznaczać 12V itp.
Więc tutaj te 2 pola służą właśnie do kalibracji - wystarczy na monitorze odczytać wartość ADC np 715 oraz miernikiem odczytać napięcie - u mnie 3.31V.
Wpisujemy do funkcji i voila. Mamy gotowy przlicznik.


Kod:
#define DT 20 //z ilu wyników ma wyliczać średnią
#define WejscieV0 A0 //pin na którym mierzymy napięcie
float Srednia[2]; // ile razy chcemy wywołać funkcję
float Voltage0; - nasze mierzone uśredniane napięcie

void loop() {
Voltage0 = f_SR(0,WejscieV0,715,3.31);
}

//moje funkcje
float f_SR ( int nr, int nr_wejscia, int odczyt_ADC, float wartosc_V)
{
Srednia[nr] = (analogRead(nr_wejscia)+DT*Srednia[nr]) / (DT+1);
 if (odczyt_ADC==0) return 0;
 else {return (Srednia[nr] * (wartosc_V/odczyt_ADC));
 }
} //end f_SR
oczywiście jak ktoś chce działać na UNO to dobrze by było wyrzucić float i zamienić wszystko na int i potem tylko wyświetlać odpowiednio inty ale przy moim MEGA nie zależy mi na takiej pamięciożerności Smile