top of page

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

  • Writer: Zen System
    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 HC-SR04
Sensor Ultrasonik HC-SR04

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.


Cara kerja sensor ultrasonik
Cara kerja sensor ultrasonik

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:

  1. Chip ESP32 & kabel data


  2. Sensor ultrasonik HC-SR04


  3. 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.

Sensor ultrasonik meng-update jarak per 1 detik.
Sensor ultrasonik meng-update jarak 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.


Sensor ultrasonik mengukur jarak sebuah benda yang ada didepannya. Angka di penggaris menunjukkan 20 cm.
Sensor ultrasonik mengukur jarak sebuah benda yang ada didepannya. Angka di penggaris menunjukkan 20 cm.

Hasil perhitungan jarak oleh ESP32 dengan sensor ultrasonik HC-SR04
Hasil perhitungan jarak oleh ESP32 dengan sensor ultrasonik HC-SR04

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:

  1. Chip ESP32 & kabel data


  2. Sensor ultrasonik HC-SR04


  3. Piezo Buzzer

  4. Lampu led merah, kuning, hijau

  5. 3 x Resistor 220 ohm


  6. Tombol Push On dengan resistor 10K

  7. Custom housing

  8. 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


zen audio logo

Est. Since 2016

bottom of page