Tutorial Belanja komponen

Tutorial › Gas & Udara

Pengingat Buka Jendela (Udara Pengap)

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVIN1K2KVCCGNDDOAOMQ-135 + pembagi 1K/2K di AOVCCDATAGNDDHT11

Ruang kelas, kamar, atau ruang rapat yang tertutup lama terasa pengap dan bikin mengantuk. Alat ini memantau udara dan kelembapan, lalu mengingatkan lewat Klenik untuk membuka jendela kalau udara pengap bertahan 5 menit.

Dua tanda udara perlu diganti: indeks MQ-135 naik (napas, bau, asap), atau kelembapan udara di atas 80% (ruangan lembap dan berpotensi jamur). DHT11 mengukur kelembapan, MQ-135 dibaca seperti proyek 073.

Pengingat tidak dikirim sesaat setelah angka melewati batas. Kondisinya harus bertahan 5 menit, karena orang lewat atau bau masakan sebentar bukan alasan membuka jendela. Begitu kedua angka kembali normal, indikator padam dan Text Log mencatat udara sudah segar.

Komponen

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
MQ-135 Sensor Kualitas Udara NH3 NOx CO2 Benzene1Rp23.500
Modul sensor DHT111Rp12.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)Rp122.475
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-135 + pembagi 1K/2K di AO VCC→VINmerah
MQ-135 + pembagi 1K/2K di AO GND→GNDhitam
MQ-135 + pembagi 1K/2K di AO AO→D34 GPIO34hijau
DHT11 VCC→3V3merah
DHT11 DATA→D4 GPIO4biru
DHT11 GND→GNDhitam

Langkah 2: Siapkan dashboard Klenik

Jendelaichibot/budi1234/p078/jendela
BUKA JENDELA
0 detik lalu
Indeks Udaraichibot/budi1234/p078/indeks
0 – 10046
0 detik lalu
Kelembapanichibot/budi1234/p078/lembap
010072%
0 detik lalu
Pengingatichibot/budi1234/p078/log
Buka jendela: udara pengap
Udara sudah segar lagi
0 detik lalu

Cara cepat: unduh p078.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
Jendela
ichibot/KODE/p078/jendelaON = 1 “BUKA JENDELA”, OFF = 0
Gauge
Indeks Udara
ichibot/KODE/p078/indeks0–100
Gauge
Kelembapan
ichibot/KODE/p078/lembap0–100 %
Text Log
Pengingat
ichibot/KODE/p078/logmenampilkan teks masuk

Langkah 3: Upload kode

Library: PubSubClient (Nick O'Leary), DHT sensor library (Adafruit), Adafruit Unified Sensor. 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).

p078.inoUnduh .ino
// Proyek 078 - Pengingat Buka Jendela (Udara Pengap)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.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_INDEKS  = "ichibot/budi1234/p078/indeks";
const char* TOPIK_LEMBAP  = "ichibot/budi1234/p078/lembap";
const char* TOPIK_JENDELA = "ichibot/budi1234/p078/jendela";
const char* TOPIK_LOG     = "ichibot/budi1234/p078/log";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
DHT dht(4, DHT11);
const int PIN_UDARA = 34;             // AO MQ-135 lewat pembagi 1K/2K
const unsigned long PEMANASAN = 120000;
const unsigned long TAHAN = 5UL * 60 * 1000;   // pengap harus bertahan 5 menit
const int BATAS_INDEKS = 40, BATAS_LEMBAP = 80;
int dasar = 0;
bool siap = false, pengap = false;
unsigned long pengapSejak = 0, terakhir = 0;

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

void langganan() {}

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); dht.begin(); sambungWiFi(); mqtt.setServer(BROKER, 1883); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); if (millis() - terakhir < 10000) 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); float lembap = dht.readHumidity(); mqtt.publish(TOPIK_INDEKS, String(indeks).c_str()); if (!isnan(lembap)) mqtt.publish(TOPIK_LEMBAP, String(lembap, 0).c_str()); bool sekarang = indeks > BATAS_INDEKS || (!isnan(lembap) && lembap > BATAS_LEMBAP); if (!sekarang) { pengapSejak = 0; } else if (pengapSejak == 0) { pengapSejak = millis(); } if (!pengap && pengapSejak && millis() - pengapSejak > TAHAN) { pengap = true; String sebab = indeks > BATAS_INDEKS ? "udara pengap" : "terlalu lembap"; mqtt.publish(TOPIK_JENDELA, "1", true); mqtt.publish(TOPIK_LOG, ("Buka jendela: " + sebab).c_str()); } else if (pengap && !sekarang) { pengap = false; mqtt.publish(TOPIK_JENDELA, "0", true); mqtt.publish(TOPIK_LOG, "Udara sudah segar lagi"); } }

Langkah 4: Pahami kodenya

  1. Dua batas pemicu. Indeks 40 setara kategori Sedang di proyek 073. Sesuaikan setelah mengamati ruanganmu beberapa hari.
  2. Salah satu kondisi saja sudah cukup untuk dianggap pengap. isnan() mencegah bacaan DHT11 yang gagal ikut memicu.
  3. Pengingat baru dikirim setelah kondisi pengap bertahan 5 menit tanpa putus.