Komponen · 16 mnt baca

Pompa Air Arduino: Cara Menyambung dan Mengendalikan Pompa Celup Mini

Panduan pompa air Arduino: menggerakkan pompa celup mini 3–6 V dengan MOSFET atau relay, dioda flyback, catu daya terpisah, debit aliran, penyiraman otomatis, dan kode ESP32.

Hampir setiap proyek pompa air Arduino memakai komponen yang sama: pompa celup mini seukuran jari yang bekerja di 3–6 V dan terendam sepenuhnya di dalam air. Pompa inilah jantung rangkaian yang menyiram pot tanaman, menambah air akuarium, mengeluarkan cairan dalam takaran tertentu seperti mesin kopi, atau menjalankan air mancur kecil. Harganya murah, suaranya pelan, dan kabelnya cuma dua; tapi karena di dalamnya ada motor DC brushed (bersikat), pompa ini tidak bisa disambung langsung ke pin Arduino.

Di panduan ini kamu akan belajar langkah demi langkah apa isi pompa, kenapa pompa tidak boleh langsung ke pin, dan cara menggerakkannya dengan aman lewat MOSFET, transistor, atau relay. Kita akan membahas tugas dioda flyback, kenapa pompa butuh catu daya sendiri, hubungan debit dengan tinggi angkat (head), dan kenapa menjalankan pompa tanpa air bisa membunuhnya. Setelah itu kita menulis kode untuk mengatur kecepatan dengan PWM, dispenser cairan yang akurat sampai mililiter, penyiraman otomatis berdasarkan kelembapan tanah, kendali dari ponsel dengan ESP32, dan penyiraman terjadwal dengan Raspberry Pi Pico.

Pompa air celup mini 6V
Pompa air celup mini: 3–6 V DC, dua kabel, lubang keluar selang sekitar 7,5 mm. Selama menyala, pompa harus terendam sepenuhnya di dalam air.

Apa itu pompa celup mini dan bagaimana cara kerjanya?

Pompa celup mini adalah pompa sentrifugal. Di dalam rumah plastiknya ada motor DC brushed kecil dan impeler bersudu yang terpasang pada porosnya. Ketika motor berputar, impeler melempar air yang masuk dari lubang hisap di bagian bawah ke arah luar dan mendorongnya keluar lewat lubang selang di samping atau di atas. Ruang motor ditutup rapat kedap air, sedangkan ruang impeler penuh berisi air. Desain ini punya dua konsekuensi penting: pompa tidak bisa memancing sendiri (tidak bisa mendorong udara, jadi harus berada di bawah permukaan air) dan air yang dipompanya itulah yang mendinginkan impeler dan melumasi bantalannya.

SpesifikasiNilai umum (pompa celup mini 3–6 V)
Tegangan kerja2,5–6 V DC (paling efisien di 3–5 V)
Arus kerja130–220 mA (sampai 300 mA di 6 V)
Arus start2–3 kali arus kerja selama beberapa milidetik
Daya0,4–1,5 W
Debit (lubang keluar terbuka)80–120 L/jam, kira-kira 1,3–2 L/mnt
Tinggi angkat maksimum40–110 cm (debit turun ke nol di ketinggian ini)
SelangSelang silikon, diameter dalam 5 mm dan diameter luar 7–8 mm
Umur pakai terus-menerusSekitar 500 jam (motor brushed)

Nilai di tabel berbeda-beda tiap model; selalu cek label pompamu sendiri atau data dari penjual. Dua baris yang benar-benar penting adalah arus dan arus start. Pompa 200 mA bisa menarik 400–600 mA sebentar pada momen mulai berputar, karena motornya belum mencapai kecepatan. Kalau rangkaianmu tidak dirancang untuk lonjakan ini, Arduino-mu akan reset setiap kali pompa menyala.

Kenapa pompa tidak bisa langsung disambung ke pin Arduino?

Kesalahan pemula yang paling umum adalah mencolokkan kabel merah pompa ke pin digital, kabel hitam ke GND, lalu mencoba menjalankannya dengan digitalWrite(HIGH). Ada tiga masalah terpisah di sini. Pertama, arus: pin Arduino Uno paling banyak tahan 40 mA dan batas amannya 20 mA, sedangkan pompa butuh sepuluh kali lipatnya. Kedua, lonjakan tegangan: lilitan motor adalah kumparan, dan begitu arus diputus, lilitan ini bisa menghasilkan pulsa singkat ratusan volt ke arah sebaliknya. Ketiga, derau listrik: sikat motor brushed memercikkan bunga api di setiap putaran dan menyebarkan gangguan ke jalur catu. Hasilnya, pompa tidak pernah berputar atau pin rusak permanen.

BoardArus aman per pinBatas mutlak pinDibandingkan dengan pompa
Arduino Uno / Nano (5 V)20 mA40 mAPompa butuh 5–10 kali lebih banyak
ESP32 (3,3 V)≈ 20 mA40 mAArusnya tidak cukup, tegangannya juga rendah
Raspberry Pi Pico (3,3 V)4 mA (default)12 mA (pengaturan tertinggi)Pompa butuh lebih dari 20 kali lipat

Solusinya, pin tidak mengendalikan pompa, melainkan sebuah saklar. Pin hanya memberi sinyal beberapa miliampere; arus pompa yang sebenarnya mengalir dari catu daya terpisah melalui saklar itu. Ada empat pilihan saklar: MOSFET logic-level, transistor NPN, modul MOSFET siap pakai, atau modul relay. Tabel di bawah merangkum kapan masing-masing masuk akal.

Cara menggerakkanAtur kecepatan dengan PWMDengan board 3,3 VCatatan
MOSFET logic-level (IRLZ44N, AO3400A)YaAO3400A sangat bagus, IRLZ44N cukupPilihan terbaik; hampir tidak panas
Transistor NPN (2N2222A, BC337)YaYa, pakai resistor basis yang lebih kecilSampai 300 mA; tegangan jatuh ≈ 0,2–0,3 V
Modul MOSFET IRF520YaTidak, hanya setengah terbukaBisa dipakai sampai sekitar 1 A di 5 V
Modul relayTidak, hanya nyala/matiPerlu modul pemicu 3,3 VBerbunyi klik, kontak aus; untuk pompa 12 V atau pompa listrik PLN
Driver motor L298N / L9110SYaYaTidak perlu membalik arah; L298N memakan sampai 2 V
Kalau kamu ingin detail tentang pemilihan MOSFET, resistor gate, dan arti logic level, baca Memakai MOSFET dengan Arduino; untuk BJT dan hitungan resistor basis, lihat Apa Itu Transistor?. Pinout dan penguatan transistormu bisa kamu cari di katalog transistor.

