Skocz do zawartości

Problem z kodem hc-sr04


Pomocna odpowiedź

Napisano

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

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.

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.

Nie powinna być większa bo zapisywane wartości są mniejsze od 200 a jest ich 10. Ale sprawdzę ten trop bo nie kontrolowalem tego może tam się jakiś błąd robi:/

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

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?

Nie bardzo rozumiem:/ byłbym wdzięczny gdybyś rozwinął trochę swoją myśl:) nie jestem jeszcze aż tak obeznany z arduino uczę się dopiero.

Idex tablicy numerujemy od zera, jedziesz po pamięci jak Frog po Warszawie.

Gdzie jest indeksowanie nie od zera?

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...