Alarm rumah seperti buatan pabrik: sensor magnet di pintu depan dan PIR di ruang tengah. Kalau pintu dibuka, ada waktu 15 detik untuk mematikan alarm dari HP. Gerakan di dalam rumah saat alarm aktif langsung membunyikan sirine.
Dua sensor diperlakukan berbeda, mengikuti cara kerja alarm rumah sungguhan. Pintu depan adalah jalan masuk pemilik rumah, jadi saat pintu dibuka alarm memberi jeda masuk 15 detik, ditandai bip pelan setiap detik. Kalau alarm tidak dimatikan dalam 15 detik, sirine berbunyi.
PIR di dalam rumah tidak diberi jeda. Gerakan saat alarm aktif berarti ada orang yang masuk lewat jalan lain (jendela, atap). Pengecualiannya, selama jeda masuk berjalan, PIR diabaikan supaya pemilik yang baru masuk tidak langsung memicu alarm.
Semua pemicu memakai satu fungsi picu() yang mencatat penyebabnya, sehingga dari Text Log kamu tahu dari mana alarm berasal.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor gerak PIR HC-SR501 | 1 | Rp15.000 |
| MC-38 Reed Switch Magnetic Sensor Door Window Se | 1 | Rp8.500 |
| Modul buzzer aktif KY-012 | 1 | Rp7.500 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 6 | 1 | Rp3.500 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 2 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp113.000 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| PIR HC-SR501 VCC | → | VIN | merah |
| PIR HC-SR501 OUT | → | D27 GPIO27 | kuning |
| PIR HC-SR501 GND | → | GND | hitam |
| Saklar magnet MC-38 (2 kabel) 1 | → | D25 GPIO25 | biru |
| Saklar magnet MC-38 (2 kabel) 2 | → | GND | hitam |
| Modul buzzer aktif KY-012 S | → | D26 GPIO26 | oranye |
| Modul buzzer aktif KY-012 + | → | VIN | merah |
| Modul buzzer aktif KY-012 − | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p117.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Switch Alarm Rumah | ichibot/KODE/p117/siaga | payload ON / OFF |
| Indikator Boolean Sirine | ichibot/KODE/p117/alarm | ON = 1 “BERBUNYI!”, OFF = 0 |
| Text Log Catatan Alarm | ichibot/KODE/p117/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 117 - Alarm Rumah: PIR + Magnet + Sirine
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_ALARM = "ichibot/budi1234/p117/alarm";
const char* TOPIK_LOG = "ichibot/budi1234/p117/log";
const char* TOPIK_SIAGA = "ichibot/budi1234/p117/siaga";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIR = 27, PINTU = 25, SIRINE = 26;
const unsigned long JEDA_MASUK = 15000; // waktu untuk mematikan alarm setelah pintu dibuka
bool siaga = false, berbunyi = false;
unsigned long pintuDibukaPada = 0;
void picu(const char* sebab) {
if (berbunyi) return;
berbunyi = true;
mqtt.publish(TOPIK_ALARM, "1", true);
mqtt.publish(TOPIK_LOG, (String("ALARM: ") + sebab).c_str());
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
siaga = (p == "ON");
berbunyi = false;
pintuDibukaPada = 0;
mqtt.publish(TOPIK_ALARM, "0", true);
mqtt.publish(TOPIK_LOG, siaga ? "Alarm rumah AKTIF" : "Alarm rumah mati");
}
void langganan() {
mqtt.subscribe(TOPIK_SIAGA);
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR, INPUT);
pinMode(PINTU, INPUT_PULLUP);
pinMode(SIRINE, OUTPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (siaga && !berbunyi) {
if (digitalRead(PINTU) == HIGH && !pintuDibukaPada) {
pintuDibukaPada = millis(); // pintu depan: beri waktu untuk mematikan alarm
mqtt.publish(TOPIK_LOG, "Pintu dibuka, 15 detik untuk mematikan alarm");
}
if (pintuDibukaPada && millis() - pintuDibukaPada > JEDA_MASUK) picu("pintu dibuka, alarm tidak dimatikan");
if (digitalRead(PIR) == HIGH && !pintuDibukaPada) picu("gerakan di dalam rumah");
}
bool bip = pintuDibukaPada && !berbunyi && (millis() / 1000) % 2 && (millis() % 1000) < 80; // bip pelan saat menunggu
digitalWrite(SIRINE, (berbunyi && (millis() / 200) % 2) || bip);
}Langkah 4: Pahami kodenya
- Waktu jeda masuk. Alarm pabrikan biasanya 15-30 detik.
- PIR hanya memicu kalau tidak sedang jeda masuk.
- Bip pendek 80 ms setiap 2 detik selama jeda masuk, sebagai pengingat untuk mematikan alarm.