Pengkabelan pompa air Arduino: MOSFET, dioda, dan ground bersama

Rangkaian yang paling kokoh dan fleksibel adalah MOSFET logic-level kanal-N yang menghidupmatikan pompa dari sisi rendah (low-side). Kabel positif pompa langsung ke positif catu eksternal; kabel negatifnya ke drain MOSFET. Source MOSFET ke GND, dan gate ke pin Arduino lewat sebuah resistor. Ketika pin HIGH, MOSFET menghantar, menghubungkan negatif pompa ke GND, dan pompa berputar. Pada IRLZ44N, dengan sisi bertulisan menghadap kamu, urutan kaki dari kiri ke kanan adalah Gate, Drain, Source.

SambunganArduino UnoESP32Raspberry Pi Pico
Pin kontrol → resistor gate → gateD9 (PWM), 220 ΩGPIO 25, 100 ΩGP15, 100 Ω
Pull-down antara gate dan GND10 kΩ10 kΩ10 kΩ
Source MOSFETGNDGNDGND
Drain MOSFETKabel negatif (hitam) pompaKabel negatif (hitam) pompaKabel negatif (hitam) pompa
Kabel positif (merah) pompaPositif catu eksternal 5 VPositif catu eksternal 5 VPositif catu eksternal 5 V
Negatif catu eksternalGND Arduino (ground bersama)GND ESP32 (ground bersama)GND Pico (ground bersama)
Dioda 1N5819, paralel terbalik dengan pompaKatoda (ujung bergaris) ke positif pompaKatoda ke positif pompaKatoda ke positif pompa

Resistor gate membatasi arus lonjakan yang ditarik dari pin ketika kapasitansi gate MOSFET terisi; pull-down 10 kΩ menahan gate di GND selama Arduino booting atau sedang di-upload kode dan pinnya belum terdefinisi. Tanpa resistor itu, pompa bisa menyala sendiri beberapa detik setiap kali reset; di samping pot tanaman, artinya segelas air tumpah di mejamu. Dioda dan ground bersama cukup penting sehingga masing-masing mendapat bagian tersendiri.

Dioda flyback: lonjakan tegangan ketika pompa dimatikan

Lilitan motor berperilaku seperti kumparan, dan kumparan tidak membiarkan arus yang melewatinya berhenti tiba-tiba. Begitu MOSFET mati, energi yang tersimpan di lilitan mencari jalan keluar dan menimbulkan lonjakan tegangan singkat di drain, jauh di atas tegangan catu. Lama-kelamaan pulsa ini menjebol MOSFET atau transistor dan membuat Arduino di jalur yang sama reset. Solusinya adalah dioda yang dipasang di antara dua terminal pompa secara terbalik: katoda (ujung bergaris) ke positif, anoda ke negatif. Dalam operasi normal dioda sama sekali tidak dilewati arus; ketika MOSFET mati, arus kumparan berputar kembali lewat dioda ke pompa dan energinya habis tanpa merusak apa pun.

Kalau pompa akan kamu nyala-matikan dengan cepat lewat PWM, dioda menghantar di setiap periode, jadi dioda Schottky yang cepat seperti 1N5819 adalah pilihan terbaik. Kalau hanya untuk nyala dan mati, 1N4007 yang kamu punya juga cukup. Untuk mengurangi derau dari sikat, kamu juga bisa menyolder kapasitor keramik 100 nF di antara terminal pompa. Jenis-jenis dioda dan cara menentukan arahnya kami jelaskan di Apa Itu Dioda?.

Catu daya terpisah dan ground bersama: kenapa Arduino reset?

Memberi daya pompa dari pin 5V Arduino Uno kelihatannya berhasil di percobaan pertama, tapi tidak bisa diandalkan. Uno yang diberi daya lewat USB seluruhnya berada di belakang sekring 500 mA (polyfuse), dan port USB komputer biasanya juga hanya memberi 500 mA. Ketika pompa mulai berputar, lonjakan 400–600 mA menarik tegangan ke bawah 4 V sekejap; mikrokontroler reset, Serial Monitor terputus, atau kode berperilaku aneh. Kalau adaptor kamu colokkan ke jack DC Uno, giliran regulator 5 V di board yang memanas: dengan input 9 V dan pompa 250 mA, regulator mengubah (9 − 5) × 0,25 = 1 W menjadi panas.

  • Adaptor 5 V (1–2 A): Solusi paling praktis. Pompa dan, kalau perlu, Arduino mendapat daya dari adaptor yang sama, tapi lewat kabel terpisah.
  • 4 × baterai AA (6 V): Ideal untuk pompa 6 V; baterai baru memberi 6,4 V, dan itu aman untuk pompa.
  • Li-ion 18650 (3,7–4,2 V): Cocok untuk pompa 3–5 V; isi ulang dengan modul TP4056.
  • Modul daya breadboard: Modul seperti MB102 memberi 5 V dan 3,3 V ke breadboard; cukup untuk pompa kecil, detailnya ada di panduan modul daya breadboard MB102.
  • Kalau kamu punya sistem 12 V: Turunkan ke 5 V dengan buck converter LM2596; jangan pernah memberi 12 V langsung ke pompa 6 V.
Jangan lupa menyambungkan negatif catu eksternal ke GND Arduino. Tanpa ground bersama, sinyal gate tidak punya acuan, MOSFET tidak menyala, dan pompa sama sekali tidak berjalan; lebih parah lagi, MOSFET bisa setengah menyala secara acak dan memanas. Alasannya kami jelaskan di Ground Bersama (GND). Satu lagi, ketika memperkirakan umur baterai, pikirkan Arduino-nya, bukan pompanya: pompa 200 mA yang menyala 30 detik sehari memakai sekitar 1,7 mAh per hari, sedangkan Uno yang selalu menyala memakai sekitar 1200 mAh; kalkulator umur baterai langsung menunjukkannya.

