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.
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.
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
| Komponen | ESP32 |
|---|---|
| OUT PIR | GPIO 27 |
| Buzzer aktif kecil | GPIO 25 melalui driver bila arus modul memerlukan |
| GND | Ground bersama |
| VCC PIR | Ikuti 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
- Uji PIR tanpa buzzer dan MQTT: lihat HIGH/LOW di Serial.
- Tambahkan buzzer, lalu pastikan durasi alarm sesuai kebutuhan.
- Tambahkan koneksi MQTT dan monitor topic event.
- Lakukan sepuluh kali lintasan dengan jarak dan arah berbeda.
- 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:
Sudah memahami alurnya?
Praktikkan konsep yang baru dipelajari melalui project, perangkat ESP32, telemetry, dashboard, atau Virtual Lab di Ruang IoT.