Saklar magnet MC-38 dipasang di jendela. Saat alarm diaktifkan dari HP dan jendela dibuka, buzzer berbunyi terus dan Klenik mencatat kejadiannya. Bunyi hanya berhenti kalau alarm dimatikan dari HP. Menutup jendela kembali tidak menghentikannya.
MC-38 dibaca seperti proyek 088: magnet dekat berarti LOW (tertutup), magnet jauh berarti HIGH (terbuka). Status jendela selalu dikirim, entah alarm aktif atau tidak, jadi kamu tetap tahu jendela mana yang lupa ditutup.
Kalau jendela dibuka saat switch Siaga aktif, variabel berbunyi menjadi true dan tetap true walaupun jendela ditutup lagi. Ini prinsip alarm sungguhan: penyusup tidak bisa menghentikan sirine hanya dengan menutup jendela. Satu-satunya cara mematikannya adalah switch Siaga.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| MC-38 Reed Switch Magnetic Sensor Door Window Se | 1 | Rp8.500 |
| Modul buzzer aktif KY-012 | 1 | Rp7.500 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 2 | 1 | Rp3.500 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp65.000 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Saklar magnet MC-38 (2 kabel) 1 | → | D5 GPIO14 | biru |
| Saklar magnet MC-38 (2 kabel) 2 | → | G | hitam |
| Modul buzzer aktif KY-012 S | → | D2 GPIO4 | kuning |
| Modul buzzer aktif KY-012 + | → | 3V | merah |
| Modul buzzer aktif KY-012 − | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p115.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 Siaga | ichibot/KODE/p115/siaga | payload ON / OFF |
| Indikator Boolean Jendela | ichibot/KODE/p115/jendela | ON = 1 “TERBUKA”, OFF = 0 |
| Indikator Boolean Sirine | ichibot/KODE/p115/alarm | ON = 1 “BERBUNYI!”, OFF = 0 |
| Text Log Catatan | ichibot/KODE/p115/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: NodeMCU 1.0 (ESP-12E 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 115 - Alarm Jendela Sensor Magnet
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.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/p115/alarm";
const char* TOPIK_LOG = "ichibot/budi1234/p115/log";
const char* TOPIK_SIAGA = "ichibot/budi1234/p115/siaga";
const char* TOPIK_JENDELA = "ichibot/budi1234/p115/jendela";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int JENDELA = D5, SIRINE = D2;
bool siaga = false, berbunyi = false, terbukaTadi = false;
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");
if (!siaga && berbunyi) {
berbunyi = false;
mqtt.publish(TOPIK_ALARM, "0", true);
}
mqtt.publish(TOPIK_LOG, siaga ? "Alarm jendela AKTIF" : "Alarm jendela 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(JENDELA, INPUT_PULLUP);
pinMode(SIRINE, OUTPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool terbuka = digitalRead(JENDELA) == HIGH; // magnet menjauh = jendela dibuka
if (terbuka != terbukaTadi) {
terbukaTadi = terbuka;
mqtt.publish(TOPIK_JENDELA, terbuka ? "1" : "0", true);
if (terbuka && siaga && !berbunyi) {
berbunyi = true; // terus bunyi walau jendela ditutup lagi
mqtt.publish(TOPIK_ALARM, "1", true);
mqtt.publish(TOPIK_LOG, "JENDELA DIBUKA saat alarm aktif!");
}
}
digitalWrite(SIRINE, berbunyi && (millis() / 250) % 2);
}Langkah 4: Pahami kodenya
- Alarm "mengunci": sekali terpicu, sirine terus berbunyi sampai dimatikan dari HP.
- Bunyi putus-putus 4 kali per detik, lebih menarik perhatian daripada bunyi panjang.