Debit dan tinggi angkat: seberapa tinggi pompa bisa menaikkan air?

Debit 100–120 L/jam yang ditulis penjual berlaku untuk pompa tanpa selang dengan lubang keluar tepat di permukaan air. Dalam pemakaian nyata, makin tinggi air naik di selang, makin keras pompa bekerja melawan gravitasi dan debitnya turun. Ketinggian di mana pompa sama sekali tidak bisa lagi menaikkan air disebut tinggi angkat maksimum (max head); di titik itu impeler berputar tapi tidak ada air yang keluar dari selang. Selang yang panjang, kecil, atau tertekuk memberi efek yang sama karena menambah gesekan. Tabel di bawah menunjukkan perilaku pompa umum yang mengalirkan sekitar 100 L/jam di 5 V dengan lubang keluar terbuka pada berbagai ketinggian.

Tinggi dari permukaan air ke ujung selangDebit kira-kiraPer detik
0 cm100 L/jam≈ 28 ml
25 cm75 L/jam≈ 21 ml
50 cm50 L/jam≈ 14 ml
75 cm25 L/jam≈ 7 ml
100 cmHampir nolMenetes

Jadi jangan menghitung lama penyiraman dari angka katalog; ukur di rangkaianmu sendiri. Pegang selang di atas gelas ukur pada ketinggian yang benar-benar akan kamu pakai, jalankan pompa tepat 10 detik, lalu baca volume air di gelas. Misalnya kamu mengukur 185 ml, berarti debitmu 18,5 ml/dtk; untuk mengeluarkan 250 ml, pompa perlu menyala 250 / 18,5 ≈ 13,5 detik. Mengulang pengukuran tiga kali lalu merata-ratakannya mengurangi galat akibat tegangan baterai dan perbedaan selang. Kalau tegangan pompa berubah (misalnya ketika baterai melemah), debit juga berubah; untuk takaran yang presisi, pakai catu 5 V yang stabil.

Berjalan kering dan efek sifon: dua musuh tersembunyi pompa

Air adalah pelumas bantalan pompa sekaligus pendingin motornya. Ketika tangki kosong, pompa berputar di udara, bantalan impeler memanas karena gesekan, bagian plastik melunak, dan motor berputar lebih kencang dari biasanya. Berjalan kering beberapa detik tidak akan membunuh sebagian besar pompa, tapi pompa yang berjalan kering selama bermenit-menit akan macet atau bunyinya berubah dan debitnya berkurang. Di sistem otomatis ada dua cara mencegahnya: pasang sensor level air atau saklar pelampung di tangki, dan batasi di kode berapa lama pompa boleh menyala dalam sekali jalan. Kode penyiraman otomatis di bawah melakukan keduanya.

Waspadai efek sifon: Kalau ujung selang lebih rendah daripada permukaan air di tangki, air terus mengalir karena gravitasi bahkan setelah pompa berhenti, dan tangki terkuras ke pot tanaman. Selalu jaga titik tertinggi selang di atas permukaan air tangki, atau tusuk lubang udara kecil dengan jarum di bagian atas selang; ketika pompa berhenti, udara masuk dan aliran terputus.

Langkah demi langkah: uji pompa pertamamu

  1. Rendam pompa sepenuhnya di wadah berisi air dan pasang selang silikon 30–50 cm di lubang keluarnya; arahkan ujung selang ke wadah kedua.
  2. Pasang IRLZ44N di breadboard. Sambungkan gate ke D9 lewat 220 Ω dan juga ke GND lewat 10 kΩ; sambungkan source ke GND.
  3. Sambungkan kabel hitam pompa ke drain dan kabel merahnya ke positif catu eksternal 5 V. Pasang dioda 1N5819 di antara terminal pompa dengan ujung bergaris di sisi positif.
  4. Sambungkan negatif catu eksternal ke GND Arduino; periksa pengkabelan sekali lagi, lalu nyalakan catu daya.
  5. Upload kode di bawah dan buka Serial Monitor di 9600 baud. Pompa seharusnya menyala 3 detik dan berhenti 10 detik.
C++ (Arduino IDE)
1const byte PUMP_PIN = 9;            // MOSFET gate (220 Ω üzerinden) / MOSFET gate (through 220 Ω)
2
3void setup() {
4  pinMode(PUMP_PIN, OUTPUT);
5  digitalWrite(PUMP_PIN, LOW);      // açılışta pompa kapalı / pump off at start-up
6  Serial.begin(9600);
7}
8
9void loop() {
10  Serial.println(F("Pompa calisiyor / pump on"));
11  digitalWrite(PUMP_PIN, HIGH);     // MOSFET iletimde, pompa döner / MOSFET on, pump runs
12  delay(3000);                      // 3 saniye su bas / pump for 3 seconds
13  Serial.println(F("Pompa durdu / pump off"));
14  digitalWrite(PUMP_PIN, LOW);
15  delay(10000);                     // 10 saniye bekle / wait 10 seconds
16}

Kalau pompa tidak berjalan, cek dulu ground bersama, lalu urutan kaki MOSFET; kalau pompa tidak mau berhenti, mungkin drain dan source tertukar. Untuk mengukur debit, cukup ganti delay(3000) menjadi delay(10000) di kode yang sama dan pegang selang di atas gelas ukur. Karena kode ini memakai delay(), Arduino tidak bisa mengerjakan hal lain selama pompa menyala; di contoh berikutnya kita akan menghitung waktu dengan millis(). Kalau penasaran dengan bedanya, lihat millis dan delay.

Mengatur kecepatan pompa dengan PWM

