Skocz do zawartości

Wahanie odczytu HC-SR04


pelicjan

Pomocna odpowiedź

Witam, jestem posiadaczem Arduino Uno R3 od wczoraj. Przejrzałem kilka tematów, które dotyczyły czujnika HC-SR04, ale nie znalazłem podobnego problemu.

Mój twór wygląda mniej więcej tak:

Zasilanie z USB.

Program:

#include "DHT.h"
#define nadajnik 6
#define odbiornik 7
#define buzzer 2
#define dioda 8

int odleglosc;
long czas_impulsu = 0;
float wilgotnosc;
float temperatura;
DHT dht(9, DHT11);

void setup() {
 Serial.begin(9600);
 dht.begin();
 pinMode(nadajnik, OUTPUT);
 pinMode(odbiornik, INPUT);
 pinMode(dioda, OUTPUT);
}

void loop() {
 digitalWrite(nadajnik, HIGH);
 delayMicroseconds(10);
 digitalWrite(nadajnik, LOW);
 czas_impulsu = pulseIn(odbiornik, HIGH);
 odleglosc = czas_impulsu/58;

 temperatura = dht.readTemperature();
 wilgotnosc = dht.readHumidity();

 Serial.print("Odleglosc: ");
 Serial.print(odleglosc);
 Serial.println("cm");
 Serial.print("Czas impulsu: ");
 Serial.println(czas_impulsu);

 /*if (odleglosc < 2 || odleglosc > 200) Serial.println("Pomiar niedostepny");
 else
 {
   Serial.print("Odleglosc: ");
   Serial.print(odleglosc);
   Serial.println("cm");
 }*/

   /*Serial.print("Temperatura: ");
   Serial.print(temperatura);
   Serial.println("*C");
   Serial.print("Wilgotnosc: ");
   Serial.print(wilgotnosc);
   Serial.println("%");*/

 delay(1000);

 if (odleglosc <= 20 && odleglosc >= 10) tone(buzzer, 2000, 200);
 if (odleglosc < 10)
 {
   tone(buzzer, 3000, 200);
   digitalWrite(dioda, HIGH);
 }
 if (odleglosc > 9) digitalWrite(dioda, LOW);

}

Na potrzeby testów dałem w komentarz część wyświetlającą dane oraz dodałem wyświetlanie odległości w cm i czasu impulsu.

Problem polega na tym, że co jakiś czas wśród prawidłowych odczytów pojawia się odległość około 3200 cm lub 3060 cm, a jako następny zawsze 4 cm.

Na Serial Monitorze wygląda to tak:

...
Odleglosc: 61cm
Czas impulsu: 3595
Odleglosc: 62cm
Czas impulsu: 3605
Odleglosc: 60cm
Czas impulsu: 3491
Odleglosc: 3203cm
Czas impulsu: 185818
Odleglosc: 4cm
Czas impulsu: 241
Odleglosc: 3069cm
Czas impulsu: 178051
Odleglosc: 4cm
Czas impulsu: 239
...

Czym może to być spowodowane? Będę wdzięczny za każdą podpowiedź, ponieważ dopiero się uczę. Z góry dziękuję 🙂

__________

Komentarz dodany przez: Sabre

Link do komentarza
Share on other sites

Wszyscy się uczymy.

Dziwne wyniki mogą być spowodowane wieloma przyczynami:

1. Niestabilnym otoczeniem na które "patrzy" czujnik. Przeszkoda może być za mała lub za słabo odbijająca. Echo jest na granicy czułości i raz jest załapywane prawidłowe a raz dostajesz dopiero to odbite od dalekiej ściany.

2. Problemy z połączeniami/zasilaniem. Czujnik źle zasilany, niepewne połączenia kabelkowe, zakłócenia od silników/serwomechanizmów lub słabe samo źródło zasilania.

3. Pomiary wykonywane zbyt często. Po jednym cyklu - mimo, że echo przyszło szybko, trzeba poczekać (np. 50-100ms) żeby otoczenie ultradźwiękowe się uspokoiło. Raz wysłany sygnał sondujący (ping) może wielokrotnie odbijać się od ścian dając wiele ech wtórnych zakłócających pracę czujnika podczas następnego wyzwolenia.

4. Jakieś ukryte zależności w samym programie. Jeżeli np. coś się zdarzy (przerwanie od timera 0?) między wysłaniem sygnału ping a początkiem pomiaru czasu, to funkcja pulseIn() zostanie wywołana już w czasie trwania impulsu. Wtedy nie zmierzy go i wyjdzie z jakimś domyślnym timeoutem, bo następnego impulsu nie będzie.

Zacznij od przejrzenia połączeń i upewnienia się, że wszystko styka, jest pewnie połączone i zasilane. Jeżeli objawy wzmagają sie lub ustępują przy ruszaniu płytką lub czujnikiem, szukaj dalej. Zmierz zasilania Arduino i czujnika podczas pomiarów.

Potem wstaw opóźnienie np. 0.1s przed lub po pomiarze. Jeśli to coś pomoże, popróbuj z różnymi czasami. Nie ma sensu czekać zbyt długo.

Jeżeli te proste metody zawiodą, wypadałoby uzbroić się w oscyloskop i zobaczyć co naprawdę dzieje się na sygnale powrotnym z czujnika. Jeżeli rzeczywiście pojawiają się tam tak długie impulsy (a wszystko inne - łącznie z przeszkodą jest OK), to albo jest popsuty albo jest coś bardzo nie tak. Porządne narzędzia weryfikują to w ciągu 10 sekund. Napisz jak wypadły próby.

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

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...

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.