Sensor Ultrasonik untuk Mengukur Jarak dengan ESP32: Belajar Mikrokontroler (Lesson 1 - Bagian 4)
- Zen System

- Jun 29
- 8 min read
Jika kalian pernah bertanya bagaimana sebuah mobil saat parkir mundur dapat memberikan bunyi peringatan saat jarak belakang sudah mepet. Jawabanya adalah menggunakan sensor ultrasonik.

Sensor ultrasonik adalah alat yang dapat mengukur jarak dengan memancarkan gelombang frekuensi tinggi dan mengkalkulasi jarak dengan menghitung waktu yang dibutuhkan untuk menerima pantulan balik dari frekuensi yang sudah dipancarkan sebelumnya.

Jika dikombinasikan dengan mikrokontroler ESP32, sensor ultrasonik bisa menjadi alat yang sangat membantu dalam pekerjaan sehari-hari seperti, membangun sistem peringatan dini terjadinya banjir, mendeteksi adanya pergerakan, sistem informasi ketersediaan area parkir, dan lain-lain.
Sekilas tentang sensor ultrasonik HC-SR04
Modul sensor ultrasonic HC-SR04 adalah sensor ultrasonic yang murah dan populer untuk mengukur jarak antara 2cm hingga 400cm (dalam prakteknya bisa kurang hari 400cm) dengan margin error sekitar 3mm.
Kelebihan sensor ultrasonik HC-SR04 ini adalah:
Murah
Dapat bekerja di ruangan gelap
Tingkat akurasi yang cukup baik
Mudah diprogram
Jangkauan yang cukup baik
Kekurangan sensor ultrasonik HC-SR04 ini adalah:
Tidak bekerja dengan baik pada material seperti karpet, kain. Karena material tersebut menyerap sinyal dari gelombang ultrasonik.
Terbatas pada sudut (max. 30°) dan jarak.
Terbatas pada kondisi lingkungan seperti suhu udara. Suhu diatas 50° dapat mengganggu kerja sensor.
Tutorial 7: Menghitung Jarak Sebuah Objek dengan Sensor Ultrasonik
Untuk tutorial ini, kita akan belajar bagaimana menghitung jarak sebuah objek dengan sensor ultrasonik HC-SR04 menggunakan mikrokontroler ESP32.
Material yang diperlukan:
Chip ESP32 & kabel data

Sensor ultrasonik HC-SR04

Kabel serabut AWG26
Skema koneksi
Lakukan koneksi material diatas seperti gambar dibawah ini:

Penjelasan koneksi:
Pin Vin dari ESP32 ke Vcc HC-SR04 untuk mengalirkan tegangan 5V ke modul sensor ultrasonik.
Pin Gnd dari ESP32 ke Gnd HC-SR04 untuk koneksi ground ke modul sensor ultrasonik.
Pin GPIO5 dari ESP32 ke Trig HC-SR04 untuk memancarkan sinyal.
Pin GPIO4 dari ESP32 ke Echo HC-SR04 untuk menerima sinyal.
Coding
Masukkan kode perintah seperti dibawah ini:
int pin_trigger = 33;
int pin_echo = 32;
#define KECEPATAN_SUARA 0.034
long durasi;
float jarak_dalam_cm;
void setup() {
Serial.begin(9600);
pinMode(pin_trigger, OUTPUT);
pinMode(pin_echo, INPUT);
}
void loop() {
digitalWrite(pin_Trigger, LOW);
delayMicroseconds(2);
digitalWrite(pin_trigger, HIGH);
delayMicroseconds(10);
digitalWrite(pin_trigger, LOW);
durasi = pulseIn(pin_echo, HIGH);
jarak_dalam_cm = (durasi * KECEPATAN_SUARA)/2;
Serial.print("Jarak: ");
Serial.print(jarak_dalam_cm);
Serial.println(" cm");
delay(1000);
}Upload kode tersebut ke ESP32.
Hasil
Setelah kode program di upload, mikrokontroler ESP32 akan meng-update jarak yang diberikan oleh sensor ultrasonik per 1 detik.

