Tutorial Belanja komponen

Tutorial › Gas & Udara

Kipas Buang Otomatis saat Asap

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVIN1K2KVCCGNDDOAOMQ-2 + pembagi 1K/2K di AOSRD-05VDCL HDC+DC−INNOCOMNCRelay 1 ch 5V (jumper H)

Saat masak menghasilkan asap atau ada bau gas, MQ-2 mendeteksinya dan ESP32 menyalakan kipas buang lewat relay. Kipas tetap berputar 2 menit setelah udara bersih untuk membuang sisa asap. Dari Klenik kamu bisa mengatur kepekaan atau menyalakan kipas manual.

Sensor dibaca seperti proyek 071 (kenaikan relatif dari udara bersih). Kipas langsung menyala begitu kenaikan melewati batas. Kipas tidak langsung mati saat angka turun: ESP32 menunggu angka tetap di bawah batas selama 2 menit. Asap yang tersisa di sudut ruangan sempat terbuang, dan kipas tidak nyala-mati berulang saat kadar asap di sekitar batas.

Switch Manual mengambil alih kendali. Selama ON, kipas menyala terus dan sensor tidak mengatur apa-apa. Setelah OFF, kendali kembali otomatis.

Keamanan: kipas buang 220V harus disambung ke relay oleh orang yang paham listrik. Untuk belajar, pakai kipas blower 5V dan baterai seperti proyek 028.

Komponen

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Sensor Gas MQ-2 Asap Smoke LPG Methane Gas Detec1Rp21.340
Modul relay 1 channel 5V1Rp17.000
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 61Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp125.315
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
Relay 1 ch 5V (jumper H) DC+→VINoranye
Relay 1 ch 5V (jumper H) DC−→GNDhitam
Relay 1 ch 5V (jumper H) IN→D26 GPIO26biru

Langkah 2: Siapkan dashboard Klenik

Kipasichibot/budi1234/p077/kipas/status
BERPUTAR
0 detik lalu
Asapichibot/budi1234/p077/asap
0 – 20042%
0 detik lalu
Kepekaan (batas)ichibot/budi1234/p077/batas
30%30 of 150%
0 detik lalu
Kipas Manualichibot/budi1234/p077/manual
Manual
0 detik lalu
Riwayat Kipasichibot/budi1234/p077/log
Kipas nyala (ada asap)
Kipas mati (udara bersih)
0 detik lalu

Cara cepat: unduh p077.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
Kipas
ichibot/KODE/p077/kipas/statusON = 1 “BERPUTAR”, OFF = 0
Gauge
Asap
ichibot/KODE/p077/asap0–200 %
Slider Output
Kepekaan (batas)
ichibot/KODE/p077/batas10–150 %
Switch
Kipas Manual
ichibot/KODE/p077/manualpayload ON / OFF
Text Log
Riwayat Kipas
ichibot/KODE/p077/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).

p077.inoUnduh .ino
// Proyek 077 - Kipas Buang Otomatis saat Asap
// 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_KIPAS_STATUS = "ichibot/budi1234/p077/kipas/status";
const char* TOPIK_LOG          = "ichibot/budi1234/p077/log";
const char* TOPIK_BATAS        = "ichibot/budi1234/p077/batas";
const char* TOPIK_MANUAL       = "ichibot/budi1234/p077/manual";
const char* TOPIK_ASAP         = "ichibot/budi1234/p077/asap";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_ASAP = 34, RELAY = 26;
const unsigned long PEMANASAN = 60000;
const unsigned long SISA_PUTAR = 120000;   // kipas tetap jalan 2 menit setelah udara bersih
int dasar = 0, batas = 30;
bool siap = false, kipas = false, manual = false;
unsigned long bersihSejak = 0, terakhir = 0;

int bacaAsap() {
  long jumlah = 0;
  for (int i = 0; i < 20; i++) { jumlah += analogRead(PIN_ASAP); delay(5); }
  return jumlah / 20;
}

void aturKipas(bool v, const char* sebab) {
  if (v == kipas) return;
  kipas = v;
  digitalWrite(RELAY, v ? HIGH : LOW);
  mqtt.publish(TOPIK_KIPAS_STATUS, v ? "1" : "0", true);
  mqtt.publish(TOPIK_LOG, (String(v ? "Kipas nyala" : "Kipas mati") + " (" + sebab + ")").c_str());
}

void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
  String topik = t;
  String p;
  for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
  if (topik == TOPIK_BATAS) batas = p.toInt();
  if (topik == TOPIK_MANUAL) {
    manual = (p == "ON");
    aturKipas(manual, manual ? "manual" : "manual dimatikan");
  }
}

void langganan() {
  mqtt.subscribe(TOPIK_BATAS);
  mqtt.subscribe(TOPIK_MANUAL);
}

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(RELAY, OUTPUT); sambungWiFi(); mqtt.setServer(BROKER, 1883); mqtt.setCallback(pesanMasuk); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); if (millis() - terakhir < 2000) return; terakhir = millis(); int mentah = bacaAsap(); if (!siap) { if (millis() < PEMANASAN) return; dasar = max(mentah, 50); siap = true; } int naik = constrain((mentah - dasar) * 100 / dasar, 0, 500); mqtt.publish(TOPIK_ASAP, String(naik).c_str()); if (manual) return; // mode manual: sensor tidak mengatur kipas if (naik > batas) { bersihSejak = 0; aturKipas(true, "ada asap"); } else if (kipas) { if (bersihSejak == 0) bersihSejak = millis(); if (millis() - bersihSejak > SISA_PUTAR) aturKipas(false, "udara bersih"); } }

Langkah 4: Pahami kodenya

  1. Waktu tambahan setelah udara bersih. Untuk dapur kecil 1 menit cukup, ruangan besar butuh lebih lama.
  2. Mode manual menghentikan logika otomatis. Angka asap tetap dikirim ke dashboard.
  3. Waktu mulai bersih dicatat sekali. Kalau asap naik lagi sebelum 2 menit, bersihSejak dinolkan dan hitungan diulang.