Skocz do zawartości

Problem z kodem hc-sr04


fibi1989

Pomocna odpowiedź

Witam. Jestem nowy na forum więc chciałbym się przywitać z użytkownikami na wstępie 😉 Doświadczenie z arduino też niewielkie więc proszę o wyrozumiałość 😋 A więc do rzeczy: napisałem sobie programik na arduino który odczytuje wyniki z czujnika odległości hc-sr04, program powinien sprawdzić czy wynik pomiaru mieści się w zakresie, zapisać do odpowiedniej tablicy i obliczyć średnią z tej tablicy. Wszystko jest w miarę ok wyniki wyświetlają się na lcd w górnym wierszu z tablicy z mniejszymi odległościami a w dolnym z większymi odległościami. Mniejsze odległości są ok problem jest z większymi czasami wynik wyświetlany jest dobry a czasami wynik jest błędny. Wygląda to tak jakby problem był z funkcją "srednia" gdyż wyświetlana jest tylko suma wartości z tablicy nie podzielona przez ilość. Trochę to dziwne bo obliczanie mniejszych odległości korzysta z tej samej funkcji i tam nie ma problemów. problem pojawia się zwłaszcza przy szybszym ruchu czujnikiem. Nie mam już pomysłów gdzie może być błąd? Może ktoś bardziej doświadczony znajdzie rozwiązanie?

#include <LiquidCrystal.h> 
#include <Timers.h>  
#define TRIG 2 
#define ECHO 3
const int ile_liczb_tab = 10; 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Timer timer_pomiar; 
Timer timer_srednia; 


int zakres_min = 10;  
int zakres_max = 200;  
int zakres_srodek = 40; 
int tablica_min[ile_liczb_tab]; 
int tablica_max[ile_liczb_tab]; 
int licznik_min = 0; 
int licznik_max = 0; 

void setup() {
 pinMode(TRIG,OUTPUT);
 pinMode(ECHO,INPUT);
 lcd.begin(16, 2);
 timer_pomiar.begin(500);
 timer_srednia.begin(5000); 
}

int pomiar(){  
 unsigned long czas;
 digitalWrite(TRIG,HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG,LOW);
 czas = pulseIn(ECHO,HIGH);
 return czas / 58.00;
}

int srednia(int tab[],int komorki ){ 
 int liczba = 0;
 int wynik = 0;
 for (int i = 0;i < komorki ; i++ ){
   liczba = liczba + tab[i];
   }
   wynik = liczba / komorki;
   return wynik;
}

void zapis_do_tablicy(){  
 int odleglosc = pomiar();
 if (odleglosc >= zakres_min && odleglosc <= zakres_max){
    if (odleglosc <= zakres_srodek){
    tablica_min[licznik_min] = odleglosc;
    licznik_min ++;
    if (licznik_min == ile_liczb_tab){
     licznik_min = 0;
    }
    }
    if (odleglosc > zakres_srodek){
     tablica_max[licznik_max] = odleglosc;
     licznik_max ++;
     if (licznik_max == ile_liczb_tab){
       licznik_max = 0;
    }
    }

 }
}

void loop() {

 if (timer_pomiar.available()){ 
   zapis_do_tablicy();
   timer_pomiar.restart();
 }
 if (timer_srednia.available()){ 
   lcd.setCursor(0, 0);
   lcd.print(srednia(tablica_min,ile_liczb_tab));
   lcd.setCursor(0, 1);
   lcd.print(srednia(tablica_max,ile_liczb_tab));
   timer_srednia.restart();
 }
}

pozdrawiam

Link do komentarza
Share on other sites

Wygląda to tak jakby problem był z funkcją "srednia" gdyż wyświetlana jest tylko suma wartości z tablicy nie podzielona przez ilość

Trochę bez sensu podejrzenie.

Wskazówkę sam sobie napisałeś tutaj

problem pojawia się zwłaszcza przy szybszym ruchu czujnikiem

Proponuję najpierw upewnić się, czy każdy pomiar jest poprawny, dopiero potem przejść do wyliczania średniej.

Link do komentarza
Share on other sites

Wyświetlałem zawartości tablic na komputerze i są ok. Błędne zapisy z czujnika są pomijane więc nie mają wpływu na wynik. Na wyświetlaczu LCD jest pokazywana suma wartości z tablicy, a czasami cała funkcja zadziała poprawnie u jest pokazywana średnia.

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

Chyba 32767, bo ze znakiem 🙂

Raczej nie będzie, bo tablica ma 10 elementów, a maksymalna wartość to 200, więc jeżeli nie ma innych błędów, to maksymalnie w sumie powinno być 2000.

[ Dodano: 28-03-2018, 10:02 ]

Pisaliśmy równocześnie

Link do komentarza
Share on other sites

Sprawdzałem na monitorze wyniki z funkcji "średnia" i za każdym razem wychodzi dobrze a na LCD pokazuje czasami wynik dodawania że średniej a czasami jest dobrze. I tylko tak się dzieje w tablicy z większymi zmiennymi:/ nie wiem już o co tu chodzi? Macie jeszcze jakieś pomysły?

Link do komentarza
Share on other sites

Przepraszam, nie pamiętam czy post był przed pierwszą kawą czy przed snem, był do kogoś kto szukał jednego czujnika ds odwołując się do [1].

Tutaj sprawdzaj czy wartość średniej z tablicy max jest mniejsza od 100 i ewentualnie dodaj spację. Przynajmniej tylko tu widzę słaby punkt, przy pomiarach rzędu 90 może pokazać np. 901 na LCD jako ducha ze starego wyświetlenia 101.

  • Lubię! 1
Link do komentarza
Share on other sites

Strzał w dziesiątkę kolego kaczakat:) wkradły się duchy:P wychodzi tutaj moje niedoświadczenie... pobieżnie sumowałem wartości z tablicy i ten błąd się zemścił..:/ wprowadziłem was w błąd pisząc że wyświetla sie suma a wyświetlała się liczba zbliżona do sumy. Mimo wszystko dziekuję za odpowiedzi:) pozdrawiam

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.