Keunggulan terbesar MOSFET adalah kamu bisa mengatur kecepatan pompa dengan PWM. Aliran pelan terlihat lebih alami di air mancur, lebih sedikit mengaduk kotoran di filter akuarium, dan memungkinkan takaran yang lebih halus. Ada dua masalah praktis. Pertama, pompa kecil tidak bisa mulai berputar pada duty cycle rendah (biasanya di bawah 30–40%) dan hanya mendengung; karena itu kode memberi hentakan daya penuh singkat untuk menyalakan pompa, lalu turun ke kecepatan yang diminta. Kedua, PWM 490 Hz di pin D9 Uno membuat pompa berdenging cukup keras; kode menaikkan frekuensi itu ke 3,9 kHz.

C++ (Arduino IDE)
1const byte PUMP_PIN = 9;            // MOSFET gate, Timer1 PWM pini / Timer1 PWM pin
2const byte POT_PIN = A0;            // hız potansiyometresi / speed potentiometer
3const byte MIN_DUTY = 90;           // bunun altında pompa dönmez (≈ %35) / pump stalls below this (≈ 35 %)
4
5byte duty = 0;
6
7void setup() {
8  // D9-D10 PWM frekansı 490 Hz yerine 3,9 kHz (daha az vızıltı) / D9-D10 PWM at 3.9 kHz instead of 490 Hz (less whine)
9  TCCR1B = (TCCR1B & 0b11111000) | 0x02;
10  pinMode(PUMP_PIN, OUTPUT);
11  Serial.begin(9600);
12}
13
14void loop() {
15  int raw = analogRead(POT_PIN);                    // 0-1023
16  byte target = map(raw, 0, 1023, 0, 255);
17  if (target < MIN_DUTY) target = 0;                // çok yavaşsa tamamen durdur / stop completely if too slow
18
19  if (duty == 0 && target > 0) {                    // pompa duruyordu, şimdi kalkacak / pump was stopped, now starting
20    analogWrite(PUMP_PIN, 255);                     // kısa tam güç darbesi / short full-power kick
21    delay(150);
22  }
23  duty = target;
24  analogWrite(PUMP_PIN, duty);
25
26  Serial.print(F("PWM: "));
27  Serial.print(duty);
28  Serial.print(F("  (%"));
29  Serial.print(duty * 100 / 255);
30  Serial.println(F(")"));
31  delay(100);
32}

Sambungkan kaki tengah potensiometer ke A0 dan kedua kaki luarnya ke 5V dan GND. Baris TCCR1B hanya memengaruhi Timer1, yaitu pin D9 dan D10; millis() dan delay() memakai Timer0, jadi keduanya tetap bekerja. Tapi library Servo juga memakai Timer1, jadi hapus baris ini kalau proyekmu memakai servo. Temukan MIN_DUTY dengan pompamu sendiri: putar potensiometer pelan-pelan, baca di Serial Monitor nilai terendah di mana pompa bisa mulai berputar sendiri, lalu tambahkan sedikit cadangan. Menurunkan tegangan pompa juga menurunkan tinggi angkat; di setengah kecepatan, pompa hanya bisa menaikkan air sampai kira-kira seperempat ketinggian pada kecepatan penuh, karena tekanan pompa sentrifugal sebanding dengan kuadrat kecepatannya.

Dispenser cairan: tepat 50 ml dengan sekali tekan tombol

Begitu debit sudah diukur, mengubah pompa menjadi mesin takar itu mudah: bagi jumlah yang diperlukan dengan debit, dan kamu mendapat lama pompa harus menyala. Kode di bawah mengeluarkan 50 ml setiap kali kamu menekan tombol yang disambung antara D2 dan GND; menekan tombol lagi selama pompa menyala membatalkan takaran. Karena waktu diukur dengan millis(), perulangan tidak pernah menunggu dan bisa membaca tombol terus-menerus. Inilah dasar proyek seperti dispenser sabun, penakar pupuk tanaman, atau mesin koktail.

C++ (Arduino IDE)
1const byte PUMP_PIN = 9;                 // MOSFET gate / MOSFET gate
2const byte BUTTON_PIN = 2;               // buton: D2 ile GND arası / button between D2 and GND
3const float ML_PER_SECOND = 18.5;        // kendi ölçtüğün debi / the flow rate you measured
4const float DOSE_ML = 50.0;              // bir basışta verilecek miktar / amount per press
5
6unsigned long doseTime = 0;              // ms cinsinden doz süresi / dose time in ms
7unsigned long startTime = 0;
8unsigned long lastPress = 0;
9bool pumping = false;
10bool lastButton = HIGH;
11
12void setPump(bool on) {
13  pumping = on;
14  digitalWrite(PUMP_PIN, on ? HIGH : LOW);
15  if (on) startTime = millis();
16}
17
18void setup() {
19  pinMode(PUMP_PIN, OUTPUT);
20  digitalWrite(PUMP_PIN, LOW);
21  pinMode(BUTTON_PIN, INPUT_PULLUP);     // basılıyken LOW / LOW while pressed
22  Serial.begin(9600);
23  doseTime = (unsigned long)(DOSE_ML / ML_PER_SECOND * 1000.0);
24  Serial.print(F("Doz suresi / dose time (ms): "));
25  Serial.println(doseTime);              // 50 / 18,5 = 2703 ms
26}
27
28void loop() {
29  bool button = digitalRead(BUTTON_PIN);
30  if (button == LOW && lastButton == HIGH && millis() - lastPress > 200) {   // yeni basış, 200 ms debounce / new press, 200 ms debounce
31    lastPress = millis();
32    setPump(!pumping);                   // ilk basış başlatır, ikincisi iptal eder / first press starts, second cancels
33    Serial.println(pumping ? F("Doz basladi / dose started") : F("Iptal / cancelled"));
34  }
35  lastButton = button;
36
37  if (pumping && millis() - startTime >= doseTime) {   // süre doldu / time is up
38    setPump(false);
39    Serial.println(F("Doz tamam / dose done"));
40  }
41}

Kalau takaran pertama keluar lebih sedikit dari yang lain, penyebabnya kemungkinan besar selang yang kosong: pompa mengisi selang dulu, baru kemudian mengeluarkan cairan. Menjaga ujung selang sedikit di atas permukaan air tangki membuat selang tetap penuh, sehingga setiap takaran sama. Dengan cairan kental seperti minyak, sirup, atau sabun, debitnya jauh lebih rendah daripada air, jadi selalu kalibrasi dengan cairan itu. Untuk proyek yang bersentuhan dengan makanan, pakai selang silikon food grade dan bilas pompa dengan air bersih setiap selesai dipakai.

