Stasiun cuaca halaman rumah: suhu dan kelembapan (DHT22), tekanan udara (BMP280), terang cahaya matahari (BH1750), dan hujan (papan hujan). Ada juga ramalan sederhana dari perubahan tekanan udara per jam, cara yang sama dengan barometer kuno.
Empat sensor dari bab-bab sebelumnya bekerja bersama. BMP280 dan BH1750 sama-sama I2C, dan keduanya bisa dipasang di dua kabel yang sama (SDA 21, SCL 22) karena alamatnya berbeda (0x76 dan 0x23). Inilah kelebihan I2C: banyak sensor, tetap dua kabel. DHT22 lebih teliti daripada DHT11 untuk cuaca luar ruangan, dan papan hujan dibaca analog di GPIO34.
Tekanan udara yang turun lebih dari 1 hPa dalam satu jam biasanya tanda awan hujan mendekat, sedangkan tekanan yang naik tanda cuaca membaik. Setiap jam, tekanan dibandingkan dengan satu jam sebelumnya dan hasil ramalannya dikirim ke Text Log.
Pasang sensor di tempat teduh berventilasi, misalnya di dalam kotak berkisi. DHT22 yang terkena matahari langsung akan membaca suhu jauh lebih tinggi daripada suhu udara sebenarnya.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor DHT22 (AM2302) + kabel | 1 | Rp32.000 |
| Sensor tekanan BMP280 (GY-BMP280) | 1 | Rp16.000 |
| Sensor cahaya BH1750 (GY-30) | 1 | Rp19.400 |
| Rain Drop Sensor Pendeteksi Hujan Tetesan Air Ar | 1 | Rp11.640 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 10 | 1 | Rp3.500 |
| Kabel jumper female-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) | Rp165.915 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| DHT22 (AM2302) VCC | → | 3V3 | merah |
| DHT22 (AM2302) DATA | → | D4 GPIO4 | hijau |
| DHT22 (AM2302) GND | → | GND | hitam |
| GY-BMP280 (I2C) VCC | → | 3V3 | merah |
| GY-BMP280 (I2C) GND | → | GND | hitam |
| GY-BMP280 (I2C) SCL | → | D22 GPIO22 | kuning |
| GY-BMP280 (I2C) SDA | → | D21 GPIO21 | biru |
| BH1750 GY-30 (I2C) VCC | → | 3V3 | merah |
| BH1750 GY-30 (I2C) GND | → | GND | hitam |
| BH1750 GY-30 (I2C) SCL | → | D22 GPIO22 | kuning |
| BH1750 GY-30 (I2C) SDA | → | D21 GPIO21 | biru |
| Modul sensor hujan (papan hujan ke 2 pin ujung) VCC | → | 3V3 | merah |
| Modul sensor hujan (papan hujan ke 2 pin ujung) GND | → | GND | hitam |
| Modul sensor hujan (papan hujan ke 2 pin ujung) AO | → | D34 GPIO34 | ungu |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p145.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 Suhu | ichibot/KODE/p145/suhu | 15–40 °C |
| Gauge Kelembapan | ichibot/KODE/p145/lembap | 0–100 % |
| Gauge Tekanan Udara | ichibot/KODE/p145/tekanan | 990–1025 hPa |
| Gauge Cahaya | ichibot/KODE/p145/lux | 0–60000 lx |
| Gauge Hujan | ichibot/KODE/p145/hujan | 0–100 % |
| Text Log Ramalan | ichibot/KODE/p145/ramalan | menampilkan teks masuk |
| Chart Grafik Tekanan | ichibot/KODE/p145/tekanan | 1000–1015 hPa |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), DHT sensor library (Adafruit), Adafruit Unified Sensor, Adafruit BMP280 Library, BH1750 (Christopher Laws). 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 145 - Stasiun Cuaca Mini
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <DHT.h>
#include <Adafruit_BMP280.h>
#include <BH1750.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_SUHU = "ichibot/budi1234/p145/suhu";
const char* TOPIK_LEMBAP = "ichibot/budi1234/p145/lembap";
const char* TOPIK_TEKANAN = "ichibot/budi1234/p145/tekanan";
const char* TOPIK_LUX = "ichibot/budi1234/p145/lux";
const char* TOPIK_HUJAN = "ichibot/budi1234/p145/hujan";
const char* TOPIK_RAMALAN = "ichibot/budi1234/p145/ramalan";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
DHT dht(4, DHT22);
Adafruit_BMP280 bmp; // I2C 0x76
BH1750 cahaya; // I2C 0x23, satu jalur SDA/SCL dengan BMP280
const int PIN_HUJAN = 34;
float tekananTadi = 0;
unsigned long terakhir = 0, trenTerakhir = 0;
String ramalan(float turunPerJam) { // ramalan sederhana dari perubahan tekanan udara
if (turunPerJam > 1.0) return "Cuaca memburuk, kemungkinan hujan";
if (turunPerJam < -1.0) return "Cuaca membaik";
return "Cuaca stabil";
}
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();
Wire.begin();
if (!bmp.begin(0x76) && !bmp.begin(0x77)) Serial.println("BMP280 tidak ditemukan");
if (!cahaya.begin()) Serial.println("BH1750 tidak ditemukan");
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 10000) return;
terakhir = millis();
float suhu = dht.readTemperature(), lembap = dht.readHumidity();
float hpa = bmp.readPressure() / 100.0;
float lux = cahaya.readLightLevel();
int hujan = constrain(map(analogRead(PIN_HUJAN), 4095, 1200, 0, 100), 0, 100);
if (!isnan(suhu)) {
mqtt.publish(TOPIK_SUHU, String(suhu, 1).c_str());
mqtt.publish(TOPIK_LEMBAP, String(lembap, 0).c_str());
}
mqtt.publish(TOPIK_TEKANAN, String(hpa, 1).c_str());
mqtt.publish(TOPIK_LUX, String(lux, 0).c_str());
mqtt.publish(TOPIK_HUJAN, String(hujan).c_str());
if (millis() - trenTerakhir >= 3600000UL || tekananTadi == 0) { // bandingkan tekanan tiap jam
if (tekananTadi > 0) mqtt.publish(TOPIK_RAMALAN, ramalan(tekananTadi - hpa).c_str());
tekananTadi = hpa;
trenTerakhir = millis();
}
}Langkah 4: Pahami kodenya
- Dua modul I2C di kabel yang sama. Setiap modul punya alamat sendiri, jadi ESP32 bisa menyapa masing-masing tanpa tertukar.
- Aturan barometer klasik. Bukan ramalan BMKG, tetapi cukup sering benar untuk beberapa jam ke depan.
- Papan kering ≈ 4095, basah turun. Kalibrasi angka 1200 dengan papan yang disiram air (seperti proyek 063).