Sensor Ultrasonik HC-SR04 - Mengukur Jarak dengan Arduino

Tutorial lengkap menggunakan sensor ultrasonik HC-SR04 untuk mengukur jarak dengan Arduino, memahami cara kerja, wiring, dan implementasi program.

05-08-2025
20:50 27 Juni 2025
10 min read

Sensor ultrasonik HC-SR04 adalah salah satu sensor paling populer untuk mengukur jarak dalam proyek Arduino. Dengan menggunakan gelombang suara berfrekuensi tinggi, sensor ini dapat mengukur jarak dari 2cm hingga 400cm dengan akurasi yang baik. Mari pelajari cara menggunakan sensor ini untuk berbagai aplikasi pengukuran jarak!

Apa itu Sensor Ultrasonik HC-SR04?

Sensor ultrasonik HC-SR04 adalah sensor jarak non-kontak yang menggunakan gelombang ultrasonik untuk mendeteksi objek dan mengukur jarak. Sensor ini bekerja dengan prinsip echolocation - mengirimkan gelombang suara dan menghitung waktu yang diperlukan untuk menerima pantulan dari objek.

Tujuan Pembelajaran

Setelah menyelesaikan tutorial ini, Anda akan memahami:

  • Prinsip kerja sensor ultrasonik dan teknologi echolocation
  • Spesifikasi dan karakteristik sensor HC-SR04
  • Cara menghubungkan sensor ke Arduino dengan benar
  • Implementasi program untuk membaca data jarak
  • Teknik kalibrasi dan optimasi akurasi sensor
  • Aplikasi praktis sensor ultrasonik dalam berbagai proyek

Spesifikasi Sensor HC-SR04

Karakteristik Teknis

  • Tegangan Kerja: 5V DC
  • Konsumsi Arus: 15mA
  • Frekuensi Ultrasonik: 40kHz
  • Range Pengukuran: 2cm - 400cm
  • Akurasi: ±3mm
  • Sudut Deteksi: 15 derajat
  • Dimensi: 45mm x 20mm x 15mm

Pin Configuration

PinFungsiDeskripsi
VCCPowerTegangan 5V DC
TrigTriggerPin untuk mengirim pulsa ultrasonik
EchoEchoPin untuk menerima sinyal pantulan
GNDGroundPin ground/massa

Prinsip Kerja Sensor Ultrasonik

Cara Kerja Echolocation

  1. Pengiriman Sinyal: Sensor mengirimkan burst gelombang ultrasonik 40kHz
  2. Perjalanan Gelombang: Gelombang merambat melalui udara dengan kecepatan suara
  3. Pantulan: Gelombang memantul ketika mengenai objek padat
  4. Penerimaan: Sensor menerima gelombang yang dipantulkan
  5. Perhitungan: Waktu tempuh digunakan untuk menghitung jarak

Rumus Perhitungan Jarak

Jarak=Waktu Tempuh×Kecepatan Suara2\text{Jarak} = \frac{\text{Waktu Tempuh} \times \text{Kecepatan Suara}}{2}

Dimana:

  • Kecepatan Suara = 343 m/s (pada suhu 20°C)
  • Waktu tempuh dibagi 2 karena gelombang merambat bolak-balik (transmitter → objek → receiver)

Dalam implementasi Arduino:

// Konstanta kecepatan suara dalam cm/microsecond
float soundSpeed = 0.0343; // 343 m/s = 0.0343 cm/µs
// Perhitungan jarak
distance = (duration * soundSpeed) / 2;

Faktor yang Mempengaruhi Akurasi

  • Suhu Udara: Mempengaruhi kecepatan suara
  • Kelembaban: Dapat meredam gelombang ultrasonik
  • Permukaan Objek: Tekstur dan sudut mempengaruhi pantulan
  • Interferensi: Suara lain dapat mengganggu pembacaan

Komponen yang Diperlukan

Hardware Wajib

  • Arduino Uno (atau varian Arduino lainnya)
  • Sensor Ultrasonik HC-SR04
  • Kabel jumper (male-to-male, 4 buah)
  • Breadboard (opsional)
  • Kabel USB untuk programming

Hardware Tambahan (Opsional)

  • LCD Display 16x2 untuk menampilkan hasil
  • Buzzer untuk alarm jarak
  • LED untuk indikator visual
  • Resistor 220Ω (untuk LED)

Software

  • Arduino IDE (sudah terinstall dan dikonfigurasi)

Rangkaian Dasar

Koneksi Sensor ke Arduino

HC-SR04 → Arduino Uno
VCC → 5V
GND → GND
Trig → Pin 7
Echo → Pin 6

Diagram Koneksi

Arduino Uno HC-SR04
5V ──────────── VCC
GND ──────────── GND
Pin 7 ──────────── Trig
Pin 6 ──────────── Echo