Perhitungan jarak suatu benda cukup akurat. Hasil pengukuran sebuah benda yang jaraknya sekitar 20 cm menggunakan penggaris hampir sama dengan hasil perhitungan yang sudah diprogram ke mikrokontroler.


Penjelasan Kode Program
int pin_trigger = 33;
int pin_echo = 32;
#define KECEPATAN_SUARA 0.034
long durasi;
float jarak_dalam_cm;Kode program diatas memiliki penjelasan:
Buat variabel bernama pin_trigger dengan nilai 33, yang berarti menetapkan GPIO33 untuk pin trigger (pemancar) sinyal.
Buat variabel bernama pin_echo dengan nilai 32, yang berarti menetapkan GPIO32 untuk pin echo (penerima) sinyal.
Buat variabel konstan bernama KECEPATAN_SUARA dengan nilai baku 3.43 m/d atau dikonversi ke cm/mikro detik menjadi 0.034.
Buat variabel bernama durasi, yang nanti akan digunakan untuk menampung berapa lama pantulan dari sinyal yang dipancarkan diterima.
Buat variabel bernama jarak_dalam_cm yang nanti akan digunakan untuk menampung nilai hasil dari kalkukasi nilai variabel durasi dikalikan nilai variabel KECEPATAN_SUARA lalu dibagi 2.
void setup() {
Serial.begin(9600);
pinMode(pin_trigger, OUTPUT);
pinMode(pin_echo, INPUT);
}Di dalam function setup(), kode perintah diatas memiliki penjelasan:
Set komunikasi antar hardware di kanal 9600.
Set mode pin_trigger (GPIO33) ke mode output.
Set mode pin_echo (GPIO32) ke mode input.
void loop() {
digitalWrite(pin_Trigger, LOW);
delayMicroseconds(2);
digitalWrite(pin_trigger, HIGH);
delayMicroseconds(10);
digitalWrite(pin_trigger, LOW);
durasi = pulseIn(pin_echo, HIGH);
jarak_dalam_cm = (durasi * KECEPATAN_SUARA)/2;
Serial.print("Jarak: ");
Serial.print(jarak_dalam_cm);
Serial.println(" cm");
delay(1000);
}Di dalam function loop(), kode perintah diatas memiliki penjelasan:
Perintah digitalWrite(pin_trigger, HIGH), berarti pancarkan gelombang ultrasonik.
Perintah digitalWrite(pin_trigger, LOW), berarti berhenti pancarkan gelombang ultrasonik.
Perintah delayMicroseconds(10), berarti mikrokontroler berhenti bekerja sejenak selama 10 mikro detik. 1 detik sama dengan 1,000,000 mikro detik.
Perintah durasi = pulseIn(pin_echo, HIGH), berarti variabel durasi akan menampung lama waktu yang diperlukan pin_echo untuk menerima sinyal pantulan dari pin_trigger dengan satuan mikro detik.
Perintah jarak_dalam_cm = (durasi * KECEPATAN_SUARA)/2, berarti hitung jarak dengan menggunakan rumus tersebut dan ditampung ke variabel jarak_dalam_cm.
Sisa perintah selanjutnya berarti informasikan jarak tersebut dalam bentuk teks dan berhenti sejenak selama 1 detik.
Tutorial 8: Membunyikan Bell dan Led Otomatis Jika Jarak Objek di Batas Minimum
Tutorial kali ini kita akan mencoba lebih jauh bagaimana sensor ultrasonik ini dapat berguna dalam penerapan kehidupan sehari-hari seperti mendeteksi keberadaan sebuah objek. Kita akan mencoba membuat sistem keamanan untuk mendeteksi keberadaan seseorang atau sebuah objek. Berikut contoh skenario sederhana untuk sistem deteksi objek:
Jika sensor ultrasonik mendeteksi sebuah objek dengan jarak kurang dari / sama dengan 5 cm, maka mikrokontroler akan mengaktivasikan tanda bahaya dengan membunyikan buzzer peringatan disertai dengan lampu led merah menyala.
Jika sensor ultrasonik mendeteksi sebuah objek dengan jarak antara 5 cm hingga 10 cm, maka mikrokontroler akan menyalakan lampu led berwarna kuning. Menandakan tanda waspada karena terdeteksi objek di area sekitar.
Jika sensor ultrasonik mendeteksi sebuah objek dengan jarak antara 10 cm hingga 30 cm, maka mikrokontroler akan menyalakan lampu led hijau. Menandakan bahwa terdeteksi objek disekitar area tetapi masih dalam jarak aman.
Dan terakhir dengan tambahan Push On Button, yang dapat mengaktifkan dan me-nonaktifkan sistem deteksi objek ini. Untuk kondisi awal sistem deteksi objek adalah non-aktif. Jika tombol Push On ditekan, maka sistem deteksi objek akan aktif ditandai dengan lampu led kuning dan hijau berkedip 3 kali. Dan jika tombol Push On ditekan lagi maka sistem deteksi objek akan kembali non-aktif ditandai dengan lampu led merah dan kuning berkedip 3 kali.
Bagaimana mengenai skenarionya? Cukup menantang bukan. Biasanya skenario ini bisa diterapkan di command center pada pos keamanan (pos security) untuk menjaga keamanan di area sekitar. Mari langsung kita coba tutorialnya.
Material yang diperlukan:
Chip ESP32 & kabel data

