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.
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
| Pin | Fungsi | Deskripsi |
|---|---|---|
| VCC | Power | Tegangan 5V DC |
| Trig | Trigger | Pin untuk mengirim pulsa ultrasonik |
| Echo | Echo | Pin untuk menerima sinyal pantulan |
| GND | Ground | Pin ground/massa |
Prinsip Kerja Sensor Ultrasonik
Cara Kerja Echolocation
- Pengiriman Sinyal: Sensor mengirimkan burst gelombang ultrasonik 40kHz
- Perjalanan Gelombang: Gelombang merambat melalui udara dengan kecepatan suara
- Pantulan: Gelombang memantul ketika mengenai objek padat
- Penerimaan: Sensor menerima gelombang yang dipantulkan
- Perhitungan: Waktu tempuh digunakan untuk menghitung jarak
Rumus Perhitungan Jarak
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/microsecondfloat soundSpeed = 0.0343; // 343 m/s = 0.0343 cm/µs
// Perhitungan jarakdistance = (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 UnoVCC → 5VGND → GNDTrig → Pin 7Echo → Pin 6Diagram Koneksi
Arduino Uno HC-SR04 5V ──────────── VCC GND ──────────── GND Pin 7 ──────────── Trig Pin 6 ──────────── EchoCatatan 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-SR04const int trigPin = 7;const int echoPin = 6;
// Variables untuk pengukuranlong 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.0343adalah 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 validasiconst int MIN_DISTANCE = 2; // Minimum range sensorconst int MAX_DISTANCE = 400; // Maximum range sensorconst 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 cmconst 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 parametersconst 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 parametersfloat speedOfSound = 343.0; // m/s at 20°Cfloat temperature = 20.0; // Celsiusfloat 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 configurationconst int TRIG_PIN = 7;const int ECHO_PIN = 6;const int TIMEOUT_US = 26000;
// Measurement parametersconst 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
| Level | Nama Proyek | Deskripsi |
|---|---|---|
| Pemula | Parking Sensor | Indikator jarak untuk parkir mobil |
| Pemula | Water Level Monitor | Mengukur ketinggian air dalam tangki |
| Pemula | Automatic Door | Pintu otomatis berdasarkan deteksi jarak |
| Menengah | Robot Obstacle Avoidance | Robot yang menghindari rintangan |
| Menengah | Security System | Alarm berdasarkan deteksi gerakan/jarak |
| Menengah | Distance Datalogger | Perekam data jarak dengan timestamp |
| Lanjutan | 3D Scanner | Sistem scanning objek 3D |
| Lanjutan | Liquid Level Control | Kontrol otomatis pompa berdasarkan level |
| Lanjutan | Multi-zone Detection | Sistem 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:
- Servo Motor Control: Membuat scanner jarak otomatis
- LCD Display: Menampilkan data sensor secara real-time
- Wireless Communication: Mengirim data sensor via WiFi/Bluetooth
- Data Logging: Menyimpan data pengukuran ke SD card
- Advanced Sensors: Sensor LIDAR, ToF, dan teknologi lainnya
Resource Tambahan
- HC-SR04 Datasheet - Spesifikasi teknis lengkap
- Arduino Ping Tutorial - Tutorial resmi Arduino
- Ultrasonic Theory - Teori sensor ultrasonik
- NewPing Library - Library advanced untuk sensor ultrasonik
- Arduino Forum - Sensors - Diskusi komunitas tentang sensor