Sensor Jarak Ultrasonik HC-SR04 ESP32
Sensor ultrasonik HC-SR04 menghitung jarak dengan mengukur waktu yang dibutuhkan gelombang suara yang dipancarkannya untuk memantul dari benda lalu kembali (Time of Flight). Di proyek ini, kita mengirim pulsa 10 mikrodetik dari ESP32 ke pin TRIG sensor dan membaca durasi pantulan dari pin ECHO dengan pulseIn(). Jarak hasil hitung ditampilkan dalam sentimeter di LCD I2C 16x2. Karena HC-SR04 bekerja di 5V, pembagi tegangan wajib dipasang di pin ECHO.

Video
Skema rangkaian

Kode sumber
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Sensor Jarak Ultrasonik HC-SR04 ESP32
4// ─────────────────────────────────────────
5// Memicu HC-SR04 dengan pulsa TRIG, menghitung jarak (cm) dari waktu ECHO
6// dan menampilkannya di LCD I2C 16x2 setiap 0.2 s. Jika tidak ada echo
7// yang kembali, layar menampilkan "Menzil disinda" (di luar jangkauan).
8//
9// Pin:
10// GPIO 5 -> TRIG HC-SR04
11// GPIO 18 -> ECHO HC-SR04 (lewat pembagi tegangan)
12// Pembagi: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13// GPIO 21 -> SDA LCD, GPIO 22 -> SCL LCD
14// HC-SR04 and LCD VCC -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Definisi pin
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18; // Perlu pembagi tegangan 1k + 2k
22
23// Alamat LCD 0x27 atau 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f; // Kecepatan suara (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL; // Timeout echo (~5 m)
28
29void setup() {
30 pinMode(TRIG_PIN, OUTPUT);
31 pinMode(ECHO_PIN, INPUT);
32 digitalWrite(TRIG_PIN, LOW);
33
34 // Pin I2C default DevKit V1
35 Wire.begin(21, 22);
36
37 lcd.init();
38 lcd.backlight();
39
40 // Layar pembuka 3 s
41 lcd.setCursor(3, 0);
42 lcd.print("BlueGrays");
43 lcd.setCursor(1, 1);
44 lcd.print("HC-SR04 v1.0");
45 delay(3000);
46
47 // Layar utama
48 lcd.clear();
49 lcd.setCursor(0, 0);
50 lcd.print("Mesafe:");
51}
52
53// Membaca jarak dalam cm, -1 jika error
54float readDistanceCm() {
55 // Pulsa TRIG 10 us memulai pengukuran
56 digitalWrite(TRIG_PIN, LOW);
57 delayMicroseconds(2);
58 digitalWrite(TRIG_PIN, HIGH);
59 delayMicroseconds(10);
60 digitalWrite(TRIG_PIN, LOW);
61
62 unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63 if (duration == 0) return -1.0f;
64 // Bolak-balik, jadi bagi 2
65 return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69 float distance = readDistanceCm();
70
71 // Hapus baris bawah
72 lcd.setCursor(0, 1);
73 lcd.print(" ");
74 lcd.setCursor(0, 1);
75
76 if (distance < 0) {
77 lcd.print("Menzil disinda");
78 } else {
79 lcd.print(distance, 1); // 1 angka desimal
80 lcd.print(" cm");
81 }
82
83 delay(200);
84}
85
FAQ
Kenapa pembagi tegangan dipasang di jalur ECHO?
HC-SR04 bekerja di 5 V dan pin ECHO mengeluarkan 5 V; input ESP32 paling tinggi menerima 3,3 V. Pembagi tegangan dari resistor 1 kΩ dan 2 kΩ menurunkan 5 V menjadi sekitar 3,3 V, sehingga melindungi ESP32.
Apakah pin TRIG juga butuh pembagi?
Tidak. TRIG adalah sinyal dari ESP32 ke sensor; HIGH 3,3 V dari ESP32 umumnya terdeteksi dengan andal oleh HC-SR04.
Apakah pembagi diperlukan dengan HC-SR04P?
Model seperti HC-SR04P dan RCWL-1601 bisa diberi daya 3,3 V; dalam hal ini output ECHO juga 3,3 V, dan tidak perlu pembagi.
Bagaimana pengukuran jarak bisa dibuat lebih akurat?
Kecepatan suara berubah sesuai suhu (sekitar 343 m/s pada 20 °C). Mengoreksi kecepatan suara dengan sensor suhu dan mengambil median beberapa pengukuran meningkatkan akurasinya.