Sensor ultrasonik HC-SR04

Piezo Buzzer

Lampu led merah, kuning, hijau

3 x Resistor 220 ohm

Tombol Push On dengan resistor 10K

Custom housing

Kabel serabut AWG26
Skema koneksi
Lakukan koneksi material diatas seperti gambar dibawah ini:

Jika kalian sudah membeli paket Lesson Kit langsung dari Zen System, maka material sensor, buzzer, tombol, led dan mikrokontroler setelah dirakit akan terlihat seperti dibawah ini.

Coding
Masukkan kode perintah seperti dibawah ini:
int pin_trigger = 33;
int pin_echo = 32;
int pin_tombol = 13;
//status sistem untuk menyalakan / mematikan sistem.
//1 berarti sistem aktif. 2 berarti sistem tidak aktif.
int status_sistem = 0;
int pin_led_merah = 4;
int pin_led_kuning = 2;
int pin_led_hijau = 5;
int pin_buzzer = 15;
int status_kedip = 0;
int jarak_deteksi_min = 10;
int jarak_deteksi_max = 30;
int jarak_berbahaya = 5;
//4: status aman ; 3: objek terdeteksi, masih jarak aman ;
//2: objek terdeteksi, status waspada ;
//1: objek terdeteksi, status berbahaya ;
int status_keamanan = 4;
//standar kecepatan suara dalam satuan cm/mikro detik
#define KECEPATAN_SUARA 0.034
void setup() {
Serial.begin(9600);
pinMode(pin_trigger, OUTPUT);
pinMode(pin_echo, INPUT);
pinMode(pin_led_merah, OUTPUT);
pinMode(pin_led_kuning, OUTPUT);
pinMode(pin_led_hijau, OUTPUT);
digitalWrite(pin_led_merah, LOW);
digitalWrite(pin_led_kuning, LOW);
digitalWrite(pin_led_hijau, LOW);
pinMode(pin_buzzer, OUTPUT);
pinMode(pin_tombol, INPUT);
}
void loop() {
if (status_sistem == 1) {
float jarak_objek = monitorObjek();
if (jarak_objek >= jarak_deteksi_min && jarak_objek <= jarak_deteksi_max) {
Serial.println("Objek terdeteksi jarak aman!!!");
status_keamanan = 3;
} else if (jarak_objek > jarak_berbahaya && jarak_objek <jarak_deteksi_min) {
Serial.println("Objek terdeteksi jarak waspada!!");
status_keamanan = 2;
} else if (jarak_objek <= jarak_berbahaya) {
Serial.println("Objek terdeteksi jarak berbahaya!! Buzzer dinyalakan.");
status_keamanan = 1;
} else if (jarak_objek > jarak_deteksi_max) {
status_keamanan = 4;
}
}
indikatorStatus(status_keamanan);
int v = digitalRead(pin_tombol);
if (v == HIGH) {
if (status_sistem == 1) {
Serial.println("Sistem keamanan mati!");
status_sistem = 0;
indikatorSistem(status_sistem);
} else if (status_sistem == 0) {
Serial.println("Sistem keamanan nyala!");
status_sistem = 1;
indikatorSistem(status_sistem);
}
}
delay(200);
}
float monitorObjek() {
digitalWrite(pin_trigger, LOW);
delayMicroseconds(2);
digitalWrite(pin_trigger, HIGH);
delayMicroseconds(10);
digitalWrite(pin_trigger, LOW);
long durasi = pulseIn(pin_echo, HIGH);
float jarak_dalam_cm = (durasi * KECEPATAN_SUARA)/2;
Serial.print("Jarak: ");
Serial.print(jarak_dalam_cm);
Serial.println(" cm");
return jarak_dalam_cm;
}
void indikatorSistem(int status) {
if (status == 1) {
for (int i=0; i<3; i++) {
digitalWrite(pin_led_kuning, HIGH);
digitalWrite(pin_led_hijau, HIGH);
delay(200);
digitalWrite(pin_led_kuning, LOW);
digitalWrite(pin_led_hijau, LOW);
delay(200);
}
} else if (status == 0) {
for (int i=0; i<3; i++) {
digitalWrite(pin_led_merah, HIGH);
digitalWrite(pin_led_kuning, HIGH);
delay(200);
digitalWrite(pin_led_merah, LOW);
digitalWrite(pin_led_kuning, LOW);
delay(200);
}
}
}
void indikatorStatus(int status) {
if (status == 4) {
digitalWrite(pin_led_merah, LOW);
digitalWrite(pin_led_kuning, LOW);
digitalWrite(pin_led_hijau, LOW);
buzzerMati();
} else if (status == 3) {
digitalWrite(pin_led_merah, LOW);
digitalWrite(pin_led_kuning, LOW);
digitalWrite(pin_led_hijau, HIGH);
buzzerMati();
} else if (status == 2) {
digitalWrite(pin_led_merah, LOW);
digitalWrite(pin_led_kuning, HIGH);
digitalWrite(pin_led_hijau, LOW);
buzzerMati();
} else if (status == 1) {
digitalWrite(pin_led_merah, HIGH);
digitalWrite(pin_led_kuning, LOW);
digitalWrite(pin_led_hijau, LOW);
if (status_kedip == 0) {
buzzerNyala();
status_kedip = 1;
} else {
buzzerMati();
status_kedip = 0;
}
}
}
void buzzerNyala() {
ledcAttachPin(pin_buzzer, 0);
ledcWriteNote(0, NOTE_F, 4);
}
void buzzerMati() {
ledcDetachPin(pin_buzzer);
}Tanda // pada coding berarti adalah sebuah komentar atau informasi. Tanda // tidak akan dieksekusi oleh mikrokontroler. Biasanya tanda tersebut digunakan oleh programmer untuk menuliskan komentar / catatan.
Upload kode tersebut ke ESP32.
Hasil
Penjelasan Kode Program
Untuk coding pada bagian deklarasi variabel hingga function setup(), tidak perlu dijelaskan lagi. Karena jika kalian mengikuti tutorial dari bagian 1, maka kalian sudah mengerti semua.
Sedangkan untuk function loop(), memiliki beberapa bagian perintah.
if (status_sistem == 1) {
....
}Perintah diatas adalah sebuah logika percabangan. Dimana jika status_sistem == 1 yang berarti sistem deteksi aktif, maka eksekusi perintah yang ada didalamnya. Dan jika status_sistem != 1 berarti sistem deteksi non-aktif dan perintah-perintah didalamnya tidak akan dieksekusi.
tanda == dalam perbandingan adalah salah satu operand yang berarti sama dengan. Beberapa operand lainnya adalah seperti != yang berarti tidak sama dengan, > yang berarti lebih besar, < yang berarti lebih kecil.
float jarak_objek = monitorObjek();Perintah diatas berfungsi untuk menampung nilai dari function monitorObjek(), yang ditampung dengan variabel bernama jarak_objek. Function monitorObjek() sendiri adalah function custom (atau biasa disebut user-defined function). Dalam tutorial ini kita memiliki 5 user-defined function (UDF). Masing-masing UDF ini memiliki tugas sendiri-sendiri dan karena itu function ini jadi lebih mudah dikelola untuk pengembangan alur logikanya.
Sekilas mengenai User-Defined Function
User-Defined Function (UDF) adalah blok kode khusus yang dibuat oleh programmer untuk melakukan fungsi / tugas tertentu. UDF sendiri utamanya digunakan karena sifat modularitasnya, re-useability (dapat digunakan berkali-kali) dan mempermudah membaca kode-kode perintah yang besar, dan membuatnya lebih terstruktur.
UDF dalam mikrokontroler ESP32 sendiri memiliki 2 tipe. Yaitu Value-Returning Function dan Void Function.
Value-Returning Function adalah function yang saat dieksekusi akan memproses suatu tugas dan setelah itu akan memberikan nilai balik. Sedangkan Void Function adalah function yang saat dieksekusi akan memproses suatu tugas namun tidak memberikan nilai balik.
Dalam tutorial ini function monitorObjek() adalah Value-Returning Function akan memberikan nilai balik yaitu jarak sebuah objek.
if (jarak_objek >= jarak_deteksi_min && jarak_objek <= jarak_deteksi_max) {
Serial.println("Objek terdeteksi jarak aman!!!");
status_keamanan = 3;
}
else if (jarak_objek > jarak_berbahaya && jarak_objek <jarak_deteksi_min) {
Serial.println("Objek terdeteksi jarak waspada!!");
status_keamanan = 2;
}
else if (jarak_objek <= jarak_berbahaya)
{
Serial.println("Objek terdeteksi jarak berbahaya!! Buzzer dinyalakan.");
status_keamanan = 1;
}
else if (jarak_objek > jarak_deteksi_max)
{
status_keamanan = 4;
}Kode perintah diatas adalah untuk menentukan nilai variabel jarak_objek masuk kedalam kondisi apa. Jadi ada 4 kriteria kondisi dengan penjelasan sebagai berikut:
Kondisi pertama jika jarak_objek antara 10 cm (nilai variabel jarak_deteksi_min) hingga 30 cm (nilai variabel jarak_deteksi_max) maka set nilai variabel status_keamanan = 3.
Kondisi kedua jika jarak_objek antara 6 hingga 9 maka set nilai variabel status_keamanan = 2.
Kondisi ketiga jika jarak_objek adalah 5 cm ke bawah maka set nilai variabel status_keamanan = 1.
Dan kondisi keempat jika jarak_objek adalah diatas 30 cm maka set nilai variabel status_keamanan = 4.
indikatorStatus(status_keamanan);
Setelah menentukan kondisi, maka perintah selanjutnya adalah indikatorStatus(status_keamanan), bertugas untuk mengupdate kondisi lampu led dan buzzer.
Function indikatorStatus() sendiri adalah function tipe Void Function yang hanya akan mengerjakan blok perintah didalamnya tanpa memberikan nilai balik.
int v = digitalRead(pin_tombol);
if (v == HIGH) {
if (status_sistem == 1) {
Serial.println("Sistem keamanan mati!");
status_sistem = 0;
indikatorSistem(status_sistem);
} else if (status_sistem == 0) {
Serial.println("Sistem keamanan nyala!");
status_sistem = 1;
indikatorSistem(status_sistem);
}
}
}Terakhir perintah diatas adalah untuk mengetahui apakah tombol Push On ditekan atau tidak. Jika tombol tersebut ditekan maka nilai variabel v menjadi HIGH. Dan jika nilai v == HIGH (v sama dengan HIGH), maka switch status sistem.
Comments