Penyiraman otomatis berdasarkan kelembapan tanah

Proyek pompa air Arduino yang paling populer adalah pot tanaman yang menyiram dirinya sendiri ketika tanah mengering. Jebakan yang sering menimpa pemula adalah menjalankan pompa sampai kelembapan tanah mencapai target: butuh beberapa menit sampai air mencapai sensor, dan pada waktu itu pot sudah meluap. Cara yang benar adalah menyiram dengan pulsa singkat: pompa menyala 4 detik, lalu menunggu 1 menit supaya air menyebar di tanah, dan kelembapan diukur lagi. Kode ini juga tidak pernah menyalakan pompa kalau tangki kosong, dan kalau kelembapan masih belum naik setelah 6 pulsa (sensor mungkin tercabut dari tanah atau selang terlepas), sistem dikunci dan LED menyala. Kalibrasi sensor kami bahas secara rinci di panduan sensor kelembapan tanah.

C++ (Arduino IDE)
1const byte PUMP_PIN = 9;                 // MOSFET gate / MOSFET gate
2const byte SOIL_PIN = A0;                // kapasitif toprak nem sensörü AOUT / capacitive soil sensor AOUT
3const byte FLOAT_PIN = 3;                // şamandıra: D3 ile GND arası / float switch between D3 and GND
4const byte LED_PIN = 13;                 // uyarı LED'i / warning LED
5
6const int DRY_VALUE = 600;               // sensör kuru havadayken / sensor in dry air
7const int WET_VALUE = 280;               // sensör bardak sudayken / sensor in a glass of water
8const int START_PERCENT = 35;            // bunun altında sulamaya başla / start watering below this
9const int STOP_PERCENT = 55;             // buna ulaşınca dur / stop once this is reached
10const unsigned long PULSE_MS = 4000;     // bir darbede pompa süresi / pump time per pulse
11const unsigned long SOAK_MS = 60000;     // suyun toprağa yayılma süresi / time for the water to soak in
12const byte MAX_PULSES = 6;               // bir sulamada en fazla darbe / max pulses per watering
13
14byte pulses = 0;
15bool locked = false;
16unsigned long lastCheck = 0;
17
18bool waterAvailable() {
19  return digitalRead(FLOAT_PIN) == LOW;  // şamandıra yukarıda: kontak kapalı / float up: contact closed
20}
21
22int readMoisture() {
23  long sum = 0;
24  for (byte i = 0; i < 10; i++) {        // 10 ölçümün ortalaması / average of 10 readings
25    sum += analogRead(SOIL_PIN);
26    delay(5);
27  }
28  int percent = map(sum / 10, DRY_VALUE, WET_VALUE, 0, 100);
29  return constrain(percent, 0, 100);
30}
31
32void runPump(unsigned long ms) {
33  unsigned long t0 = millis();
34  digitalWrite(PUMP_PIN, HIGH);
35  while (millis() - t0 < ms) {
36    if (!waterAvailable()) break;        // su biterse hemen dur / stop at once if the water runs out
37  }
38  digitalWrite(PUMP_PIN, LOW);
39}
40
41void setup() {
42  pinMode(PUMP_PIN, OUTPUT);
43  digitalWrite(PUMP_PIN, LOW);
44  pinMode(FLOAT_PIN, INPUT_PULLUP);
45  pinMode(LED_PIN, OUTPUT);
46  Serial.begin(9600);
47  lastCheck = millis() - SOAK_MS;        // ilk ölçüm hemen yapılsın / take the first reading right away
48}
49
50void loop() {
51  if (!waterAvailable()) {               // depo boş: yavaş yanıp sön / tank empty: slow blink
52    digitalWrite(LED_PIN, (millis() / 500) % 2);
53    return;
54  }
55  if (locked) {                          // arıza: LED sürekli yanar / fault: LED stays on
56    digitalWrite(LED_PIN, HIGH);
57    return;
58  }
59  digitalWrite(LED_PIN, LOW);
60  if (millis() - lastCheck < SOAK_MS) return;
61  lastCheck = millis();
62
63  int moisture = readMoisture();
64  Serial.print(F("Nem / moisture: %"));
65  Serial.println(moisture);
66
67  if (pulses == 0 && moisture >= START_PERCENT) return;   // sulama gerekmiyor / no watering needed
68  if (moisture >= STOP_PERCENT) {                        // hedefe ulaşıldı / target reached
69    pulses = 0;
70    return;
71  }
72  if (pulses >= MAX_PULSES) {                            // nem yükselmiyor: sensör ya da hortum sorunu / moisture not rising: sensor or hose problem
73    locked = true;
74    Serial.println(F("Kilitlendi, kontrol et / locked, check the setup"));
75    return;
76  }
77  runPump(PULSE_MS);
78  pulses++;
79}

Dua ambang terpisah di kode itu memang disengaja: penyiraman dimulai ketika kelembapan turun di bawah 35%, tapi berlanjut sampai mencapai 55%. Berkat histeresis ini, pompa tidak terus nyala-mati karena pembacaan yang naik-turun tepat di ambang. Ukur DRY_VALUE dan WET_VALUE dengan sensormu sendiri; pada sensor kapasitif, nilai ini bergantung pada tegangan catu dan panjang kabel. Kalau kabel saklar pelampung putus, pin membaca HIGH dan kode menganggapnya tangki kosong; dengan kata lain, kalau ada yang rusak, sistem tetap di sisi aman dan menghentikan pompa. Kalau kamu ingin menyiram hanya pada jam tertentu dalam sehari, tambahkan modul jam RTC dan masukkan pengecekan waktu ke kondisinya.

Kapan relay masuk akal untuk mengendalikan pompa?

