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
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor Gas MQ-2 Asap Smoke LPG Methane Gas Detec | 1 | Rp21.340 |
| Modul relay 1 channel 5V | 1 | Rp17.000 |
| Resistor 1K (isi 10)isi 10, terpakai 1 | 1 | Rp1.800 |
| Resistor 2K (isi 10)isi 10, terpakai 1 | 1 | Rp1.800 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 6 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp125.315 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| MQ-2 + pembagi 1K/2K di AO VCC | → | VIN | merah |
| MQ-2 + pembagi 1K/2K di AO GND | → | GND | hitam |
| MQ-2 + pembagi 1K/2K di AO AO | → | D34 GPIO34 | hijau |
| Relay 1 ch 5V (jumper H) DC+ | → | VIN | oranye |
| Relay 1 ch 5V (jumper H) DC− | → | GND | hitam |
| Relay 1 ch 5V (jumper H) IN | → | D26 GPIO26 | biru |
Langkah 2: Siapkan dashboard Klenik
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.
| Widget | Topic | Setting |
|---|---|---|
| Indikator Boolean Kipas | ichibot/KODE/p077/kipas/status | ON = 1 “BERPUTAR”, OFF = 0 |
| Gauge Asap | ichibot/KODE/p077/asap | 0–200 % |
| Slider Output Kepekaan (batas) | ichibot/KODE/p077/batas | 10–150 % |
| Switch Kipas Manual | ichibot/KODE/p077/manual | payload ON / OFF |
| Text Log Riwayat Kipas | ichibot/KODE/p077/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 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
- Waktu tambahan setelah udara bersih. Untuk dapur kecil 1 menit cukup, ruangan besar butuh lebih lama.
- Mode manual menghentikan logika otomatis. Angka asap tetap dikirim ke dashboard.
- Waktu mulai bersih dicatat sekali. Kalau asap naik lagi sebelum 2 menit,
bersihSejakdinolkan dan hitungan diulang.