Ruang IoT · IoT

Praktikum Alarm Gerak IoT: ESP32, PIR, Buzzer, dan Event MQTT

Bangun alarm gerak berbasis ESP32 dan PIR dengan buzzer lokal serta event MQTT yang hanya dikirim ketika status berubah.

Penulis
Ruang IoT Admin
Dipublikasikan
12 Agustus 2026
Waktu baca
3 menit

Artikel ini disusun sebagai panduan teknis Ruang IoT. Gunakan daftar isi untuk berpindah antarbagian dan ikuti langkah secara berurutan ketika artikel memuat praktik atau konfigurasi.

Mulai membaca
Ilustrasi tutorial: Praktikum Alarm Gerak IoT: ESP32, PIR, Buzzer, dan Event MQTT
Ilustrasi praktikum Ruang IoT.

PIR HC-SR501 mendeteksi perubahan radiasi inframerah yang diasosiasikan dengan gerakan objek hangat. Praktikum ini menggunakan ESP32 untuk membaca sinyal digital PIR, mengaktifkan buzzer sebagai alarm lokal, dan mengirim event MQTT hanya ketika terjadi perubahan status. Model event-driven ini lebih efisien daripada mengirim status yang sama setiap loop.

Tujuan praktikum

  • Membaca input digital PIR.
  • Menerapkan debouncing berbasis waktu sederhana.
  • Membedakan telemetry berkala dan event.
  • Mengirim event MQTT dengan timestamp relatif perangkat.

Rangkaian

KomponenESP32
OUT PIRGPIO 27
Buzzer aktif kecilGPIO 25 melalui driver bila arus modul memerlukan
GNDGround bersama
VCC PIRIkuti spesifikasi modul yang digunakan

Biarkan PIR melakukan warm-up setelah dinyalakan; beberapa modul memerlukan waktu sebelum output stabil. Hindari menempatkan sensor menghadap sumber panas atau aliran udara panas yang dapat memicu deteksi tidak diinginkan.

Program event-driven

#include <WiFi.h>
#include <PubSubClient.h>

const int PIR_PIN = 27;
const int BUZZER_PIN = 25;
const unsigned long MIN_EVENT_GAP_MS = 3000;

WiFiClient net;
PubSubClient mqtt(net);
// Isi koneksi Wi-Fi dan MQTT seperti pada praktikum MQTT sebelumnya.

int lastStable = LOW;
unsigned long lastEventAt = 0;

void publishMotion(bool active) {
  if (!mqtt.connected()) return;
  char payload[96];
  snprintf(payload, sizeof(payload),
           "{\"motion\":%s,\"uptime_ms\":%lu}",
           active ? "true" : "false", millis());
  mqtt.publish("lab/security/motion", payload);
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);
  // connect Wi-Fi + mqtt.setServer(...) di sini.
}

void loop() {
  mqtt.loop();
  int state = digitalRead(PIR_PIN);

  if (state != lastStable && millis() - lastEventAt >= MIN_EVENT_GAP_MS) {
    lastStable = state;
    lastEventAt = millis();
    digitalWrite(BUZZER_PIN, state == HIGH ? HIGH : LOW);
    publishMotion(state == HIGH);
    Serial.printf("motion=%s\n", state == HIGH ? "DETECTED" : "CLEAR");
  }
}

Pengujian bertahap

  1. Uji PIR tanpa buzzer dan MQTT: lihat HIGH/LOW di Serial.
  2. Tambahkan buzzer, lalu pastikan durasi alarm sesuai kebutuhan.
  3. Tambahkan koneksi MQTT dan monitor topic event.
  4. Lakukan sepuluh kali lintasan dengan jarak dan arah berbeda.
  5. Catat false positive dan false negative.

Pengembangan sistem

Untuk sistem keamanan yang lebih baik, tambahkan mode arm/disarm, cooldown, notifikasi server-side, sensor pintu, dan event log. Jangan menggunakan satu PIR sebagai satu-satunya kontrol keselamatan atau akses kritis karena PIR adalah sensor deteksi gerak, bukan sistem identifikasi.

Kriteria keberhasilan

Event hanya dikirim ketika status berubah, buzzer mengikuti status yang tervalidasi, dan koneksi MQTT yang terputus tidak menghentikan loop pembacaan sensor. Ini menegaskan prinsip penting IoT: fungsi lokal dasar sebaiknya tidak sepenuhnya bergantung pada koneksi cloud.

Referensi resmi dan bacaan lanjut

Gunakan dokumentasi resmi berikut untuk memeriksa API, kompatibilitas board, dan perubahan versi library:

TUTORIAL SELESAI

Sudah memahami alurnya?

Praktikkan konsep yang baru dipelajari melalui project, perangkat ESP32, telemetry, dashboard, atau Virtual Lab di Ruang IoT.

Buka Ruang IoT