Tutorial Belanja komponen

Tutorial › Proyek Gabungan

Rumah Aman: Gas, Api, Gerak

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVIN1K2KVCCGNDDOAOMQ-2 + pembagi 1K/2K di AOAOG+DOSensor api KY-026VCCOUTGNDPIR HC-SR501+S+−Modul buzzer aktif KY-012

Satu alat penjaga rumah: MQ-2 untuk kebocoran gas dan asap, sensor api untuk kebakaran, dan PIR untuk penyusup. Gas dan api dijaga 24 jam, sedangkan sensor gerak hanya aktif saat mode Siaga dinyalakan dari HP ketika rumah ditinggal.

Menggabungkan stasiun udara (proyek 080) dan alarm PIR (proyek 119). Yang menarik adalah aturan kapan sensor dianggap bahaya. Gas dan api berbahaya kapan pun, jadi selalu dicek. Gerakan hanya berbahaya kalau rumah sedang kosong, jadi PIR baru dihitung saat mode Siaga aktif. Tanpa aturan ini, alarm berbunyi setiap kali penghuni berjalan di dalam rumah.

Sumber bahaya diberi prioritas: API, lalu GAS/ASAP, lalu GERAKAN. Text Log mencatat jenis bahayanya, dan sirine berbunyi selama bahaya masih ada.

Penting: alat belajar, bukan pengganti detektor asap dan gas bersertifikat.

Komponen

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Sensor Gas MQ-2 Asap Smoke LPG Methane Gas Detec1Rp21.340
Sensor Api Infrared KY-026 Flame Detection Modul1Rp5.500
Sensor gerak PIR HC-SR5011Rp15.000
Modul buzzer aktif KY-0121Rp7.500
Resistor 1K (isi 10)isi 10, terpakai 11Rp1.800
Resistor 2K (isi 10)isi 10, terpakai 11Rp1.800
Breadboard mini 170 titik1Rp4.875
Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 101Rp3.500
Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 61Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp139.815
Daftar komponen proyek ini otomatis masuk ke pesan. Hapus yang sudah kamu punya sebelum dikirim.

Langkah 1: Rangkai komponen

Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.

DariKeKabel
MQ-2 + pembagi 1K/2K di AO VCC→VINmerah
MQ-2 + pembagi 1K/2K di AO GND→GNDhitam
MQ-2 + pembagi 1K/2K di AO AO→D34 GPIO34hijau
Sensor api KY-026 DO→D18 GPIO18ungu
Sensor api KY-026 +→3V3merah
Sensor api KY-026 G→GNDhitam
PIR HC-SR501 VCC→VINmerah
PIR HC-SR501 OUT→D27 GPIO27kuning
PIR HC-SR501 GND→GNDhitam
Modul buzzer aktif KY-012 S→D25 GPIO25oranye
Modul buzzer aktif KY-012 +→VINmerah
Modul buzzer aktif KY-012 −→GNDhitam

Langkah 2: Siapkan dashboard Klenik

Rumahichibot/budi1234/p143/bahaya
BAHAYA!
0 detik lalu
Siaga Maling (rumah kosong)ichibot/budi1234/p143/siaga
Siaga
0 detik lalu
Gas/Asapichibot/budi1234/p143/gas
0 – 2006%
0 detik lalu
Catatanichibot/budi1234/p143/log
BAHAYA: GERAKAN
Kembali aman
BAHAYA: GAS/ASAP
0 detik lalu

Cara cepat: unduh p143.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.

WidgetTopicSetting
Indikator Boolean
Rumah
ichibot/KODE/p143/bahayaON = 1 “BAHAYA!”, OFF = 0
Switch
Siaga Maling (rumah kosong)
ichibot/KODE/p143/siagapayload ON / OFF
Gauge
Gas/Asap
ichibot/KODE/p143/gas0–200 %
Text Log
Catatan
ichibot/KODE/p143/logmenampilkan 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).

p143.inoUnduh .ino
// Proyek 143 - Rumah Aman: Gas, Api, Gerak
// 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_SIAGA  = "ichibot/budi1234/p143/siaga";
const char* TOPIK_BAHAYA = "ichibot/budi1234/p143/bahaya";
const char* TOPIK_LOG    = "ichibot/budi1234/p143/log";
const char* TOPIK_GAS    = "ichibot/budi1234/p143/gas";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_GAS = 34, API = 18, PIR = 27, SIRINE = 25;
const int BATAS_GAS = 40;
int dasar = 0;
bool siap = false, siagaMaling = false;
String bahayaTadi = "";
unsigned long terakhir = 0;

int bacaGas() {
  long jumlah = 0;
  for (int i = 0; i < 20; i++) jumlah += analogRead(PIN_GAS);
  return jumlah / 20;
}

void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
  String p;
  for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
  siagaMaling = (p == "ON");          // sensor gerak hanya dipakai saat rumah ditinggal
}

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(API, INPUT); pinMode(PIR, INPUT); pinMode(SIRINE, OUTPUT); sambungWiFi(); mqtt.setServer(BROKER, 1883); mqtt.setCallback(pesanMasuk); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); if (millis() - terakhir < 500) return; terakhir = millis(); int mentah = bacaGas(); if (!siap && millis() > 60000) { dasar = max(mentah, 50); siap = true; } int gas = siap ? constrain((mentah - dasar) * 100 / dasar, 0, 500) : 0; String bahaya = ""; // gas & api selalu dijaga, gerak hanya saat siaga if (digitalRead(API) == LOW) bahaya = "API"; else if (gas > BATAS_GAS) bahaya = "GAS/ASAP"; else if (siagaMaling && digitalRead(PIR) == HIGH) bahaya = "GERAKAN"; digitalWrite(SIRINE, bahaya.length() && (millis() / 250) % 2); if (bahaya != bahayaTadi) { bahayaTadi = bahaya; mqtt.publish(TOPIK_BAHAYA, bahaya.length() ? "1" : "0", true); mqtt.publish(TOPIK_LOG, bahaya.length() ? ("BAHAYA: " + bahaya).c_str() : "Kembali aman"); } static unsigned long kirim = 0; if (millis() - kirim > 5000) { kirim = millis(); mqtt.publish(TOPIK_GAS, String(gas).c_str()); } }

Langkah 4: Pahami kodenya

  1. PIR hanya dihitung saat mode Siaga aktif. Gas dan api di baris atasnya dicek tanpa syarat.
  2. Teks kosong berarti aman. bahaya.length() dipakai sebagai true/false.