HC-SR04 mierzy czas powrotu odbitej fali ultradźwiękowej. To prosty sposób na ćwiczenie pomiaru czasu i budowę wskaźnika odległości. Wynik zależy jednak także od obiektu, kąta ustawienia oraz warunków otoczenia.

Cztery wyprowadzenia

Pin Funkcja
VCC Zasilanie czujnika zgodne z wariantem
GND Masa
Trig Wyzwolenie pomiaru krótkim impulsem
Echo Impuls, którego czas służy do obliczenia odległości

Typowy HC-SR04 pracuje z zasilaniem 5 V i wyjściem Echo o takim poziomie. Nie podłączaj Echo bezpośrednio do wejścia ESP32 lub ESP8266. Potrzebne jest dopasowanie poziomów, np. odpowiednio zaprojektowany dzielnik albo konwerter. Różnice między klasycznym HC-SR04 a wariantami dla niższych napięć przedstawia Adafruit.

Dlaczego czas dzielimy przez dwa

Fala biegnie do przeszkody i wraca do czujnika. Odległość to zatem połowa iloczynu czasu i prędkości dźwięku. W typowych warunkach pokojowych wygodnym przybliżeniem jest:

odległość w cm ≈ czas Echo w mikrosekundach / 58

To przybliżenie, nie kalibracja dla wszystkich temperatur. Miękka tkanina może tłumić odbicie, a skośna powierzchnia skierować je poza czujnik. Brak echa nie powinien być prezentowany jako odległość zero.

Minimalny przykład dla klasycznego UNO 5 V

Poniższy szkic zakłada UNO z ATmega328P, Trig na D9 i Echo na D10. Nie jest schematem bezpośredniego podłączenia do ESP32. Połączenia wykonuj przy odłączonym zasilaniu.

constexpr byte TRIG = 9;
constexpr byte ECHO = 10;

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  digitalWrite(TRIG, LOW);
}

void loop() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  unsigned long czas = pulseIn(ECHO, HIGH, 30000UL);
  if (czas == 0) {
    Serial.println("Brak echa w czasie oczekiwania");
  } else {
    Serial.print(czas / 58.0f, 1);
    Serial.println(" cm");
  }
  delay(100);
}

Limit czasu zapobiega zbyt długiemu oczekiwaniu. pulseIn() zwraca zero, gdy nie otrzyma kompletnego impulsu w określonym czasie; opisuje to dokumentacja Arduino. Przykład wymaga testu na sprzęcie.

Prosty sprawdzian wyników

Ustaw dużą, płaską przeszkodę prostopadle do osi czujnika. Zmierz jej położenie linijką i porównaj serię odczytów. Następnie zmień odległość i kąt. Zapisuj także brak pomiaru, zamiast usuwać go z wyników.

Przy kilku czujnikach wyzwalaj je kolejno, żeby ograniczyć wzajemne zakłócanie. Do sterowania zastosuj filtr i histerezę, a na utratę echa przewidź osobny stan. HC-SR04 w otwartej wersji nie jest automatycznie czujnikiem odpornym na wilgoć ani zabezpieczeniem zapobiegającym kolizji urządzenia.