Belajar

Measure distance with an HC-SR04 ultrasonic sensor

Menengah

Atau lihat semua pelajaran.

  • 503komponen di meja kerja
  • 44board sedang berjalan
  • 1.00xwaktu nyata, di semua board
Arduino Uno: sensor parkirlive0.000 s 0.00x
Klik untuk membukanya di editor
Contoh parking: HC-SR04 di pin 7 dan 6, buzzer di 9, dan lampu di 8. Buka di editor dan geser slider sensornya untuk memindahkan dinding.

HC-SR04 adalah sensor yang dipakai di awal setiap kelas, karena tidak ada yang tersembunyi di dalamnya: tanpa bus, tanpa alamat, tanpa library yang harus kamu percayai. Kamu mengirim pulsa, sensor mengirim balik pulsa, dan panjang pulsa kedua itulah jaraknya. Rangkaian di atas menyambungkan sensor ini ke Arduino Uno dan mengubah bacaannya menjadi sensor parkir, dengan buzzer yang berbunyi makin cepat saat dinding makin dekat dan lampu merah saat melewati garis berhenti.

Buka di editor dan geser slider di sensor untuk memindahkan dinding. Serial Monitor mencetak jarak dalam sentimeter dan jeda antarbunyi.

What you need

  • Arduino Uno
  • Sensor ultrasonik HC-SR04
  • Buzzer
  • LED merah dan resistor 220 ohm
  • Breadboard dan kabel jumper

Wiring

Komponen dan pinDisambung keCatatan
HC-SR04 VCC5 VModul ini butuh 4.5 V atau lebih
HC-SR04 GNDGND
HC-SR04 TRIGPin 7Board mengirim ping di pin ini
HC-SR04 ECHOPin 6High selama waktu yang dibutuhkan suara untuk kembali
BuzzerPin 9Kaki lainnya ke GND
LED merah, lewat 220 ohmPin 8Menyala saat melewati garis berhenti

Cara sensor mengukur

Tahan TRIG di high minimal sepuluh mikrodetik, maka modul mengirim semburan singkat suara 40 kHz, lalu membuat ECHO high persis selama waktu yang dibutuhkan suara untuk mencapai benda dan kembali. Suara merambat sekitar 343 meter per detik di suhu ruang, yaitu 0.0343 sentimeter per mikrodetik, dan menempuh perjalanannya dua kali. Jadi jarak dalam sentimeter adalah waktu gema dalam mikrodetik dibagi sekitar 58, angka pembagi yang dipakai setiap sketch HC-SR04.

Komponen di Mokxi mengikuti pengaturan waktu di datasheet: ECHO naik 460 mikrodetik setelah trigger, tetap high 58 mikrodetik per sentimeter, dan kalau tidak ada benda dalam jangkauan, tetap high selama timeout penuh 38 milidetik. Kecepatan suara dihitung dari suhu udara yang bisa kamu atur di komponennya, jadi sketch yang membagi dengan 58 akan membaca dinding berjarak satu meter sebagai 104 sentimeter di titik beku, sama seperti modul sungguhan.

Penjelasan kodenya

Contoh ini membaca sensor lewat helper kecil yang mengirim trigger, mengukur waktu gema, dan mengembalikan milimeter, atau nol kalau tidak ada yang kembali. Kalau ditulis manual dengan pulseIn(), seperti cara kebanyakan tutorial, pengukurannya cuma lima baris.

Perilaku sensor parkirnya ada di satu fungsi. Di bawah 15 sentimeter, buzzer menahan satu nada panjang dan LED menyala. Dari situ sampai dua meter, jeda antarbunyi bertambah secara linear dari 90 milidetik sampai 900. Lebih dari dua meter, buzzer diam. Setiap loop diakhiri tunggu 60 milidetik, dan angka itu penting: datasheet meminta jeda 60 milidetik antar-ping, karena gema dari ping sebelumnya masih memantul di dalam ruangan.

Pengukurannya, seperti yang ditulis kebanyakan tutorial
const int TRIG = 7;
const int ECHO = 6;

long readCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long us = pulseIn(ECHO, HIGH, 38000);
  return us / 58;
}

Coba di editor

Buka rangkaiannya di editor dan pilih sensornya. Properti temperature-nya adalah suhu udara, 20 derajat secara default. Atur ke 0, maka dinding yang sama terbaca beberapa sentimeter lebih jauh, karena suara lebih lambat di udara dingin; atur ke 40, maka terbaca lebih dekat. Sketch-nya tidak berubah, dan sketch sungguhan pun tidak akan berubah.

Berikutnya, ubah delay(60) di akhir setiap cabang loop() menjadi delay(20). Sekarang banyak ping yang tidak terjawab, karena modul masih menunggu gema terakhir hilang dan mengabaikan trigger yang datang terlalu cepat, jadi Serial Monitor mulai mencampur "tidak ada benda dalam jangkauan" dengan jarak yang sebenarnya. Kembalikan ke 60, maka setiap bacaan kembali sungguhan.

Untuk proyek lain dengan rangkaian yang sama, hapus kode buzzer dan cetak jaraknya ke Serial Plotter, maka kamu punya pengukur jarak sederhana.

Common mistakes

Mengirim ping lebih cepat dari setiap 60 milidetik. Bacaan pertama kembali dan sisanya diabaikan, karena modul menolak di-trigger selagi masih mendengarkan. Komponen simulasi melakukan hal yang sama, jadi bug-nya muncul di sini sebelum muncul di mejamu.

Tertukar TRIG dan ECHO. Tidak ada yang rusak, tapi board menunggu pulsa yang tidak pernah datang, dan setiap bacaan bernilai nol atau timeout penuh.

Lupa timeout. Kalau tidak ada benda dalam jangkauan, gemanya berlangsung 38 milidetik, dan pulseIn() tanpa timeout menunggu satu detik penuh sebelum menyerah, yang membuat bagian sketch lainnya terasa macet.

Memercayai milimeter terakhir. HC-SR04 sungguhan paling bagus akurat sampai beberapa milimeter dan bingung dengan permukaan yang lembut atau miring. Bacaan simulasinya tepat, yang berguna untuk mempelajari kodenya tapi lebih ramah daripada di meja kerja.

Menyambung ECHO langsung ke board 3.3 volt. Modul ini mengeluarkan ECHO di 5 volt. Di Uno itu tidak masalah; di ESP32 atau Pico, rangkaian sungguhan butuh pembagi tegangan resistor di jalur itu.

Pertanyaan

Berapa jangkauan HC-SR04?

Sekitar 2 sentimeter sampai 4 meter. Komponen simulasi melaporkan apa pun yang lebih dekat dari 20 milimeter atau lebih jauh dari 4000 sebagai tidak ada benda dalam jangkauan.

Kenapa dibagi 58?

Suara butuh sekitar 29 mikrodetik untuk menempuh satu sentimeter di suhu ruang, dan gemanya menempuh jarak itu dua kali, pergi dan pulang. 29 kali 2 adalah 58.

Bisakah HC-SR04 dipakai dengan ESP32?

Bisa, dengan kode yang sama. Di hardware sungguhan, pin ESP32 tidak tahan 5 volt, jadi pasang pembagi tegangan di ECHO, misalnya 1 k dan 2 k, untuk menurunkannya ke sekitar 3.3 volt.

Apakah simulator memodelkan suaranya juga?

Tidak. Tidak ada sudut pancaran dan tidak ada pantulan dari lingkungan. Komponennya adalah stopwatch yang menahan ECHO di high selama perjalanan pulang-pergi dengan kecepatan suara, dengan jarak yang diatur lewat slider. Itu sudah cukup untuk menulis dan men-debug kode persis seperti berjalan di hardware.

Rakit versi nyatanya

Buka editor, ubah sebuah nilai, dan lihat angkanya ikut berubah. Tidak ada yang perlu dipasang, dan tidak perlu akun.