Catatan Penting Wiring

  • Jangan terbalik VCC dan GND - dapat merusak sensor
  • Gunakan kabel pendek untuk mengurangi noise
  • Pastikan koneksi kuat untuk pembacaan yang stabil

Program Dasar: Pembacaan Jarak

1. Program Sederhana

// Pin definitions untuk sensor HC-SR04
const int trigPin = 7;
const int echoPin = 6;
// Variables untuk pengukuran
long duration;
int distance;
void setup() {
// Initialize pin modes
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initialize serial communication
Serial.begin(9600);
Serial.println("=== Sensor Ultrasonik HC-SR04 ===");
Serial.println("Memulai pengukuran jarak...");
}
void loop() {
// Trigger sensor untuk mengirim pulsa ultrasonik
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Baca durasi echo
duration = pulseIn(echoPin, HIGH);
// Hitung jarak dalam centimeter
distance = duration * 0.0343 / 2;
// Tampilkan hasil
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
delay(500); // Update setiap 500ms
}

Penjelasan Kode

Pengiriman Trigger Pulse

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
  • Reset trigger pin ke LOW
  • Tunggu 2 microseconds untuk stabilisasi
  • Kirim pulsa HIGH selama 10 microseconds
  • Kembali ke LOW untuk mengakhiri pulsa

Pembacaan Echo

duration = pulseIn(echoPin, HIGH);
  • pulseIn() mengukur durasi sinyal HIGH pada pin echo
  • Return value dalam microseconds

Perhitungan Jarak

distance = duration * 0.0343 / 2;
  • 0.0343 adalah kecepatan suara dalam cm/microsecond
  • Dibagi 2 karena gelombang bolak-balik

Program Lanjutan dengan Validasi

2. Program dengan Error Handling

const int trigPin = 7;
const int echoPin = 6;
// Constants untuk validasi
const int MIN_DISTANCE = 2; // Minimum range sensor
const int MAX_DISTANCE = 400; // Maximum range sensor
const int TIMEOUT_US = 26000; // Timeout untuk pulseIn (400cm)
long duration;
int distance;
int validReadings = 0;
int errorReadings = 0;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
Serial.println("=== Sensor Ultrasonik HC-SR04 dengan Error Handling ===");
}
void loop() {
distance = measureDistance();
if (distance > 0) {
validReadings++;
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
} else {
errorReadings++;
Serial.println("Error: Pembacaan tidak valid");
}
// Tampilkan statistik setiap 20 pembacaan
if ((validReadings + errorReadings) % 20 == 0) {
printStatistics();
}
delay(500);
}
int measureDistance() {
// Trigger sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Baca echo dengan timeout
duration = pulseIn(echoPin, HIGH, TIMEOUT_US);
// Cek apakah pembacaan valid
if (duration == 0) {
return -1; // Timeout
}
// Hitung jarak
int dist = duration * 0.0343 / 2;
// Validasi range
if (dist < MIN_DISTANCE || dist > MAX_DISTANCE) {
return -1; // Out of range
}
return dist;
}
void printStatistics() {
Serial.println("=== Statistik Pembacaan ===");
Serial.print("Valid: ");
Serial.println(validReadings);
Serial.print("Error: ");
Serial.println(errorReadings);
Serial.print("Success Rate: ");
Serial.print((float)validReadings / (validReadings + errorReadings) * 100);
Serial.println("%");
Serial.println();
}

Aplikasi Praktis

3. Sistem Peringatan Jarak

const int trigPin = 7;
const int echoPin = 6;
const int buzzerPin = 8;
const int ledPin = 9;
// Threshold jarak dalam cm
const int DANGER_DISTANCE = 10;
const int WARNING_DISTANCE = 30;
const int SAFE_DISTANCE = 50;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("=== Sistem Peringatan Jarak ===");
Serial.println("Danger: < 10cm | Warning: 10-30cm | Safe: > 30cm");
}
void loop() {
int distance = measureDistance();
if (distance > 0) {
Serial.print("Jarak: ");
Serial.print(distance);
Serial.print(" cm - ");
if (distance < DANGER_DISTANCE) {
// Bahaya - buzzer cepat, LED berkedip cepat
Serial.println("BAHAYA!");
fastAlert();
}
else if (distance < WARNING_DISTANCE) {
// Peringatan - buzzer sedang, LED berkedip sedang
Serial.println("PERINGATAN!");
mediumAlert();
}
else if (distance < SAFE_DISTANCE) {
// Aman - LED nyala terus
Serial.println("Aman");
safeAlert();
}
else {
// Sangat aman - semua mati
Serial.println("Sangat Aman");
noAlert();
}
}
delay(100);
}
int measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 26000);
if (duration == 0) return -1;
return duration * 0.0343 / 2;
}
void fastAlert() {
tone(buzzerPin, 1000, 100);
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
}
void mediumAlert() {
tone(buzzerPin, 800, 200);
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
}
void safeAlert() {
noTone(buzzerPin);
digitalWrite(ledPin, HIGH);
}
void noAlert() {
noTone(buzzerPin);
digitalWrite(ledPin, LOW);
}

