Sensor membaca kelembapan tanah di pot. Kalau tanah terlalu kering, ESP32 menyalakan pompa lewat relay sampai tanah cukup basah. Dari Klenik kamu bisa lihat persentase kelembapan, mengatur batas kering, atau mematikan mode otomatis dan menyiram manual.
Sensor tanah memberi tegangan analog: makin basah, makin kecil angkanya. ESP32 membaca angka itu di GPIO34 (0-4095), lalu mengubahnya jadi 0-100% memakai dua angka kalibrasi. Dalam mode otomatis, pompa menyala kalau kelembapan di bawah batas dan baru mati setelah 10% di atas batas. Jarak 10% ini (histeresis) mencegah relay ceklak-ceklik saat angka sensor naik-turun sedikit di sekitar batas.
Pompa diberi daya dari 3 baterai AA sendiri, bukan dari ESP32. Motor menarik arus besar saat mulai berputar dan bisa membuat ESP32 restart kalau berbagi daya. Relay bekerja seperti saklar yang ditekan oleh ESP32: COM dan NO tersambung saat relay aktif.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor kelembapan tanah + modul | 1 | Rp8.500 |
| Modul relay 1 channel 5V | 1 | Rp17.000 |
| Pompa air mini 3-4,5V | 1 | Rp13.000 |
| Holder baterai 3×AA + kabelbaterai AA dibeli terpisah | 1 | Rp6.000 |
| Selang 8/6 mmopsional, cek ukuran lubang pompa | 1 | Rp6.852 |
| 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) | Rp123.000 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Sensor kelembapan tanah VCC | → | 3V3 | merah |
| Sensor kelembapan tanah GND | → | GND | hitam |
| Sensor kelembapan tanah 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 |
| Baterai 3×AA (4,5V) + | → | Relay 1 ch 5V (jumper H) COM | merah |
| Relay 1 ch 5V (jumper H) NO | → | Pompa mini 3–4,5V + | merah |
| Pompa mini 3–4,5V − | → | Baterai 3×AA (4,5V) − | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p061.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 Kelembapan Tanah | ichibot/KODE/p061/tanah | 0–100 % |
| Indikator Boolean Pompa | ichibot/KODE/p061/pompa/status | ON = 1 “MENYIRAM”, OFF = 0 |
| Switch Mode Otomatis | ichibot/KODE/p061/otomatis | payload ON / OFF |
| Switch Pompa Manual | ichibot/KODE/p061/pompa | payload ON / OFF |
| Slider Output Batas Kering | ichibot/KODE/p061/batas | 10–80 % |
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 061 - Penyiram Tanaman Otomatis
// 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_POMPA_STATUS = "ichibot/budi1234/p061/pompa/status";
const char* TOPIK_POMPA = "ichibot/budi1234/p061/pompa";
const char* TOPIK_OTOMATIS = "ichibot/budi1234/p061/otomatis";
const char* TOPIK_BATAS = "ichibot/budi1234/p061/batas";
const char* TOPIK_TANAH = "ichibot/budi1234/p061/tanah";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
// Kalibrasi: baca Serial Monitor saat sensor di udara (kering) dan di air (basah)
const int NILAI_KERING = 3300;
const int NILAI_BASAH = 1300;
const int PIN_TANAH = 34; // GPIO34, input analog
const int PIN_RELAY = 26; // GPIO26
const unsigned long JEDA = 3000;
bool otomatis = true;
int batas = 40; // siram kalau tanah di bawah 40%
unsigned long terakhir = 0;
void pompa(bool nyala) {
digitalWrite(PIN_RELAY, nyala ? HIGH : LOW);
mqtt.publish(TOPIK_POMPA_STATUS, nyala ? "1" : "0", true);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String topik = t, p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (topik == TOPIK_OTOMATIS) otomatis = (p == "ON");
else if (topik == TOPIK_BATAS) batas = constrain(p.toInt(), 5, 95);
else if (topik == TOPIK_POMPA && !otomatis) pompa(p == "ON");
Serial.println(topik + " = " + p);
}
void langganan() {
mqtt.subscribe(TOPIK_POMPA);
mqtt.subscribe(TOPIK_OTOMATIS);
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(PIN_RELAY, OUTPUT);
digitalWrite(PIN_RELAY, LOW);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < JEDA) return;
terakhir = millis();
int mentah = analogRead(PIN_TANAH);
int persen = map(mentah, NILAI_KERING, NILAI_BASAH, 0, 100);
persen = constrain(persen, 0, 100);
mqtt.publish(TOPIK_TANAH, String(persen).c_str());
Serial.printf("Mentah %d -> %d%%\n", mentah, persen);
if (otomatis) {
if (persen < batas) pompa(true);
else if (persen > batas + 10) pompa(false);
}
}Langkah 4: Pahami kodenya
- Dua angka kalibrasi. Upload dulu, buka Serial Monitor, lalu lihat angka
Mentahsaat sensor di udara (itu NILAI_KERING) dan saat dicelup ke segelas air (NILAI_BASAH). Tiap sensor sedikit berbeda, jadi isi dengan angkamu sendiri. - GPIO34 termasuk ADC1. Pin ADC2 (misalnya 25, 26, 27) tidak bisa dipakai
analogRead()saat WiFi ESP32 aktif, jadi sensor analog selalu dipasang di 32-39. - Perintah pompa manual hanya dituruti saat mode otomatis mati. Kalau tidak, pompa yang kamu matikan dari HP akan dinyalakan lagi oleh logika otomatis 3 detik kemudian.
map()mengubah rentang kering-basah jadi 0-100. Karena angka basah lebih kecil, urutannya sengaja dibalik.constrain()menjaga hasil tetap di 0-100 kalau sensor membaca di luar kalibrasi.- Histeresis: nyala di bawah batas, mati di atas batas + 10. Di antara keduanya pompa mempertahankan kondisi terakhir.