Kalau yang kamu punya hanya modul relay, pompa mini juga bisa dijalankan dengannya: kabel positif pompa berjalan dari catu eksternal ke terminal COM relay, lalu dari terminal NO ke pompa; kabel negatif ke negatif catu. Relay memisahkan pompa sepenuhnya dari rangkaian board, dan modul yang sama bisa menghidupmatikan pompa 12 V yang besar atau pompa akuarium bertegangan listrik PLN. Di sisi lain, relay tidak bisa mengatur kecepatan dengan PWM, berbunyi klik setiap kali berpindah, kontaknya aus seiring waktu, dan kumparannya sendiri menarik sekitar 70 mA. Kalau pompa hanya dinyalakan beberapa kali sehari, relay sudah cukup; kalau perlu takaran atau pengaturan kecepatan, MOSFET selalu lebih baik. Bahkan dengan relay, dioda di antara terminal pompa mengurangi busur api di kontak.

Mengendalikan pompa air dari ponsel dengan ESP32

Berkat Wi-Fi di ESP32, kamu bisa menjalankan pompa dari browser ponselmu. Kode di bawah menjalankan web server kecil di ESP32; ketika kamu membuka alamat IP yang tampil di Serial Monitor dari ponsel di jaringan yang sama, kamu akan melihat tombol penyiraman 5 dan 15 detik serta tombol stop. Tidak perlu library tambahan, karena WebServer sudah ikut dengan core ESP32. Demi keamanan, pompa tidak pernah menyala lebih dari 30 detik; bahkan kalau koneksi terputus, pompa berhenti sendiri begitu waktunya habis. Karena ESP32 bekerja di 3,3 V, pilih MOSFET yang menyala penuh di 3,3 V: AO3400A yang terbaik, dan IRLZ44N masih cukup lega untuk arus 300 mA pompa mini.

C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WebServer.h>
3
4const char* WIFI_SSID = "AgAdi";             // Wi-Fi adın (2,4 GHz) / your Wi-Fi name (2.4 GHz)
5const char* WIFI_PASS = "Sifre123";          // Wi-Fi şifren / your Wi-Fi password
6const int PUMP_PIN = 25;                     // MOSFET gate, 100 Ω üzerinden / through 100 Ω
7const unsigned long MAX_RUN_MS = 30000;      // güvenlik: en uzun çalışma / safety: longest run
8
9WebServer server(80);
10bool pumpOn = false;
11unsigned long pumpStart = 0;
12unsigned long pumpDuration = 0;
13
14void startPump(unsigned long ms) {
15  if (ms > MAX_RUN_MS) ms = MAX_RUN_MS;
16  pumpDuration = ms;
17  pumpStart = millis();
18  pumpOn = true;
19  digitalWrite(PUMP_PIN, HIGH);
20}
21
22void stopPump() {
23  pumpOn = false;
24  digitalWrite(PUMP_PIN, LOW);
25}
26
27void handleRoot() {
28  String html = F("<!DOCTYPE html><html><head><meta charset='utf-8'>"
29                  "<meta name='viewport' content='width=device-width,initial-scale=1'>"
30                  "<title>Pompa</title></head><body style='font-family:sans-serif;text-align:center'>"
31                  "<h2>BlueGrays Pompa</h2><p>");
32  html += pumpOn ? "Pompa çalışıyor / pump is on" : "Pompa kapalı / pump is off";
33  html += F("</p><p><a href='/run?s=5'><button>5 sn</button></a> "
34            "<a href='/run?s=15'><button>15 sn</button></a> "
35            "<a href='/stop'><button>Durdur / Stop</button></a></p></body></html>");
36  server.send(200, "text/html", html);
37}
38
39void goHome() {                              // ana sayfaya geri dön / go back to the main page
40  server.sendHeader("Location", "/");
41  server.send(303);
42}
43
44void handleRun() {
45  long seconds = server.arg("s").toInt();     // /run?s=5 → 5 saniye / 5 seconds
46  if (seconds > 0) startPump(seconds * 1000UL);
47  goHome();
48}
49
50void handleStop() {
51  stopPump();
52  goHome();
53}
54
55void setup() {
56  pinMode(PUMP_PIN, OUTPUT);
57  digitalWrite(PUMP_PIN, LOW);
58  Serial.begin(115200);
59  WiFi.mode(WIFI_STA);
60  WiFi.begin(WIFI_SSID, WIFI_PASS);
61  while (WiFi.status() != WL_CONNECTED) {
62    delay(500);
63    Serial.print(".");
64  }
65  Serial.println();
66  Serial.print(F("Tarayicida ac / open in the browser: http://"));
67  Serial.println(WiFi.localIP());
68
69  server.on("/", handleRoot);
70  server.on("/run", handleRun);
71  server.on("/stop", handleStop);
72  server.begin();
73}
74
75void loop() {
76  server.handleClient();
77  if (pumpOn && millis() - pumpStart >= pumpDuration) {   // süre doldu / time is up
78    stopPump();
79  }
80}

Halaman ini hanya bisa dibuka dari jaringan Wi-Fi rumahmu. Kalau kamu juga ingin mengendalikan pompa dari luar atau mendapat notifikasi ketika tangki kosong, kamu bisa menambahkan cara dari panduan bot Telegram ESP32 atau Blynk ke kode ini. Untuk mengubah halaman menjadi dasbor yang langsung diperbarui lewat WebSocket, lihat panduan web server asinkron ESP32. Karena pin ESP32 mengeluarkan 3,3 V, modul IRF520 tidak akan bekerja di sini; kalau ingin memakai modul, pilih yang memakai MOSFET logic-level.

Penyiraman terjadwal dengan Raspberry Pi Pico (MicroPython)

Di Pico, kamu bisa menggerakkan pompa lewat MOSFET di GP15 dan memberinya start lembut (soft start) dengan PWM. Start lembut menyebarkan arus start pompa ke beberapa ratus milidetik dan mencegah tegangan catu turun mendadak; kalau Pico dan pompa memakai catu yang sama, ini menghindarkan reset acak. Kode di bawah menyiram selama 8 detik setiap 12 jam dan menambah 3 detik ekstra ketika kamu menekan tombol di GP14. Karena pin Pico hanya memberi 3,3 V, di sini juga pilih MOSFET yang dijamin bekerja di 3,3 V seperti AO3400A. Kalau kamu baru mengenal MicroPython, lihat dulu Apa Itu Raspberry Pi Pico?.