4. Pengukuran Jarak dengan Smoothing

const int trigPin = 7;
const int echoPin = 6;
// Smoothing parameters
const int SMOOTHING_SAMPLES = 5;
int readings[SMOOTHING_SAMPLES];
int readIndex = 0;
int total = 0;
int average = 0;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
// Initialize readings array
for (int i = 0; i < SMOOTHING_SAMPLES; i++) {
readings[i] = 0;
}
Serial.println("=== Sensor Jarak dengan Smoothing ===");
}
void loop() {
int currentDistance = measureDistance();
if (currentDistance > 0) {
// Update smoothing buffer
total = total - readings[readIndex];
readings[readIndex] = currentDistance;
total = total + readings[readIndex];
readIndex = (readIndex + 1) % SMOOTHING_SAMPLES;
// Calculate average
average = total / SMOOTHING_SAMPLES;
// Display results
Serial.print("Raw: ");
Serial.print(currentDistance);
Serial.print(" cm | Smooth: ");
Serial.print(average);
Serial.println(" cm");
}
delay(100);
}
int measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 26000);
if (duration == 0) return -1;
return duration * 0.0343 / 2;
}

Kalibrasi dan Optimasi

5. Kalibrasi Sensor untuk Akurasi Tinggi

const int trigPin = 7;
const int echoPin = 6;
// Kalibrasi parameters
float speedOfSound = 343.0; // m/s at 20°C
float temperature = 20.0; // Celsius
float calibrationFactor = 1.0;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
Serial.println("=== Kalibrasi Sensor HC-SR04 ===");
Serial.println("Masukkan suhu ruangan (°C):");
// Wait for temperature input
while (!Serial.available()) {
delay(100);
}
temperature = Serial.parseFloat();
// Adjust speed of sound based on temperature
speedOfSound = 331.4 + (0.6 * temperature);
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println("°C");
Serial.print("Kecepatan suara: ");
Serial.print(speedOfSound);
Serial.println(" m/s");
// Calibration process
Serial.println("\nLetakkan objek pada jarak 30cm dan tekan Enter");
while (Serial.read() != '\n') {
delay(100);
}
calibrateSensor();
}
void loop() {
int distance = measureCalibratedDistance();
if (distance > 0) {
Serial.print("Jarak (terkalibrasi): ");
Serial.print(distance);
Serial.println(" cm");
}
delay(500);
}
void calibrateSensor() {
const int CALIBRATION_SAMPLES = 10;
int totalDistance = 0;
Serial.println("Melakukan kalibrasi...");
for (int i = 0; i < CALIBRATION_SAMPLES; i++) {
int distance = measureRawDistance();
if (distance > 0) {
totalDistance += distance;
}
delay(100);
}
int averageDistance = totalDistance / CALIBRATION_SAMPLES;
calibrationFactor = 30.0 / averageDistance; // Assuming 30cm reference
Serial.print("Faktor kalibrasi: ");
Serial.println(calibrationFactor, 4);
Serial.println("Kalibrasi selesai!\n");
}
int measureRawDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 26000);
if (duration == 0) return -1;
// Use temperature-adjusted speed of sound
float speedCmPerUs = speedOfSound * 100 / 1000000; // Convert to cm/µs
return (duration * speedCmPerUs) / 2;
}
int measureCalibratedDistance() {
int rawDistance = measureRawDistance();
if (rawDistance > 0) {
return rawDistance * calibrationFactor;
}
return -1;
}

Troubleshooting Sensor Ultrasonik

Pembacaan Tidak Stabil

Kemungkinan Penyebab:

  • Interferensi dari sensor lain
  • Kabel terlalu panjang atau tidak terlindungi
  • Power supply tidak stabil

Solusi:

  • Tambahkan delay antar pembacaan
  • Gunakan kabel berpelindung
  • Tambahkan capacitor di power rail
  • Implementasi smoothing/filtering

Jarak Tidak Akurat

Kemungkinan Penyebab:

  • Kalibrasi tidak tepat
  • Faktor lingkungan (suhu, kelembaban)
  • Objek dengan permukaan tidak rata

Solusi:

  • Lakukan kalibrasi ulang
  • Kompensasi suhu
  • Gunakan multiple sample dan averaging

Sensor Tidak Merespons

Kemungkinan Penyebab:

  • Wiring salah atau kabel putus
  • Sensor rusak
  • Tegangan tidak cukup

