Bab 13 · Arduino Uno R3
Sensor Jarak HC-SR04 dengan Arduino Uno
Pasang HC-SR04, ukur jarak dalam sentimeter, dan tangani keadaan ketika sensor tidak menerima pantulan.
Bagaimana jarak dibaca?
HC-SR04 mengirim bunyi ultrasonik dan menunggu pantulannya. Program mengukur lama perjalanan pulang-pergi, lalu mengubah waktu itu menjadi jarak. Sensor ini cocok untuk latihan mendeteksi benda di depan meja. Permukaan miring atau lunak dapat membuat pantulan sulit dibaca.
Komponen dan sambungan
Siapkan Uno R3, HC-SR04, dan empat kabel jumper. Cabut daya sebelum memasang. Ikuti tulisan pin pada modul, bukan urutan warna kabel.
| HC-SR04 | Uno R3 |
|---|---|
| VCC | 5V |
| GND | GND |
| TRIG | 9 |
| ECHO | 10 |
Contoh ini untuk Uno R3 berlogika 5 V. ECHO HC-SR04 mengeluarkan sinyal 5 V; jangan langsung menyalin sambungan ini ke pin board 3,3 V tanpa penyesuaian level tegangan.
Program pengukur jarak
const int TRIG = 9;
const int ECHO = 10;
void setup() {
Serial.begin(9600);
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 durasi = pulseIn(ECHO, HIGH, 30000UL);
if (durasi == 0) {
Serial.println("Pantulan tidak terbaca");
} else {
float jarak = durasi * 0.0343 / 2.0;
Serial.print("Jarak: ");
Serial.print(jarak, 1);
Serial.println(" cm");
}
delay(100);
}Buka Serial Monitor pada 9600 baud. Hadapkan buku datar sekitar 20 cm di depan sensor, lalu geser perlahan. Angka seharusnya mengikuti perpindahan buku, meskipun tidak selalu persis sama dengan penggaris.
Memahami hitungannya
TRIG diberi pulsa 10 mikrodetik untuk memulai pengukuran. pulseIn membaca lama pulsa ECHO dalam mikrodetik. Angka 0.0343 adalah perkiraan kecepatan bunyi dalam cm per mikrodetik pada suhu ruang. Dibagi dua karena bunyi berjalan ke benda lalu kembali. Batas 30000UL membuat program berhenti menunggu setelah 30 milidetik; hasil nol berarti pembacaan gagal, bukan jarak nol.
Kalau angka tidak masuk akal
- Periksa TRIG dan ECHO agar tidak tertukar serta pastikan GND terhubung.
- Coba benda lebar, datar, dan menghadap sensor. Hindari benda terlalu dekat; rentang nominal modul sekitar 2–400 cm.
- Jangan menganggap satu bacaan gagal sebagai benda menempel pada sensor.
Latihan: nyalakan LED_BUILTIN ketika jarak yang valid kurang dari 15 cm, dan matikan saat jaraknya lebih jauh atau pembacaan gagal. Bandingkan bacaan pada 10, 20, dan 30 cm dengan penggaris.
Rujukan
Datasheet HC-SR04 menjelaskan urutan pulsa dan batas pengukuran modul.
Dari waktu ke jarak, langkah demi langkah
Bunyi merambat di udara sekitar 343 meter per detik pada suhu 20 derajat Celsius. Itu setara 0,0343 cm per mikrodetik. Jika pulsa ECHO berlangsung 1166 mikrodetik, bunyi menempuh 1166 dikali 0,0343, atau sekitar 40 cm, tetapi jarak itu adalah pergi dan pulang. Jarak benda hanya setengahnya, yaitu sekitar 20 cm. Itulah alasan rumus di program dibagi dua.
Kecepatan bunyi berubah mengikuti suhu. Kira-kira kecepatannya 331,3 + 0,606 dikali suhu (dalam Celsius) meter per detik. Di ruangan 30 derajat bunyi sekitar 3 persen lebih cepat daripada pada 20 derajat. Untuk latihan sekolah perbedaan itu dapat diabaikan, tetapi untuk pengukuran teliti suhu perlu dikoreksi.
Peran masing-masing bagian modul
HC-SR04 memiliki dua silinder logam. Satu berfungsi sebagai pemancar bunyi 40 kHz, satu lagi sebagai penerima. Frekuensi ini di atas pendengaran manusia sehingga kita tidak mendengarnya. Modul memerlukan 5 V dan menarik arus sekitar 15 mA, aman diambil dari pin 5V Uno. Sudut pengukurannya sempit, kira-kira 15 derajat, sehingga benda di luar kerucut itu tidak terdeteksi.
Contoh kedua: fungsi pengukur dengan rata-rata
const int TRIG = 9;
const int ECHO = 10;
float ukurSekali() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
unsigned long durasi = pulseIn(ECHO, HIGH, 30000UL);
if (durasi == 0) return -1.0;
return durasi * 0.0343 / 2.0;
}
float ukurRata() {
float total = 0;
int sah = 0;
for (int i = 0; i < 5; i++) {
float j = ukurSekali();
if (j > 0) {
total += j;
sah++;
}
delay(30);
}
if (sah == 0) return -1.0;
return total / sah;
}
void setup() {
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop() {
float jarak = ukurRata();
if (jarak < 0) {
Serial.println("Tidak ada pantulan");
} else {
Serial.print(jarak, 1);
Serial.println(" cm");
}
delay(200);
}Penjelasan: ukurSekali() melakukan satu pengukuran dan mengembalikan -1 bila gagal. ukurRata() memanggilnya lima kali dengan jeda 30 milidetik agar gema dari pengukuran sebelumnya hilang, lalu hanya merata-ratakan hasil yang sah. Variabel sah menghitung berapa pengukuran yang berhasil, sehingga pembagiannya benar walaupun satu atau dua pengukuran gagal. Cara ini meredam bacaan loncat-loncat akibat permukaan benda yang tidak rata.
Contoh ketiga: alat bantu parkir dengan LED
Pasang LED melalui resistor 330 ohm ke pin 7, lalu minus LED ke GND. Tambahkan kode berikut di dalam loop() setelah jarak dihitung: if (jarak > 0 && jarak < 20) { digitalWrite(7, HIGH); } else { digitalWrite(7, LOW); }. LED menyala ketika benda berada dalam 20 cm. Jangan lupa pinMode(7, OUTPUT) pada setup(). Syarat jarak > 0 penting agar nilai -1 tanda gagal tidak dianggap sebagai benda yang sangat dekat.
Kesalahan yang sering terjadi
- Hasil selalu 0 atau tidak terbaca. Biasanya salah satu dari VCC, GND, TRIG, atau ECHO longgar. Goyangkan kabel jumper dan lihat apakah nilai berubah.
- Bacaan melompat-lompat. Benda berbentuk bulat, berbulu, atau miring memantulkan bunyi ke arah lain. Uji dengan papan tulis atau buku tebal.
- Dua sensor mengukur bersamaan. Bunyi dari satu sensor dapat diterima sensor lain. Ukur secara bergantian.
- Memakai pin ECHO 5 V pada board 3,3 V. Pada ESP32 atau Raspberry Pi diperlukan pembagi tegangan dua resistor.
- Memasang kabel saat Arduino menyala. Pemasangan sembarangan dapat membuat pin terhubung singkat tanpa disadari. Cabut USB sebelum mengubah rangkaian.
Ringkasan
HC-SR04 mengubah waktu pantulan menjadi jarak. Rumusnya durasi dikali 0,0343 lalu dibagi dua. Selalu tangani kasus durasi nol, dan rata-ratakan beberapa bacaan bila hasilnya kurang stabil.
Soal latihan
- Pulsa ECHO berlangsung 2000 mikrodetik. Berapa jaraknya?
Lihat jawaban
2000 dikali 0,0343 sama dengan 68,6 cm untuk pergi-pulang. Dibagi dua, jaraknya sekitar 34,3 cm.
- Mengapa batas waktu 30000 mikrodetik dipakai pada pulseIn?
Lihat jawaban
Agar program tidak menunggu terlalu lama jika tidak ada pantulan. 30 milidetik cukup untuk jarak sekitar 5 meter.
- Apa gunanya jeda delay(30) di antara pengukuran dalam ukurRata()?
Lihat jawaban
Memberi waktu agar gema dari pulsa sebelumnya mereda sehingga tidak terbaca sebagai pantulan baru.
- Mengapa nilai -1 dipilih sebagai tanda gagal, bukan 0?
Lihat jawaban
Karena jarak sungguhan tidak mungkin negatif, sedangkan 0 bisa dikira benda menempel di sensor.