MicroPython
1from machine import Pin, PWM
2import time
3
4pump = PWM(Pin(15))                       # MOSFET gate, 100 Ω üzerinden / through 100 Ω
5pump.freq(1000)                           # 1 kHz PWM
6pump.duty_u16(0)                          # açılışta kapalı / off at start-up
7button = Pin(14, Pin.IN, Pin.PULL_UP)     # buton: GP14 ile GND arası / button between GP14 and GND
8
9INTERVAL_MS = 12 * 60 * 60 * 1000         # 12 saatte bir / every 12 hours
10WATER_MS = 8000                           # her seferde 8 saniye / 8 seconds each time
11SPEED = 0.8                               # %80 hız / 80 % speed
12
13def water(ms):
14    top = int(65535 * SPEED)
15    for d in range(0, top, 2000):         # yumuşak kalkış (≈ 0,3 s) / soft start (≈ 0.3 s)
16        pump.duty_u16(d)
17        time.sleep_ms(10)
18    pump.duty_u16(top)
19    time.sleep_ms(ms)
20    pump.duty_u16(0)                      # pompayı durdur / stop the pump
21    print("Sulandi / watered:", ms, "ms")
22
23last = time.ticks_ms()
24while True:
25    if time.ticks_diff(time.ticks_ms(), last) >= INTERVAL_MS:
26        last = time.ticks_ms()
27        water(WATER_MS)
28    if button.value() == 0:               # elle sulama / manual watering
29        water(3000)
30        while button.value() == 0:        # bırakılmasını bekle / wait for release
31            time.sleep_ms(10)
32    time.sleep_ms(50)

Kode mengukur waktu dengan time.ticks_diff(), yang memberi selisih yang benar bahkan ketika penghitungnya melimpah dan mulai lagi dari awal (wrap around). Karena jam internal Pico kembali ke nol ketika dimatikan dan bisa bergeser beberapa detik sehari, kalau kamu ingin jadwal yang terikat waktu nyata, seperti “siram setiap pagi pukul 07.00”, tambahkan modul RTC atau pakai Pico W dan ambil waktu dari internet (NTP). Setelah listrik padam, penghitung 12 jam mulai lagi dari nol; untuk kebanyakan tanaman itu tidak masalah, tapi ingat hal ini untuk proyek yang berjalan selama kamu pergi berlibur lama.

Ide proyek dengan pompa air mini

  • Sistem penyiraman selama liburan: Siram tanamanmu selama dua minggu dengan seember air, beberapa pot, dan selang kecil yang bercabang ke tiap pot; rangkaian lengkapnya ada di proyek rumah kaca pintar.
  • Mangkuk minum hewan peliharaan otomatis: Ketika permukaan air di mangkuk turun, pompa mengisinya dari tangki; untuk mengukur level, sensor level cairan tanpa kontak bekerja dengan baik.
  • Dispenser sabun atau hand sanitizer tanpa sentuh: Ketika HC-SR04 atau sensor inframerah melihat tangan, pompa menyala setengah detik.
  • Mesin koktail dan minuman: 3–4 pompa, masing-masing di botolnya sendiri dan dengan debit yang diukur terpisah, mencampur minuman sesuai resep.
  • Air terjun meja dan kolam hias: Air mancur yang alirannya melambat di malam hari dengan PWM dan mati ketika LDR melihat ruangan menjadi gelap.
  • Penambah air akuarium otomatis: Sistem yang mengganti air yang menguap dari tangki terpisah ketika saklar pelampung menunjukkan level air turun.
  • Integrasi rumah pintar: Hubungkan pompa dengan perangkatmu yang lain lewat MQTT dan Home Assistant dengan ESP32.

Kesalahan umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
Pompa mendengung tapi tidak mendorong airAda udara terjebak di dalam, atau pompa berada di atas permukaan airRendam pompa sepenuhnya dan goyangkan pelan untuk mengeluarkan udara; pasang selang tanpa tekukan
Arduino reset ketika pompa mulai menyalaPompa mendapat daya dari pin 5V Arduino, atau tidak ada diodaBeri daya pompa dari catu 5 V terpisah, tambahkan 1N5819 paralel terbalik dan 100 nF
Pompa sama sekali tidak berjalanTidak ada ground bersama, atau urutan kaki MOSFET salahSambungkan negatif catu eksternal ke GND Arduino dan cek urutan G-D-S
Pompa menyala sebentar ketika Arduino bootingGate mengambang, tidak ada resistor pull-downPasang 10 kΩ antara gate dan GND
Air terus mengalir setelah pompa berhentiEfek sifon: ujung selang di bawah permukaan air tangkiNaikkan selang atau buat lubang udara kecil di bagian atas selang
Debit menurun seiring waktuSaringan lubang hisap tersumbat, baterai lemah, atau aus karena berjalan keringBersihkan lubang hisap, ukur catu daya, tambahkan sensor level air
Pompa tidak mau berputar pada PWM rendahDuty cycle di bawah ambang start motorBeri hentakan daya penuh singkat di awal dan naikkan MIN_DUTY
Sebelum memasang rangkaian di samping tanaman, coba semua skenario di meja dengan wadah uji: apa yang terjadi ketika tangki kosong, apa yang terjadi ketika kabel sensor lepas, dan apakah pompa menyala sendiri ketika listrik padam lalu kembali? Selalu letakkan elektronik di samping wadah air atau lebih tinggi darinya, jangan pernah tepat di atasnya, dan buat kabel melengkung ke bawah sebelum masuk ke board (drip loop), supaya air yang merambat di kabel tidak pernah sampai ke board.

Kalau digerakkan dengan benar, pompa celup mini adalah komponen murah dan senyap yang bisa bekerja bertahun-tahun tanpa masalah: dengan MOSFET logic-level, dioda terbalik, catu 5 V terpisah, dan ground bersama, Arduino-mu tetap aman sepenuhnya. Sisanya tergantung imajinasimu; dengan debit yang sudah kamu ukur, kamu bisa menakar sampai mililiter, menyiram berdasarkan kelembapan tanah, atau mengatur pompa dari ponsel dengan ESP32. Di aplikasi BlueGrays kamu akan menemukan proyek Stasiun Penyiraman Pintar, beserta proyek web server ESP32 dan jam RTC, lengkap dengan skema rangkaian dan kode langkah demi langkah.

