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.

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.
| Spesifikasi | Nilai umum (pompa celup mini 3–6 V) |
|---|---|
| Tegangan kerja | 2,5–6 V DC (paling efisien di 3–5 V) |
| Arus kerja | 130–220 mA (sampai 300 mA di 6 V) |
| Arus start | 2–3 kali arus kerja selama beberapa milidetik |
| Daya | 0,4–1,5 W |
| Debit (lubang keluar terbuka) | 80–120 L/jam, kira-kira 1,3–2 L/mnt |
| Tinggi angkat maksimum | 40–110 cm (debit turun ke nol di ketinggian ini) |
| Selang | Selang silikon, diameter dalam 5 mm dan diameter luar 7–8 mm |
| Umur pakai terus-menerus | Sekitar 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.
| Board | Arus aman per pin | Batas mutlak pin | Dibandingkan dengan pompa |
|---|---|---|---|
| Arduino Uno / Nano (5 V) | 20 mA | 40 mA | Pompa butuh 5–10 kali lebih banyak |
| ESP32 (3,3 V) | ≈ 20 mA | 40 mA | Arusnya 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 menggerakkan | Atur kecepatan dengan PWM | Dengan board 3,3 V | Catatan |
|---|---|---|---|
| MOSFET logic-level (IRLZ44N, AO3400A) | Ya | AO3400A sangat bagus, IRLZ44N cukup | Pilihan terbaik; hampir tidak panas |
| Transistor NPN (2N2222A, BC337) | Ya | Ya, pakai resistor basis yang lebih kecil | Sampai 300 mA; tegangan jatuh ≈ 0,2–0,3 V |
| Modul MOSFET IRF520 | Ya | Tidak, hanya setengah terbuka | Bisa dipakai sampai sekitar 1 A di 5 V |
| Modul relay | Tidak, hanya nyala/mati | Perlu modul pemicu 3,3 V | Berbunyi klik, kontak aus; untuk pompa 12 V atau pompa listrik PLN |
| Driver motor L298N / L9110S | Ya | Ya | Tidak perlu membalik arah; L298N memakan sampai 2 V |
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.
| Sambungan | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Pin kontrol → resistor gate → gate | D9 (PWM), 220 Ω | GPIO 25, 100 Ω | GP15, 100 Ω |
| Pull-down antara gate dan GND | 10 kΩ | 10 kΩ | 10 kΩ |
| Source MOSFET | GND | GND | GND |
| Drain MOSFET | Kabel negatif (hitam) pompa | Kabel negatif (hitam) pompa | Kabel negatif (hitam) pompa |
| Kabel positif (merah) pompa | Positif catu eksternal 5 V | Positif catu eksternal 5 V | Positif catu eksternal 5 V |
| Negatif catu eksternal | GND Arduino (ground bersama) | GND ESP32 (ground bersama) | GND Pico (ground bersama) |
| Dioda 1N5819, paralel terbalik dengan pompa | Katoda (ujung bergaris) ke positif pompa | Katoda ke positif pompa | Katoda 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.
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 selang | Debit kira-kira | Per detik |
|---|---|---|
| 0 cm | 100 L/jam | ≈ 28 ml |
| 25 cm | 75 L/jam | ≈ 21 ml |
| 50 cm | 50 L/jam | ≈ 14 ml |
| 75 cm | 25 L/jam | ≈ 7 ml |
| 100 cm | Hampir nol | Menetes |
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.
Langkah demi langkah: uji pompa pertamamu
- Rendam pompa sepenuhnya di wadah berisi air dan pasang selang silikon 30–50 cm di lubang keluarnya; arahkan ujung selang ke wadah kedua.
- Pasang IRLZ44N di breadboard. Sambungkan gate ke D9 lewat 220 Ω dan juga ke GND lewat 10 kΩ; sambungkan source ke GND.
- 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.
- Sambungkan negatif catu eksternal ke GND Arduino; periksa pengkabelan sekali lagi, lalu nyalakan catu daya.
- Upload kode di bawah dan buka Serial Monitor di 9600 baud. Pompa seharusnya menyala 3 detik dan berhenti 10 detik.
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.
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.
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.
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.
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?.
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
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Pompa mendengung tapi tidak mendorong air | Ada udara terjebak di dalam, atau pompa berada di atas permukaan air | Rendam pompa sepenuhnya dan goyangkan pelan untuk mengeluarkan udara; pasang selang tanpa tekukan |
| Arduino reset ketika pompa mulai menyala | Pompa mendapat daya dari pin 5V Arduino, atau tidak ada dioda | Beri daya pompa dari catu 5 V terpisah, tambahkan 1N5819 paralel terbalik dan 100 nF |
| Pompa sama sekali tidak berjalan | Tidak ada ground bersama, atau urutan kaki MOSFET salah | Sambungkan negatif catu eksternal ke GND Arduino dan cek urutan G-D-S |
| Pompa menyala sebentar ketika Arduino booting | Gate mengambang, tidak ada resistor pull-down | Pasang 10 kΩ antara gate dan GND |
| Air terus mengalir setelah pompa berhenti | Efek sifon: ujung selang di bawah permukaan air tangki | Naikkan selang atau buat lubang udara kecil di bagian atas selang |
| Debit menurun seiring waktu | Saringan lubang hisap tersumbat, baterai lemah, atau aus karena berjalan kering | Bersihkan lubang hisap, ukur catu daya, tambahkan sensor level air |
| Pompa tidak mau berputar pada PWM rendah | Duty cycle di bawah ambang start motor | Beri hentakan daya penuh singkat di awal dan naikkan MIN_DUTY |
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.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
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

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.

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.

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.

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

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

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.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

