Tancapkan sensor di pot dan pantau kelembapan tanah dari HP. Grafik memperlihatkan seberapa cepat tanah mengering, dan Klenik memberi tanda saat tanaman perlu disiram. Proyek ini cocok sebagai langkah awal sebelum penyiram otomatis 061.
Sensor tanah adalah dua batang konduktor. Tanah basah menghantarkan listrik lebih baik, jadi tegangan di pin AO turun saat tanah basah. ESP32 membaca angka itu di GPIO34 sebanyak 10 kali lalu merata-ratanya, kemudian mengubahnya menjadi 0-100% memakai dua angka kalibrasi.
Status KERING menyala kalau kelembapan turun di bawah batas slider. Status itu baru padam setelah kelembapan naik 10% di atas batas (histeresis, seperti proyek 061). Pesan di Text Log hanya dikirim saat status berubah, bukan setiap 5 detik.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor kelembapan tanah + modul | 1 | Rp8.500 |
| Kabel jumper female-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) | Rp87.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 |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p062.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/p062/tanah | 0–100 % |
| Indikator Boolean Perlu Disiram | ichibot/KODE/p062/kering | ON = 1 “KERING”, OFF = 0 |
| Slider Output Batas Kering | ichibot/KODE/p062/batas | 10–80 % |
| Chart Grafik Tanah | ichibot/KODE/p062/tanah | 0–100 % |
| Text Log Catatan | ichibot/KODE/p062/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 062 - Monitor Kelembapan Tanah Pot
// 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_BATAS = "ichibot/budi1234/p062/batas";
const char* TOPIK_TANAH = "ichibot/budi1234/p062/tanah";
const char* TOPIK_LOG = "ichibot/budi1234/p062/log";
const char* TOPIK_KERING = "ichibot/budi1234/p062/kering";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_TANAH = 34;
const int NILAI_KERING = 3300; // angka mentah sensor di udara
const int NILAI_BASAH = 1300; // angka mentah sensor di segelas air
int batas = 35; // di bawah ini tanaman perlu disiram (%)
bool kering = false;
unsigned long kirimTerakhir = 0;
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);
}
int bacaTanah() { // rata-rata 10 bacaan supaya stabil
long jumlah = 0;
for (int i = 0; i < 10; i++) { jumlah += analogRead(PIN_TANAH); delay(5); }
int mentah = jumlah / 10;
int persen = constrain(map(mentah, NILAI_KERING, NILAI_BASAH, 0, 100), 0, 100);
Serial.printf("Mentah %d -> %d%%\n", mentah, persen);
return persen;
}
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() - kirimTerakhir >= 5000) {
kirimTerakhir = millis();
int persen = bacaTanah();
mqtt.publish(TOPIK_TANAH, String(persen).c_str());
if (!kering && persen < batas) {
kering = true;
mqtt.publish(TOPIK_LOG, ("Tanah kering (" + String(persen) + "%), waktunya menyiram").c_str());
} else if (kering && persen > batas + 10) {
kering = false;
mqtt.publish(TOPIK_LOG, ("Sudah disiram, tanah " + String(persen) + "%").c_str());
}
mqtt.publish(TOPIK_KERING, kering ? "1" : "0");
}
}Langkah 4: Pahami kodenya
- Kalibrasi sama seperti proyek 061: lihat angka
Mentahdi Serial Monitor saat sensor di udara dan saat dicelup air, lalu isi di sini. - Sepuluh bacaan dirata-rata. ADC ESP32 sedikit berisik, jadi rata-rata membuat grafik lebih halus.
- Histeresis: status KERING baru hilang setelah tanah 10% di atas batas. Tanpa jarak ini status bisa bolak-balik saat angkanya di sekitar batas.