Pertanyaan umum

Bagaimana cara menyambung pompa air ke Arduino?

Pompa air mini tidak disambung langsung ke pin Arduino, karena pin hanya memberi 20–40 mA sedangkan pompa butuh 150–300 mA. Sambungkan positif pompa ke catu eksternal 5 V dan negatifnya ke drain MOSFET logic-level seperti IRLZ44N; sambungkan gate ke pin lewat 220 Ω dan source ke GND. Tambahkan dioda 1N5819 paralel terbalik di antara terminal pompa dan satukan ground kedua catu daya.

Berapa arus yang ditarik pompa air mini?

Pompa celup mini 3–6 V biasanya menarik 130–220 mA ketika berjalan, dan sampai 300 mA di 6 V. Ketika start, arusnya bisa sebentar mencapai 2–3 kali nilai itu selama beberapa milidetik. Karena itu catu dayamu sebaiknya punya rating minimal 1 A, dan pompa tidak boleh mendapat daya dari pin 5V Arduino.

Sebaiknya pompa air digerakkan dengan relay atau MOSFET?

Untuk pompa mini 3–6 V, MOSFET logic-level lebih baik: senyap, tidak aus, dan bisa mengatur kecepatan dengan PWM. Relay hanya bisa nyala/mati, berbunyi klik, dan kumparannya menarik tambahan sekitar 70 mA. Relay masuk akal untuk pompa 12 V yang besar atau pompa bertegangan listrik PLN, dan kalau pompa hanya menyala beberapa kali sehari.

Apa yang terjadi kalau pompa air mini berjalan kering?

Pompa ini didinginkan oleh air dan bantalannya dilumasi air. Berjalan kering beberapa detik biasanya tidak merusak, tapi pada pompa yang berjalan kering selama bermenit-menit, bantalannya kepanasan, bagian plastiknya aus, dan pompa bisa macet. Di sistem otomatis, pasang sensor level air atau saklar pelampung di tangki dan batasi lama nyala terpanjang di kode.

Seberapa tinggi pompa air mini bisa menaikkan air?

Tinggi angkat maksimum pompa celup mini 3–6 V biasanya antara 40 dan 110 cm. Makin dekat ke ketinggian itu, debit turun dengan cepat, dan di batasnya hampir tidak ada air yang keluar dari selang. Kalau kamu perlu mengirim air lebih tinggi, pakai pompa 12 V yang lebih kuat atau pompa diafragma.

Bisakah kecepatan pompa air diatur dengan Arduino?

Bisa. Kalau pompa digerakkan lewat MOSFET logic-level, kecepatannya bisa diatur dengan analogWrite() di pin PWM. Pompa kecil tidak bisa mulai berputar di bawah duty cycle sekitar 30–40%, jadi beri hentakan daya penuh singkat dulu, baru turunkan kecepatannya. Dengan relay, kecepatan tidak bisa diatur.

Lihat semua proyek
Stasiun Penyiraman Pintar
#83Mahir
Premium

Stasiun Penyiraman Pintar

Tukang kebun yang menyiram tanamanmu sendiri, supaya tanaman tidak kering ketika kamu berlibur. Sensor kelembapan tanah mengukur seberapa basah tanahnya; ketika kering, Arduino menyalakan pompa air be

5.0(42)
57
Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)
#129Mahir

Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)

Di proyek ini, kita mengubah ESP32 menjadi web server asinkron yang bisa kamu kendalikan dari ponsel atau komputer di jaringan Wi-Fi yang sama. Berkat library ESPAsyncWebServer, server bisa memproses beberapa permintaan bersamaan (berbeda dengan WebServer.h klasik, yang memblokir pada satu permintaan). Kamu bisa membuka alamat IP ESP32 di browser dan mengklik tombol ON/OFF (rute /on dan /off) untuk menyalakan dan mematikan LED yang tersambung ke GPIO 5.

4.8(16)
26
Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)
#127Mahir

Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)

Di proyek ini, kita menyambungkan ESP32 ke jaringan Wi-Fi rumah dalam mode Station (STA) dengan cara yang aman dan tahan gangguan. Kita menyimpan SSID dan kata sandi di file secrets.h terpisah agar tidak bocor ke Git, menyiapkan mekanisme sambung ulang otomatis, dan menampilkan tingkat sinyal RSSI dan alamat IP di layar LCD I2C. LED bawaan bekerja sebagai indikator status. Ini adalah pengelola koneksi kelas produksi.

4.4(21)
34
Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)
#120Menengah
Premium

Jam Digital dengan ESP32 dan RTC DS1307 (I2C + LCD)

Di proyek ini, kita menampilkan waktu dan tanggal di layar LCD I2C 16x2 memakai modul jam real-time (RTC) DS1307. DS1307 adalah RTC berbaterai cadangan yang tetap menjaga waktu meskipun ESP32 dimatikan. Kedua modul berbagi bus I2C yang sama (SDA/SCL), sehingga kita belajar mengendalikan beberapa perangkat hanya dengan dua kabel sinyal. Lewat proyek ini kamu mendapat pengetahuan praktis tentang protokol komunikasi I2C, cara kerja modul RTC, dan tampilan data dinamis di LCD.

4.6(26)
40
Menyiapkan Modul Jam RTC DS1302
#45Pemula

Menyiapkan Modul Jam RTC DS1302

Kamu menjalankan modul jam kecil yang tidak pernah lupa waktu, bahkan ketika Arduino dimatikan. Modul ini punya baterai mungilnya sendiri, dan begitu jamnya diatur, tanggal dan waktu tercetak di layar

4.5(23)
31
Kendalikan LED dari Ponselmu lewat Bluetooth
#34Pemula
Premium

Kendalikan LED dari Ponselmu lewat Bluetooth

Latihan kecil untuk menyalakan dan mematikan lampu kamarmu dari ponsel. Modul Bluetooth meneruskan huruf yang dikirim dari ponselmu ke Arduino; satu huruf menyalakan LED merah, huruf lain menyalakan L

4.8(68)
89
Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
#141Mahir
Premium

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)

Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

4.3(6)
11