Solusi:

  • Periksa koneksi dengan multimeter
  • Test dengan program sederhana
  • Pastikan supply 5V stabil

Reading Timeout

Kemungkinan Penyebab:

  • Objek terlalu jauh (>400cm)
  • Tidak ada objek untuk memantulkan gelombang
  • Objek menyerap gelombang ultrasonik

Solusi:

  • Periksa range sensor
  • Gunakan objek dengan permukaan keras
  • Implementasi timeout handling

Best Practices

1. Code Organization

// Sensor configuration
const int TRIG_PIN = 7;
const int ECHO_PIN = 6;
const int TIMEOUT_US = 26000;
// Measurement parameters
const int MIN_DISTANCE = 2;
const int MAX_DISTANCE = 400;
const int SMOOTHING_SAMPLES = 5;
class UltrasonicSensor {
private:
int trigPin, echoPin;
int readings[SMOOTHING_SAMPLES];
int readIndex;
int total;
public:
UltrasonicSensor(int trig, int echo) : trigPin(trig), echoPin(echo), readIndex(0), total(0) {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
for (int i = 0; i < SMOOTHING_SAMPLES; i++) {
readings[i] = 0;
}
}
int measureDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, TIMEOUT_US);
if (duration == 0) return -1;
int distance = duration * 0.0343 / 2;
if (distance < MIN_DISTANCE || distance > MAX_DISTANCE) {
return -1;
}
return distance;
}
int getSmoothedDistance() {
int currentDistance = measureDistance();
if (currentDistance > 0) {
total = total - readings[readIndex];
readings[readIndex] = currentDistance;
total = total + readings[readIndex];
readIndex = (readIndex + 1) % SMOOTHING_SAMPLES;
return total / SMOOTHING_SAMPLES;
}
return -1;
}
};
UltrasonicSensor sensor(TRIG_PIN, ECHO_PIN);
void setup() {
Serial.begin(9600);
}
void loop() {
int distance = sensor.getSmoothedDistance();
if (distance > 0) {
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
}
delay(100);
}

2. Multiple Sensor Management

class MultiSensorManager {
private:
UltrasonicSensor* sensors[4];
int sensorCount;
public:
MultiSensorManager() : sensorCount(0) {}
void addSensor(UltrasonicSensor* sensor) {
if (sensorCount < 4) {
sensors[sensorCount] = sensor;
sensorCount++;
}
}
void readAllSensors() {
for (int i = 0; i < sensorCount; i++) {
int distance = sensors[i]->getSmoothedDistance();
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print(": ");
if (distance > 0) {
Serial.print(distance);
Serial.println(" cm");
} else {
Serial.println("Error");
}
delay(50); // Delay between sensors
}
}
};

Proyek Tantangan

LevelNama ProyekDeskripsi
PemulaParking SensorIndikator jarak untuk parkir mobil
PemulaWater Level MonitorMengukur ketinggian air dalam tangki
PemulaAutomatic DoorPintu otomatis berdasarkan deteksi jarak
MenengahRobot Obstacle AvoidanceRobot yang menghindari rintangan
MenengahSecurity SystemAlarm berdasarkan deteksi gerakan/jarak
MenengahDistance DataloggerPerekam data jarak dengan timestamp
Lanjutan3D ScannerSistem scanning objek 3D
LanjutanLiquid Level ControlKontrol otomatis pompa berdasarkan level
LanjutanMulti-zone DetectionSistem deteksi dengan multiple sensor

Kesimpulan

Sensor ultrasonik HC-SR04 adalah komponen yang sangat berguna untuk berbagai aplikasi pengukuran jarak. Dengan memahami prinsip kerja, karakteristik, dan teknik implementasi yang tepat, dapat dibuat sistem pengukuran jarak yang akurat dan reliable.

Key takeaways dari tutorial ini:

  • Prinsip echolocation memberikan pengukuran non-kontak yang aman
  • Validasi dan error handling penting untuk pembacaan yang reliable
  • Smoothing dan kalibrasi meningkatkan akurasi pengukuran
  • Multiple sensor memungkinkan aplikasi yang lebih kompleks

Sensor ultrasonik membuka banyak kemungkinan untuk proyek automation, robotika, dan monitoring. Eksperimen dengan berbagai konfigurasi dan aplikasi akan membantu memahami potensi penuh sensor ini.

Langkah Selanjutnya

Setelah menguasai sensor ultrasonik, siap untuk:

  1. Servo Motor Control: Membuat scanner jarak otomatis
  2. LCD Display: Menampilkan data sensor secara real-time
  3. Wireless Communication: Mengirim data sensor via WiFi/Bluetooth
  4. Data Logging: Menyimpan data pengukuran ke SD card
  5. Advanced Sensors: Sensor LIDAR, ToF, dan teknologi lainnya

Resource Tambahan