Jika kita sedang membangun proyek smart home atau sistem IoT pendeteksi manusia (human presence)? memilih antara sensor PIR (Passive Infrared) tradisional dan teknologi terbaru Radar mmWave (Millimeter-Wave) pasti menjadi dilema tersendiri.
Untuk mengetahui mana yang terbaik, kita tidak bisa hanya mengandalkan teori di atas kertas. Kita harus mengujinya langsung secara real-time.
Artikel ini akan menyediakan kode program untuk benchmark uji komparasi sensor radar mmWave vs PIR menggunakan mikrokontroler ESP32-C3 Super Mini. Kita akan menguji tiga sensor populer di pasaran saat ini: Waveshare HMMD (mmWave), SR602 (Mini PIR), dan SR513 (PIR Standar) dengan metode pemograman State-Based Retriggerable Timer.
Apa itu konsep State-Based Retriggerable Timer?
State-Based Retriggerable Timer adalah sebuah logika program (software) yang digunakan untuk menjaga agar status saklar atau pemicu (trigger) tetap aktif (bernilai 1) selama sensor mendeteksi adanya objek, dan baru memulai hitung mundur (countdown) untuk mati ketika sensor benar-benar sudah tidak mendeteksi apa-apa (bernilai 0).
Dalam proyek ini, hitungan mundur yang digunakan adalah 60 detik (1 menit). Jika pergerakan dideteksi, maka timer akan selalu bernilai 0 dan state dianggap 1 (lampu menyala). Namun, jika tidak ada pergerakan yang dideteksi, maka timer akan mulai menghitung dari 0 hingga 60 detik. Jika di antara 0 hingga 60 detik tersebut tetap tidak ada pergerakan dan detik ke-60 tercapai, maka state akan dianggap 0 (lampu padam).
Mengapa Data Mentah Sensor Saja Tidak Cukup?
Saat melakukan uji perbandingan, banyak orang langsung menghubungkan output sensor ke pin digital mikrokontroler dan membaca nilainya murni 0 atau 1. Cara ini memicu masalah besar pada pengujian lapangan:
- PIR (SR602 & SR513) bekerja mendeteksi radiasi panas. Sinyal outputnya sering kali fluktuatif (berubah-ubah cepat antara
0dan1) jika manusia di depannya hanya melakukan gerakan kecil seperti mengetik atau bernapas. - Radar mmWave (Waveshare HMMD) sangat sensitif berkat frekuensi radarnya. Sensor ini bahkan bisa mengunci nilai
1secara konstan selama ada orang di dalam ruangan, meskipun orang tersebut diam mematung.
Jika kita menggunakan algoritma interupsi biasa atau rising edge (hanya mendeteksi saat sinyal naik), sistem akan mengira radar mmWave mengalami error karena tidak ada transisi sinyal baru. Di sinilah pentingnya algoritma State-Based Retriggerable Timer.
Sistem State-Based ini memastikan bahwa selama sensor mendeteksi objek (Nilai Mentah = 1), waktu countdown akan terus diperbarui ke posisi nol. Penghitungan mundur delay 1 menit baru benar-benar berjalan setelah area dipastikan kosong (Nilai Mentah kembali ke 0). Metode ini memberikan keadilan penuh bagi ketiga sensor saat performa fisiknya diadu.
Skema Kabel & Pinout ESP32-C3 Super Mini
Sebelum masuk ke kode program, berikut adalah konfigurasi pinout yang digunakan dalam eksperimen ini:
- Waveshare HMMD (OT2/OUT): Dihubungkan ke GPIO 3
- Mini PIR SR602 (OUT): Dihubungkan ke GPIO 1
- PIR Standar SR513 (OUT): Dihubungkan ke GPIO 0
- GND: Semua ground sensor digabungkan ke pin GND ESP32-C3.
Catatan: PIR SR513 menggunakan 5V agar bekerja normal, sedangkan PIR SR602 dan HMMD pakai 3.3V
Kode Program ESP32-C3 untuk Uji Komparasi Sensor (Format CSV)
Kode di bawah ini menggunakan teknik non-blocking dengan fungsi millis(). ESP32-C3 akan membaca kondisi sensor secepat mungkin tanpa interupsi, lalu mengirimkan hasilnya ke Serial Monitor laptop setiap 500ms dalam format CSV (Comma-Separated Values).
// Definisi Pin Sensor pada ESP32-C3
const int pinSR513 = 0;
const int pinSR602 = 1;
const int pinHMMD = 3;
// Durasi Window Retriggerable (1 menit = 60000 ms)
const unsigned long DETECTION_WINDOW = 60000;
// --- Variabel State-Based Timer untuk Sensor HMMD ---
unsigned long lastTriggerHMMD = 0;
bool windowActiveHMMD = false;
int triggerStatusHMMD = 0;
// --- Variabel State-Based Timer untuk Sensor SR602 ---
unsigned long lastTriggerSR602 = 0;
bool windowActiveSR602 = false;
int triggerStatusSR602 = 0;
// --- Variabel State-Based Timer untuk Sensor SR513 ---
unsigned long lastTriggerSR513 = 0;
bool windowActiveSR513 = false;
int triggerStatusSR513 = 0;
// Timer untuk interval pengiriman data ke Serial (500ms)
unsigned long lastPrintTime = 0;
const unsigned long PRINT_INTERVAL = 500;
void setup() {
Serial.begin(115200);
pinMode(pinSR513, INPUT);
pinMode(pinSR602, INPUT);
pinMode(pinHMMD, INPUT);
delay(2000);
// Header CSV untuk Web Serial Plotter / Data Logging Excel
Serial.println("Waktu_Detik,Mentah_HMMD,Mentah_SR602,Mentah_SR513,Trigger_HMMD,Trigger_SR602,Trigger_SR513");
}
void loop() {
unsigned long now = millis();
// 1. Baca Nilai Fisik Sensor Saat Ini (Data Mentah)
bool rawHMMD = digitalRead(pinHMMD);
bool rawSR602 = digitalRead(pinSR602);
bool rawSR513 = digitalRead(pinSR513);
// ==========================================
// LOGIKA STATE-BASED TIMER - HMMD
// ==========================================
if (rawHMMD == HIGH) {
lastTriggerHMMD = now; // Selama bernilai 1, waktu terakhir diperbarui terus
windowActiveHMMD = true;
triggerStatusHMMD = 1; // Status trigger dipaksa selalu 1
} else if (windowActiveHMMD) {
if (now - lastTriggerHMMD >= DETECTION_WINDOW) {
windowActiveHMMD = false;
triggerStatusHMMD = 0;
}
}
// ==========================================
// LOGIKA STATE-BASED TIMER - SR602
// ==========================================
if (rawSR602 == HIGH) {
lastTriggerSR602 = now;
windowActiveSR602 = true;
triggerStatusSR602 = 1;
} else if (windowActiveSR602) {
if (now - lastTriggerSR602 >= DETECTION_WINDOW) {
windowActiveSR602 = false;
triggerStatusSR602 = 0;
}
}
// ==========================================
// LOGIKA STATE-BASED TIMER - SR513
// ==========================================
if (rawSR513 == HIGH) {
lastTriggerSR513 = now;
windowActiveSR513 = true;
triggerStatusSR513 = 1;
} else if (windowActiveSR513) {
if (now - lastTriggerSR513 >= DETECTION_WINDOW) {
windowActiveSR513 = false;
triggerStatusSR513 = 0;
}
}
// ==========================================
// PENGIRIMAN DATA KE SERIAL (Tiap 500ms)
// ==========================================
if (now - lastPrintTime >= PRINT_INTERVAL) {
lastPrintTime = now;
float waktuDetik = now / 1000.0;
// Output Data Terformat CSV
Serial.print(waktuDetik, 3);
Serial.print(",");
Serial.print(rawHMMD);
Serial.print(",");
Serial.print(rawSR602);
Serial.print(",");
Serial.print(rawSR513);
Serial.print(",");
Serial.print(triggerStatusHMMD);
Serial.print(",");
Serial.print(triggerStatusSR602);
Serial.print(",");
Serial.println(triggerStatusSR513);
}
delay(10); // Debounce software ringan
}Cara Menganalisis Data Log Hasil Pengujian
Output program di atas sengaja dipisahkan dengan tanda koma ,. Anda bisa langsung membukanya menggunakan Web Serial Plotter di Google Chrome, atau merekam teksnya menjadi file .csv untuk dianalisis di Microsoft Excel atau Google Sheets.
Berikut poin-poin penting yang harus Anda perhatikan saat membaca grafik datanya:
1. Kecepatan Respons Fisik (Melihat Kolom Mentah_)
Saat kita melangkah masuk ke area jangkauan sensor, lihat kolom mana yang pertama kali melompat dari 0 ke 1. Radar mmWave (HMMD) umumnya mendeteksi gerakan mikro lebih cepat dan radius pembacaan lebih luas dibandingkan sensor PIR yang membutuhkan perubahan radiasi suhu tubuh yang cukup signifikan.
2. Kestabilan Output Software (Melihat Kolom Trigger_)
Coba berdiri diam sepenuhnya di dalam ruangan. Kita akan melihat nilai Mentah_SR602 dan Mentah_SR513 sesekali akan drop menjadi 0 karena tidak membaca gerakan termal yang masif. Namun, berkat logika State-Based, nilai Trigger_ untuk semua sensor akan tetap kokoh di angka 1 dan baru akan mati bersamaan setelah 60 detik pasca-ruangan benar-benar kosong.
Kesimpulan: Mana yang Terbaik untuk Proyek Anda?
Silahkan anda melakukan uji coba yang sama dengan projek ini, dan simpulkan hasilnya. Happy Coding!!!
