MQ-135 peka terhadap gas yang membuat udara ruangan terasa pengap: napas banyak orang, asap rokok, bau cat, amonia. Klenik menampilkan indeks udara dan grafiknya sepanjang hari, beserta status Baik, Sedang, atau Buruk.
MQ-135 bekerja seperti MQ-2 (proyek 071), tetapi lapisannya lebih peka terhadap CO2, amonia, benzena, alkohol, dan asap. Sensor ini tidak bisa membedakan gas mana yang naik. Karena itu yang ditampilkan adalah indeks relatif: berapa persen tegangan sensor naik dibanding patokan udara bersih.
Patokan diambil otomatis 2 menit setelah alat menyala. Kalau saat itu udara ternyata tidak bersih, bawa alat ke dekat jendela terbuka lalu tekan switch Kalibrasi untuk mengambil patokan baru. Indeks di bawah 20 dianggap Baik, 20-60 Sedang, dan di atas 60 Buruk. Batas ini bisa kamu ubah sesuai pengamatan sendiri.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| MQ-135 Sensor Kualitas Udara NH3 NOx CO2 Benzene | 1 | Rp23.500 |
| 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 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp110.475 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| MQ-135 + pembagi 1K/2K di AO VCC | → | VIN | merah |
| MQ-135 + pembagi 1K/2K di AO GND | → | GND | hitam |
| MQ-135 + pembagi 1K/2K di AO AO | → | D34 GPIO34 | hijau |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p073.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 |
|---|---|---|
| Gauge Indeks Udara | ichibot/KODE/p073/indeks | 0–100 |
| Switch Kalibrasi | ichibot/KODE/p073/kalibrasi | payload ON / OFF |
| Chart Grafik Udara | ichibot/KODE/p073/indeks | 0–100 |
| Text Log Status | ichibot/KODE/p073/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 073 - Kualitas Udara Ruangan MQ-135
// 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_LOG = "ichibot/budi1234/p073/log";
const char* TOPIK_KALIBRASI = "ichibot/budi1234/p073/kalibrasi";
const char* TOPIK_INDEKS = "ichibot/budi1234/p073/indeks";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_UDARA = 34; // AO MQ-135 lewat pembagi 1K/2K
const unsigned long PEMANASAN = 120000;
int dasar = 0;
bool siap = false;
String statusTadi = "";
unsigned long terakhir = 0;
int bacaUdara() {
long jumlah = 0;
for (int i = 0; i < 20; i++) { jumlah += analogRead(PIN_UDARA); delay(5); }
return jumlah / 20;
}
String status(int indeks) {
if (indeks < 20) return "Baik";
if (indeks < 60) return "Sedang";
return "Buruk";
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (p == "ON") {
dasar = max(bacaUdara(), 50); // jadikan udara sekarang patokan bersih
mqtt.publish(TOPIK_LOG, ("Patokan udara bersih baru: " + String(dasar)).c_str());
mqtt.publish(TOPIK_KALIBRASI, "OFF");
}
}
void langganan() {
mqtt.subscribe(TOPIK_KALIBRASI);
}
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);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 5000) return;
terakhir = millis();
int mentah = bacaUdara();
if (!siap) {
if (millis() < PEMANASAN) return;
dasar = max(mentah, 50);
siap = true;
}
int indeks = constrain((mentah - dasar) * 100 / dasar, 0, 200);
Serial.printf("Mentah %d, dasar %d, indeks %d\n", mentah, dasar, indeks);
mqtt.publish(TOPIK_INDEKS, String(indeks).c_str());
String s = status(indeks);
if (s != statusTadi) {
statusTadi = s;
mqtt.publish(TOPIK_LOG, ("Udara " + s + " (indeks " + String(indeks) + ")").c_str());
}
}Langkah 4: Pahami kodenya
- MQ-135 dipanaskan 2 menit sebelum patokan diambil. Seperti MQ-2, sensor baru perlu menyala beberapa jam pertama sebelum stabil.
- Switch Kalibrasi mengambil patokan baru kapan saja. Lakukan saat udara memang bersih, misalnya pagi hari dengan jendela terbuka.
- Tiga kategori dari indeks. Angka 20 dan 60 adalah titik awal. Amati beberapa hari, lalu sesuaikan dengan kondisi ruanganmu.