Tutorial Belanja komponen

Tutorial › Tanaman & Air

Penyiram Tanaman Otomatis

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVINVCCGNDDOAOSensor kelembapan tanahSRD-05VDCL HDC+DC−INNOCOMNCRelay 1 ch 5V (jumper H)+−Baterai 3×AA (4,5V)POMPA+−Pompa mini 3–4,5V

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

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Sensor kelembapan tanah + modul1Rp8.500
Modul relay 1 channel 5V1Rp17.000
Pompa air mini 3-4,5V1Rp13.000
Holder baterai 3×AA + kabelbaterai AA dibeli terpisah1Rp6.000
Selang 8/6 mmopsional, cek ukuran lubang pompa1Rp6.852
Kabel jumper female-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)Rp123.000
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
Sensor kelembapan tanah VCC→3V3merah
Sensor kelembapan tanah GND→GNDhitam
Sensor kelembapan tanah AO→D34 GPIO34hijau
Relay 1 ch 5V (jumper H) DC+→VINoranye
Relay 1 ch 5V (jumper H) DC−→GNDhitam
Relay 1 ch 5V (jumper H) IN→D26 GPIO26biru
Baterai 3×AA (4,5V) +→Relay 1 ch 5V (jumper H) COMmerah
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

Kelembapan Tanahichibot/budi1234/p061/tanah
0 – 10038%
0 detik lalu
Pompaichibot/budi1234/p061/pompa/status
MENYIRAM
0 detik lalu
Mode Otomatisichibot/budi1234/p061/otomatis
Otomatis
0 detik lalu
Pompa Manualichibot/budi1234/p061/pompa
Siram
0 detik lalu
Batas Keringichibot/budi1234/p061/batas
40%40 of 80%
0 detik lalu

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.

WidgetTopicSetting
Gauge
Kelembapan Tanah
ichibot/KODE/p061/tanah0–100 %
Indikator Boolean
Pompa
ichibot/KODE/p061/pompa/statusON = 1 “MENYIRAM”, OFF = 0
Switch
Mode Otomatis
ichibot/KODE/p061/otomatispayload ON / OFF
Switch
Pompa Manual
ichibot/KODE/p061/pompapayload ON / OFF
Slider Output
Batas Kering
ichibot/KODE/p061/batas10–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).

p061.inoUnduh .ino
// 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

  1. Dua angka kalibrasi. Upload dulu, buka Serial Monitor, lalu lihat angka Mentah saat sensor di udara (itu NILAI_KERING) dan saat dicelup ke segelas air (NILAI_BASAH). Tiap sensor sedikit berbeda, jadi isi dengan angkamu sendiri.
  2. 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.
  3. 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.
  4. 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.
  5. Histeresis: nyala di bawah batas, mati di atas batas + 10. Di antara keduanya pompa mempertahankan kondisi terakhir.