Papan sensor hujan dipasang di dekat jemuran. Begitu tetes hujan pertama jatuh, buzzer di dalam rumah berbunyi dan Klenik mencatat jam mulai hujan. Kamu sempat mengangkat jemuran sebelum basah semua.
Papan hujan berisi jalur tembaga yang saling berselang-seling. Saat kering, kedua jalur tidak tersambung. Tetesan air menjembatani jalur itu sehingga tegangan di AO turun. Makin banyak air, makin rendah angkanya. NodeMCU membaca AO di pin A0 (0-1024) dan mengubahnya menjadi persen basah.
Status HUJAN menyala kalau basah melewati batas, lalu buzzer berbunyi 6 detik dan jamnya dicatat dari internet (NTP). Status baru padam kalau papan sudah turun di bawah setengah batas, supaya sisa tetesan di papan tidak membuat status berganti-ganti.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Rain Drop Sensor Pendeteksi Hujan Tetesan Air Ar | 1 | Rp11.640 |
| Modul buzzer aktif KY-012 | 1 | Rp7.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) | Rp64.640 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Modul sensor hujan (papan hujan ke 2 pin ujung) AO | → | A0 | hijau |
| Modul sensor hujan (papan hujan ke 2 pin ujung) VCC | → | 3V | merah |
| Modul sensor hujan (papan hujan ke 2 pin ujung) GND | → | G | hitam |
| Modul buzzer aktif KY-012 S | → | D2 GPIO4 | kuning |
| Modul buzzer aktif KY-012 + | → | 3V | merah |
| Modul buzzer aktif KY-012 − | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p063.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 Cuaca | ichibot/KODE/p063/hujan | ON = 1 “HUJAN!”, OFF = 0 |
| Gauge Papan Basah | ichibot/KODE/p063/basah | 0–100 % |
| Slider Output Batas Hujan | ichibot/KODE/p063/batas | 5–80 % |
| Text Log Catatan Hujan | ichibot/KODE/p063/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: NodeMCU 1.0 (ESP-12E 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 063 - Detektor Hujan Angkat Jemuran
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <time.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_BATAS = "ichibot/budi1234/p063/batas";
const char* TOPIK_BASAH = "ichibot/budi1234/p063/basah";
const char* TOPIK_LOG = "ichibot/budi1234/p063/log";
const char* TOPIK_HUJAN = "ichibot/budi1234/p063/hujan";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int BUZZER = D2;
const int NILAI_KERING = 1024; // A0 saat papan kering
const int NILAI_BASAH = 300; // A0 saat papan disiram air
int batas = 20; // % basah yang dianggap hujan
bool hujan = false;
unsigned long kirimTerakhir = 0, bunyiSampai = 0;
String jamSekarang() {
time_t t = time(nullptr);
char buf[6];
strftime(buf, sizeof(buf), "%H:%M", localtime(&t));
return String(buf);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
batas = p.toInt();
}
void langganan() {
mqtt.subscribe(TOPIK_BATAS);
}
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(BUZZER, OUTPUT);
sambungWiFi();
configTime(7 * 3600, 0, "pool.ntp.org");
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - kirimTerakhir >= 2000) {
kirimTerakhir = millis();
int mentah = analogRead(A0);
int basah = constrain(map(mentah, NILAI_KERING, NILAI_BASAH, 0, 100), 0, 100);
Serial.printf("A0 %d -> basah %d%%\n", mentah, basah);
mqtt.publish(TOPIK_BASAH, String(basah).c_str());
if (!hujan && basah > batas) {
hujan = true;
bunyiSampai = millis() + 6000;
mqtt.publish(TOPIK_LOG, ("Hujan mulai " + jamSekarang() + ". Angkat jemuran!").c_str());
} else if (hujan && basah < batas / 2) {
hujan = false;
mqtt.publish(TOPIK_LOG, ("Papan kering lagi " + jamSekarang()).c_str());
}
mqtt.publish(TOPIK_HUJAN, hujan ? "1" : "0", true);
}
if (bunyiSampai) {
digitalWrite(BUZZER, (millis() / 300) % 2); // tiit-tiit 6 detik
if ((long)(millis() - bunyiSampai) >= 0) {
bunyiSampai = 0;
digitalWrite(BUZZER, LOW);
}
}
}Langkah 4: Pahami kodenya
- Kalibrasi: lihat angka
A0di Serial Monitor saat papan kering dan saat papan disiram air, lalu isi di sini. - NodeMCU hanya punya satu pin analog, A0. Pin DO di modul (keluaran digital dengan ambang dari trimpot) tidak dipakai, karena batasnya sudah diatur dari slider.
- Status HUJAN baru padam setelah papan cukup kering. Sisa tetesan bisa bertahan lama, dan histeresis ini mencegah buzzer berbunyi lagi saat gerimis kecil.
- Retained: kalau kamu membuka dashboard setelah hujan mulai, indikator langsung menampilkan HUJAN!