Parçalar · 14 dk okuma

Arduino Su Pompası: Mini Dalgıç Pompa Bağlantısı ve Kontrolü

Arduino su pompası bağlantısı: 3–6 V mini dalgıç pompa MOSFET ya da röleyle nasıl sürülür, diyot, ayrı besleme, debi ölçümü, otomatik sulama ve ESP32 kodu.

Arduino su pompası projelerinin neredeyse hepsinde aynı parça kullanılır: parmak büyüklüğünde, 3–6 V ile çalışan, tamamen suyun içine batırılan mini dalgıç pompa. Saksı sulayan, akvaryuma su takviyesi yapan, kahve makinesi gibi belirli miktarda sıvı dağıtan ya da küçük bir şelale çalıştıran devrelerin kalbi bu pompadır. Ucuzdur, sessizdir ve yalnızca iki kablosu vardır; ama içinde fırçalı bir DC motor olduğu için Arduino'nun pinine doğrudan bağlanamaz.

Bu rehberde pompanın içinde ne olduğunu, neden doğrudan pine bağlanmadığını ve onu MOSFET, transistör ya da röle ile nasıl güvenle süreceğini adım adım öğreneceksin. Flyback diyotunun görevini, pompayı neden ayrı bir güç kaynağından beslemen gerektiğini, debi ile basma yüksekliğinin ilişkisini ve pompayı kuru çalıştırmanın neden onu öldürdüğünü konuşacağız. Ardından PWM ile hız ayarı, mililitre hassasiyetinde sıvı dağıtıcı, toprak nemine göre otomatik sulama, ESP32 ile telefondan kontrol ve Raspberry Pi Pico ile zamanlı sulama kodlarını yazacağız.

6V mini dalgıç su pompası
Mini dalgıç su pompası: 3–6 V DC, iki kablolu, hortum çıkışı yaklaşık 7,5 mm. Çalışırken tamamen suyun içinde olmalı.

Mini dalgıç su pompası nedir, nasıl çalışır?

Mini dalgıç pompa bir santrifüj pompadır. Plastik gövdenin içinde küçük bir fırçalı DC motor ve motorun miline takılı kanatlı bir pervane (çark) bulunur. Motor döndükçe çark, alttaki giriş deliğinden aldığı suyu merkezkaç kuvvetiyle dışarı savurur ve yandaki ya da üstteki hortum çıkışından basar. Motor bölmesi su geçirmez şekilde kapatılmıştır, çark bölmesi ise suyla doludur. Bu tasarımın iki önemli sonucu vardır: pompa kendi kendine su emmez (havayı basamaz, bu yüzden suyun altında olmalıdır) ve çarkı soğutan, yataklarını yağlayan şey de yine pompaladığı sudur.

ÖzellikTipik değer (3–6 V mini dalgıç pompa)
Çalışma gerilimi2,5–6 V DC (en verimli 3–5 V)
Çalışma akımı130–220 mA (6 V'ta 300 mA'e kadar)
Kalkış akımıBirkaç milisaniye için çalışma akımının 2–3 katı
Güç0,4–1,5 W
Debi (açık çıkışta)80–120 L/saat, yani yaklaşık 1,3–2 L/dk
En yüksek basma yüksekliği40–110 cm (bu yükseklikte debi sıfıra iner)
Hortumİç çapı 5 mm, dış çapı 7–8 mm silikon hortum
Kesintisiz çalışma ömrüYaklaşık 500 saat (fırçalı motor)

Tablodaki değerler modelden modele değişir; kendi pompanın etiketine ya da satıcının verdiği bilgiye mutlaka bak. Asıl dikkat etmen gereken iki satır akım ve kalkış akımıdır. 200 mA'lik bir pompa, dönmeye başladığı ilk anda motor henüz hızlanmadığı için kısa süreliğine 400–600 mA çekebilir. Devreni bu ani akıma göre tasarlamazsan pompa her çalıştığında Arduino'nun resetlendiğini görürsün.

Pompa neden doğrudan Arduino pinine bağlanmaz?

Yeni başlayanların en sık yaptığı hata, pompanın kırmızı kablosunu bir dijital pine, siyahını GND'ye takıp digitalWrite(HIGH) ile çalıştırmaya çalışmaktır. Bunun üç ayrı sorunu vardır. Birincisi akım: bir Arduino Uno pini en fazla 40 mA'e dayanır ve güvenli sınır 20 mA'dir; pompa ise bunun 10 katını ister. İkincisi gerilim sıçraması: motorun sargısı bir bobindir ve akım kesildiği anda ters yönde yüzlerce voltluk kısa bir darbe üretebilir. Üçüncüsü elektriksel gürültü: fırçalı motorun fırçaları her turda kıvılcımlanır ve besleme hattına parazit yayar. Sonuç ya hiç dönmeyen bir pompa ya da kalıcı olarak hasar görmüş bir pin olur.

KartPin başına güvenli akımPin mutlak sınırıPompa akımı ile kıyas
Arduino Uno / Nano (5 V)20 mA40 mAPompa 5–10 kat fazlasını ister
ESP32 (3,3 V)≈ 20 mA40 mAHem akım yetmez hem gerilim düşüktür
Raspberry Pi Pico (3,3 V)4 mA (varsayılan)12 mA (ayarlanabilir en yüksek)Pompa 20 kattan fazlasını ister

Çözüm, pinin pompayı değil bir anahtarı kontrol etmesidir. Pin yalnızca birkaç miliamperlik bir sinyal verir; pompanın asıl akımı ayrı bir güç kaynağından, bu anahtar üzerinden akar. Anahtar olarak dört seçeneğin var: lojik seviye MOSFET, NPN transistör, hazır MOSFET modülü ya da röle modülü. Hangisinin ne zaman uygun olduğunu aşağıdaki tablo özetliyor.

Sürme yöntemiPWM ile hız ayarı3,3 V kartlarlaNot
Lojik seviye MOSFET (IRLZ44N, AO3400A)EvetAO3400A çok iyi, IRLZ44N yeterliEn iyi seçim; neredeyse hiç ısınmaz
NPN transistör (2N2222A, BC337)EvetEvet, beyz direncini küçült300 mA'e kadar; üzerinde ≈ 0,2–0,3 V düşer
IRF520 MOSFET modülüEvetHayır, yarım açılır5 V ile yaklaşık 1 A'e kadar iş görür
Röle modülüHayır, yalnız aç–kapa3,3 V tetiklemeli modül gerekirTıklar, kontak aşınır; 12 V ya da 220 V pompalar için
L298N / L9110S motor sürücüEvetEvetYön değiştirme gerekmez; L298N 2 V kadar gerilim yer
MOSFET seçimi, gate direnci ve lojik seviye kavramını ayrıntılı merak ediyorsan Arduino MOSFET kullanımı yazısına, BJT ile beyz direnci hesabı için transistör nedir yazısına bak. Elindeki transistörün bacak sırasını ve kazancını transistör kataloğunda bulabilirsin.

Arduino su pompası bağlantısı: MOSFET, diyot ve ortak GND

En sağlam ve en esnek devre, pompayı düşük taraftan (low-side) anahtarlayan N kanallı bir lojik seviye MOSFET'tir. Pompanın artı kablosu doğrudan harici beslemenin artısına gider; eksi kablosu MOSFET'in drain bacağına bağlanır. MOSFET'in source bacağı GND'ye, gate bacağı bir dirençle Arduino'nun pinine gider. Pin HIGH olunca MOSFET iletime geçer, pompanın eksisini GND'ye bağlar ve pompa döner. IRLZ44N'de bacak sırası, yazılı yüz sana bakarken soldan sağa Gate, Drain, Source şeklindedir.

BağlantıArduino UnoESP32Raspberry Pi Pico
Kontrol pini → gate direnci → gateD9 (PWM), 220 ΩGPIO 25, 100 ΩGP15, 100 Ω
Gate ile GND arası pull-down10 kΩ10 kΩ10 kΩ
MOSFET sourceGNDGNDGND
MOSFET drainPompanın eksi (siyah) kablosuPompanın eksi (siyah) kablosuPompanın eksi (siyah) kablosu
Pompanın artı (kırmızı) kablosuHarici 5 V beslemenin artısıHarici 5 V beslemenin artısıHarici 5 V beslemenin artısı
Harici beslemenin eksisiArduino GND (ortak toprak)ESP32 GND (ortak toprak)Pico GND (ortak toprak)
1N5819 diyot, pompaya ters paralelKatot (çizgili uç) pompanın artısınaKatot pompanın artısınaKatot pompanın artısına

Gate direnci, MOSFET'in gate kapasitesini doldururken pinden çekilen ani akımı sınırlar; 10 kΩ'luk pull-down ise Arduino açılırken ya da kod yüklenirken pin henüz tanımsızken gate'i GND'de tutar. Bu direnç yoksa pompa her resette birkaç saniye kendi kendine çalışabilir; saksının yanında bu, masaya dökülen bir bardak su demektir. Diyot ve ortak GND ise ayrı başlıklar hak edecek kadar önemlidir.

Flyback diyot: pompayı kapatırken oluşan gerilim sıçraması

Motor sargısı bir bobin gibi davranır ve bobin, içinden geçen akımın aniden kesilmesine izin vermez. MOSFET kapandığı anda sargıda depolanan enerji bir çıkış yolu arar ve drain bacağında besleme geriliminin çok üzerinde, kısa bir gerilim sıçraması oluşturur. Bu darbe zamanla MOSFET'i ya da transistörü deler, aynı hattaki Arduino'yu resetler. Çözüm pompanın iki ucuna ters yönde bağlanan bir diyottur: katot (çizgili uç) artıya, anot eksiye. Normal çalışmada diyot hiç akım geçirmez; MOSFET kapandığında ise bobinin akımı diyot üzerinden pompaya geri döner ve enerji zararsızca söner.

Pompayı PWM ile hızlı aç–kapa yapacaksan diyot her periyotta iletime geçer; bu yüzden hızlı bir Schottky diyot olan 1N5819 en iyi seçimdir. Yalnız aç–kapa yapacaksan elindeki 1N4007 de iş görür. Fırçalardan gelen paraziti azaltmak için pompanın uçlarına ayrıca 100 nF'lık seramik bir kondansatör lehimleyebilirsin. Diyot tiplerini ve yönünü bulmayı diyot nedir yazısında anlattık.

Ayrı güç kaynağı ve ortak GND: Arduino neden resetleniyor?

Pompayı Arduino Uno'nun 5V pininden beslemek ilk denemede çalışıyor gibi görünür, ama güvenilir değildir. USB'den beslenen bir Uno'nun tamamı 500 mA'lik bir sigortanın (polyfuse) arkasındadır ve bilgisayarın USB portu da genellikle 500 mA verir. Pompa kalktığında 400–600 mA'lik ani akım, gerilimi bir anlığına 4 V'un altına çeker; mikrodenetleyici resetlenir, Seri Monitör kopar ya da kod garip davranır. Adaptörü Uno'nun güç girişine takarsan bu kez karttaki 5 V regülatörü ısınır: 9 V girişte 250 mA'lik bir pompa için regülatör (9 − 5) × 0,25 = 1 W'ı ısıya çevirir.

  • 5 V adaptör (1–2 A): En pratik çözüm. Pompa ve gerekirse Arduino aynı adaptörden, ama ayrı kablolarla beslenir.
  • 4 × AA pil (6 V): 6 V'luk pompalar için idealdir; taze piller 6,4 V verir ve bu değer pompa için güvenlidir.
  • 18650 Li-ion (3,7–4,2 V): 3–5 V pompalar için uygundur; şarj için TP4056 modülü kullanılır.
  • Breadboard güç modülü: MB102 gibi modüller breadboard'a 5 V ve 3,3 V verir; küçük bir pompa için yeterlidir, ayrıntılar breadboard güç modülü yazısında.
  • 12 V sistemin varsa: Pompayı LM2596 voltaj düşürücü ile 5 V'a indir; 12 V'u doğrudan 6 V'luk pompaya verme.
Harici beslemenin eksisini Arduino'nun GND'sine bağlamayı unutma. Ortak GND yoksa gate sinyalinin ölçüleceği bir referans kalmaz, MOSFET açılmaz ve pompa hiç çalışmaz; daha kötüsü, rastgele yarım açılıp ısınabilir. Neden böyle olduğunu GND ve ortak toprak yazısında anlattık. Bir de pil ömrünü hesaplarken pompayı değil Arduino'yu düşün: günde 30 saniye çalışan 200 mA'lik pompa günde yaklaşık 1,7 mAh harcar, sürekli açık bir Uno ise yaklaşık 1200 mAh; pil ömrü hesaplayıcı bunu hemen gösterir.

Debi ve basma yüksekliği: pompa suyu ne kadar yukarı çıkarır?

Satıcıların yazdığı 100–120 L/saat debi, hortum takılmamış, çıkışı suyun yüzeyinde duran bir pompa içindir. Gerçekte su hortumdan yukarı çıktıkça pompa yerçekimine karşı çalışır ve debi düşer. Pompanın suyu artık hiç kaldıramadığı yüksekliğe en yüksek basma yüksekliği denir; bu noktada çark döner ama hortumdan su akmaz. Uzun, ince ya da kıvrılmış bir hortum da sürtünme ekleyerek aynı etkiyi yapar. Aşağıdaki tablo, 5 V'ta açık çıkışta yaklaşık 100 L/saat veren tipik bir pompanın yüksekliğe göre davranışını gösteriyor.

Su yüzeyinden hortum ucuna yükseklikYaklaşık debiSaniyede
0 cm100 L/saat≈ 28 ml
25 cm75 L/saat≈ 21 ml
50 cm50 L/saat≈ 14 ml
75 cm25 L/saat≈ 7 ml
100 cmNeredeyse sıfırDamla damla

Bu yüzden sulama süresini katalog değerinden hesaplama, kendi düzeneğinde ölç. Hortumu gerçekte kullanacağın yükseklikte bir ölçü kabına tut, pompayı tam 10 saniye çalıştır ve kaptaki suyu oku. Örneğin 185 ml ölçtüysen debin 18,5 ml/s'dir; 250 ml su vermek için pompayı 250 / 18,5 ≈ 13,5 saniye çalıştırman gerekir. Ölçümü üç kez tekrarlayıp ortalamasını almak, pil gerilimi ve hortum farklarından gelen sapmayı azaltır. Pompanın gerilimi değişirse (pil zayıfladıkça) debi de değişir; hassas dozlama istiyorsan sabit bir 5 V kaynağı kullan.

Kuru çalıştırma ve sifon etkisi: pompanın iki gizli düşmanı

Pompanın yatağını yağlayan ve motorunu soğutan şey sudur. Depo boşaldığında pompa havada döner, çark yatağı sürtünmeyle ısınır, plastik parçalar yumuşar ve motor normalden yüksek devirde döner. Birkaç saniyelik kuru çalışma çoğu pompayı öldürmez, ama dakikalarca kuru dönen bir pompa ya sıkışır ya da sesi değişip debisini kaybeder. Otomatik sistemlerde bunu önlemenin iki yolu vardır: depoya bir su seviye sensörü ya da şamandıralı anahtar koymak ve kodda pompanın tek seferde en fazla ne kadar çalışabileceğini sınırlamak. Aşağıdaki otomatik sulama kodu ikisini birden yapar.

Sifon etkisine dikkat: Hortumun ucu depodaki su seviyesinden aşağıdaysa, pompa durduktan sonra da su yerçekimiyle akmaya devam eder ve depo saksının içine boşalır. Hortumun en yüksek noktasını her zaman depodaki suyun üzerinde tut ya da hortumun en üst noktasına iğneyle küçük bir hava deliği aç; pompa durunca hava girer ve akış kesilir.

Adım adım: ilk pompa testi

  1. Pompayı içi su dolu bir kaba tamamen batır ve çıkışına 30–50 cm silikon hortum tak; hortumun ucunu ikinci bir kaba yönlendir.
  2. IRLZ44N'i breadboard'a yerleştir. Gate'i 220 Ω ile D9'a, ayrıca 10 kΩ ile GND'ye bağla; source'u GND'ye bağla.
  3. Pompanın siyah kablosunu drain'e, kırmızı kablosunu harici 5 V'un artısına bağla. 1N5819 diyotu pompanın iki ucuna, çizgili uç artıya gelecek şekilde tak.
  4. Harici beslemenin eksisini Arduino'nun GND'sine bağla; bağlantıları bir kez daha kontrol et ve ardından beslemeyi aç.
  5. Aşağıdaki kodu yükle ve Seri Monitör'ü 9600 baud hızında aç. Pompa 3 saniye çalışıp 10 saniye durmalı.
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}

Pompa çalışmıyorsa önce ortak GND'yi, sonra MOSFET'in bacak sırasını kontrol et; pompa durmuyorsa drain ile source yer değiştirmiş olabilir. Debiyi ölçmek için aynı kodda delay(3000) değerini delay(10000) yapıp hortumu ölçü kabına tutman yeterli. Bu kod delay() kullandığı için pompa çalışırken Arduino başka iş yapamaz; sonraki örneklerde zamanı millis() ile tutacağız. Farkı merak ediyorsan millis ve delay yazısına göz at.

PWM ile pompa hızını ayarlamak

MOSFET kullanmanın en büyük avantajı, pompanın hızını PWM ile ayarlayabilmendir. Yavaş akış bir şelalede daha doğal görünür, bir akvaryum filtresinde suyu daha az bulandırır ve dozlamada daha ince ayar sağlar. İki pratik sorun vardır. Birincisi, küçük pompalar düşük doluluk oranında (genellikle %30–40'ın altında) dönmeye başlayamaz ve yalnızca vızıldar; bu yüzden kod pompayı önce kısa bir tam güç darbesiyle kaldırır, sonra istenen hıza indirir. İkincisi, Uno'nun D9 pinindeki 490 Hz'lik PWM pompayı duyulur biçimde ötürür; kod bu frekansı 3,9 kHz'e çıkarır.

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}

Potansiyometrenin orta ucunu A0'a, kenar uçlarını 5V ve GND'ye bağla. TCCR1B satırı yalnızca Timer1'i, yani D9 ve D10 pinlerini etkiler; millis() ve delay() Timer0'ı kullandığı için bozulmaz. Ancak Servo kütüphanesi de Timer1'i kullanır, aynı projede servo varsa bu satırı çıkar. MIN_DUTY değerini kendi pompanla bul: potansiyometreyi yavaşça çevir, pompanın kendiliğinden kalkabildiği en düşük değeri Seri Monitör'den oku ve üzerine biraz pay ekle. Pompanın gerilimini düşürmek basma yüksekliğini de düşürür; yarım hızda pompa suyu tam hızdaki yüksekliğin yaklaşık dörtte birine kadar çıkarabilir, çünkü santrifüj pompanın basıncı devrin karesiyle orantılıdır.

Sıvı dağıtıcı: butona basınca tam 50 ml

Debiyi ölçtükten sonra pompayı bir dozaj makinesine çevirmek kolaydır: istenen miktarı debiye bölersen pompanın ne kadar çalışacağını bulursun. Aşağıdaki kod, D2 ile GND arasına bağlanan butona her basıldığında 50 ml sıvı verir; pompa çalışırken butona yeniden basarsan dozu iptal eder. Zaman millis() ile ölçüldüğü için döngü hiç beklemez ve butonu sürekli okuyabilir. Sabun dağıtıcı, bitki gübresi dozlayıcı ya da kokteyl makinesi gibi projelerin temeli budur.

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}

İlk dozun diğerlerinden az çıktığını görürsen sebebi büyük ihtimalle boş hortumdur: pompa önce hortumu doldurur, sonra sıvıyı dışarı verir. Hortumun ucunu depodaki suyun biraz üzerinde tutarsan hortum dolu kalır ve her doz aynı olur. Yağ, şurup ya da sabun gibi koyu sıvılarda debi sudan çok daha düşüktür; kalibrasyonu mutlaka o sıvıyla yap. Gıda ile temas edecek projelerde gıdaya uygun silikon hortum kullan ve pompayı her kullanımdan sonra temiz suyla çalkala.

Toprak nemine göre otomatik sulama

En popüler Arduino su pompası projesi, toprak kuruyunca kendi kendine sulayan saksıdır. Burada yeni başlayanların düştüğü tuzak, pompayı toprak nemi hedefe ulaşana kadar çalıştırmaktır: su sensöre ulaşana kadar dakikalar geçer ve bu sürede saksı taşar. Doğru yöntem kısa darbelerle sulamaktır: pompa 4 saniye çalışır, sonra suyun toprağa yayılması için 1 dakika beklenir ve nem yeniden ölçülür. Kod ayrıca depo boşsa pompayı hiç çalıştırmaz ve 6 darbeden sonra nem hâlâ yükselmiyorsa (sensör topraktan çıkmış ya da hortum kopmuş olabilir) sistemi kilitleyip LED'i yakar. Sensörün kalibrasyonunu toprak nem sensörü yazısında ayrıntılı anlattık.

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}

Kodda iki ayrı eşik kullanılması bilinçlidir: nem %35'in altına düşünce sulama başlar, ama %55'e çıkana kadar sürer. Bu histerezis sayesinde pompa, eşiğin tam sınırında gidip gelen bir ölçüm yüzünden sürekli açılıp kapanmaz. DRY_VALUE ve WET_VALUE değerlerini kendi sensörünle ölç; kapasitif sensörlerde bu değerler besleme gerilimine ve kablo uzunluğuna göre değişir. Şamandıranın kablosu koparsa pin HIGH okur ve kod bunu boş depo sayar; yani arıza durumunda sistem güvenli tarafta kalıp pompayı durdurur. Sulamayı belirli saatlere bağlamak istersen bir RTC saat modülü ekleyip koşula saat kontrolü koyabilirsin.

Röle ile pompa kontrolü ne zaman mantıklı?

Elinde yalnızca bir röle modülü varsa mini pompayı onunla da çalıştırabilirsin: pompanın artı kablosu harici beslemeden rölenin COM ucuna, NO ucundan pompaya gider; eksi kablo beslemenin eksisine bağlanır. Röle pompayı kartın devresinden tamamen yalıtır ve aynı modülle 12 V'luk büyük pompalar ya da şebekeye bağlı akvaryum pompaları da açılıp kapanabilir. Buna karşılık röle PWM ile hız ayarı yapamaz, her anahtarlamada tıklar, kontakları zamanla aşınır ve bobini kendi başına 70 mA civarında akım çeker. Pompayı günde birkaç kez açıp kapatacaksan röle iş görür; dozlama ya da hız ayarı gerekiyorsa MOSFET her zaman daha iyidir. Röle kullansan bile pompanın uçlarına diyot koymak kontak arkını azaltır.

ESP32 ile telefondan su pompası kontrolü

ESP32'nin Wi-Fi'si sayesinde pompayı telefonunun tarayıcısından çalıştırabilirsin. Aşağıdaki kod ESP32'de küçük bir web sunucusu açar; aynı ağdaki telefondan Seri Monitör'de yazan IP adresine girdiğinde 5 ve 15 saniyelik sulama düğmeleri ile bir durdurma düğmesi görürsün. Ek kütüphane gerekmez, WebServer ESP32 çekirdeğiyle birlikte gelir. Güvenlik için pompa hiçbir durumda 30 saniyeden uzun çalışmaz; bağlantı kopsa bile süre dolunca kendiliğinden durur. ESP32 3,3 V ile çalıştığı için gate'i 3,3 V'ta tam açılan bir MOSFET seç: AO3400A en iyisidir, IRLZ44N de mini pompanın 300 mA'lik akımı için rahatça yeterlidir.

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}

Bu sayfa yalnızca evdeki Wi-Fi ağından açılır. Pompayı dışarıdan da kontrol etmek ya da depo boşalınca bildirim almak istersen ESP32 Telegram bot ya da Blynk yazılarındaki yöntemleri bu koda ekleyebilirsin. Sayfayı WebSocket ile anlık güncellenen bir panele çevirmek için ESP32 Async Web Server yazısına bak. ESP32'nin pinleri 3,3 V çıkış verdiği için IRF520 modülü burada çalışmaz; modül kullanacaksan üzerinde lojik seviye MOSFET olan bir model seç.

Raspberry Pi Pico ile zamanlı sulama (MicroPython)

Pico'da pompayı GP15'e bağlı MOSFET ile sürüp PWM'le yumuşak kalkış yapabilirsin. Yumuşak kalkış, pompanın kalkış akımını birkaç yüz milisaniyeye yayarak besleme gerilimindeki ani düşüşü engeller; Pico ile pompa aynı kaynaktan besleniyorsa bu, rastgele resetleri önler. Aşağıdaki kod 12 saatte bir 8 saniye sular, GP14'e bağlı butona basınca da 3 saniyelik ek sulama yapar. Pico'nun pinleri yalnızca 3,3 V verdiği için burada da AO3400A gibi 3,3 V'ta garantili bir MOSFET tercih et. MicroPython'a yeniysen önce Raspberry Pi Pico nedir yazısına göz atabilirsin.

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)

Kod zamanı time.ticks_diff() ile ölçer; bu fonksiyon sayaç taştığında bile doğru farkı verir. Pico'nun kendi saati kapanınca sıfırlandığı ve gün içinde birkaç saniye kayabildiği için "her sabah 07.00'de sula" gibi gerçek saatlere bağlı bir program istiyorsan bir RTC modülü ekle ya da Pico W kullanıp saati internetten (NTP) al. Elektrik kesintisinden sonra 12 saatlik sayaç baştan başlar; bu çoğu bitki için sorun değildir ama uzun tatil dönüşü projelerinde göz önünde bulundur.

Mini su pompası ile proje fikirleri

  • Tatil sulama sistemi: Bir kova su, birkaç saksı ve uçları saksılara dağılan ince hortumlarla iki hafta boyunca bitkileri sula; kurulumun tamamı akıllı sera projesi yazısında.
  • Otomatik kedi ya da köpek su kabı: Kaptaki su seviyesi düşünce pompa depodan takviye yapsın; seviye için temassız sıvı seviye sensörü kullanılabilir.
  • Temassız sabun ya da dezenfektan dağıtıcı: Bir HC-SR04 ya da kızılötesi sensör eli görünce pompa yarım saniye çalışsın.
  • Kokteyl ve içecek makinesi: Her biri ayrı şişede duran 3–4 pompa, debileri ayrı ayrı ölçülerek tarife göre karışım hazırlasın.
  • Masaüstü şelale ve süs havuzu: PWM ile akışı gece yavaşlatan, LDR ile ortam kararınca kapanan bir çeşme.
  • Akvaryum su takviyesi: Buharlaşan suyu, şamandıra anahtarı seviyenin düştüğünü gösterince ayrı bir depodan tamamlayan sistem.
  • Akıllı ev entegrasyonu: ESP32 ile pompayı MQTT ve Home Assistant üzerinden diğer cihazlarla birlikte otomasyona bağla.

Sık yapılan hatalar ve çözümleri

BelirtiOlası nedenÇözüm
Pompa vızıldıyor ama su basmıyorİçeride hava kalmış ya da pompa su seviyesinin üzerindePompayı tamamen batır, hafifçe sallayarak havasını al; hortumu kıvrılmadan döşe
Pompa çalışınca Arduino resetleniyorPompa Arduino'nun 5V pininden besleniyor ya da diyot yokPompayı ayrı bir 5 V kaynaktan besle, ters paralel 1N5819 ve 100 nF ekle
Pompa hiç çalışmıyorOrtak GND yok ya da MOSFET'in bacak sırası yanlışHarici beslemenin eksisini Arduino GND'sine bağla, G-D-S sırasını kontrol et
Arduino açılırken pompa kısa süre çalışıyorGate boşta, pull-down direnci yokGate ile GND arasına 10 kΩ koy
Pompa durduktan sonra su akmaya devam ediyorSifon etkisi: hortumun ucu depo seviyesinin altındaHortumu yükselt ya da hortumun tepesine küçük bir hava deliği aç
Debi zamanla düşüyorGiriş ızgarası tıkanmış, pil zayıflamış ya da pompa kuru çalışıp yıpranmışGirişi temizle, beslemeyi ölç, su seviye sensörü ekle
Düşük PWM'de pompa dönmüyorDoluluk oranı motorun kalkış eşiğinin altındaKalkışta kısa bir tam güç darbesi ver ve MIN_DUTY'yi yükselt
Devreyi saksının yanına kurmadan önce masada bir test kabıyla bütün senaryoları dene: depo boşken ne oluyor, sensör kablosu çıkınca ne oluyor, elektrik kesilip geri gelince pompa kendi kendine çalışıyor mu? Elektronik kartı her zaman su kabının üstünde değil yanında ya da yukarısında tut ve kabloların suya doğru damlayan bir döngü (damla döngüsü) yapmasını sağla; böylece kablo boyunca süzülen su karta ulaşmaz.

Mini dalgıç pompa, doğru sürüldüğünde yıllarca sorunsuz çalışan ucuz ve sessiz bir parçadır: bir lojik seviye MOSFET, ters bağlı bir diyot, ayrı bir 5 V besleme ve ortak GND ile Arduino'n tamamen güvende kalır. Gerisi senin hayal gücüne kalmış; ölçtüğün debiyle mililitre hassasiyetinde dozlama yapabilir, toprak nemine göre sulayabilir ya da ESP32 ile pompayı telefonundan yönetebilirsin. BlueGrays uygulamasında Akıllı Sulama İstasyonu projesini, ESP32 web sunucusu ve RTC saat projeleriyle birlikte adım adım devre şemaları ve kodlarıyla bulabilirsin.

Sıkça sorulan sorular

Su pompası Arduino'ya nasıl bağlanır?

Mini su pompası Arduino pinine doğrudan bağlanmaz, çünkü pin 20–40 mA verir, pompa ise 150–300 mA ister. Pompanın artısını harici 5 V'a, eksisini IRLZ44N gibi bir lojik seviye MOSFET'in drain bacağına bağla; gate'i 220 Ω ile bir pine, source'u GND'ye bağla. Pompaya ters paralel bir 1N5819 diyot ekle ve iki kaynağın GND'sini birleştir.

Mini su pompası kaç amper çeker?

3–6 V mini dalgıç pompalar çalışırken genellikle 130–220 mA, 6 V'ta 300 mA'e kadar akım çeker. Kalkış anında birkaç milisaniyeliğine bu değerin 2–3 katına çıkabilir. Bu yüzden besleme kaynağını en az 1 A seçmek ve pompayı Arduino'nun 5V pininden beslememek gerekir.

Su pompası röle ile mi MOSFET ile mi sürülmeli?

Mini 3–6 V pompalar için lojik seviye MOSFET daha iyidir: sessizdir, aşınmaz ve PWM ile hız ayarına izin verir. Röle yalnızca aç–kapa yapabilir, tıklar ve bobini ayrıca yaklaşık 70 mA çeker. Röle, 12 V'luk büyük pompalar ya da şebekeye bağlı pompalar için ve pompa günde birkaç kez çalışacaksa mantıklıdır.

Mini su pompası kuru çalışırsa ne olur?

Bu pompalar suyla soğur ve yataklarını su yağlar. Birkaç saniyelik kuru çalışma genellikle zarar vermez, ama dakikalarca kuru dönen pompanın yatağı ısınır, plastik parçaları yıpranır ve pompa sıkışabilir. Otomatik sistemlerde depoya su seviye sensörü ya da şamandıra koy ve kodda en uzun çalışma süresini sınırla.

Mini su pompası suyu kaç metre yükseğe çıkarır?

3–6 V mini dalgıç pompaların en yüksek basma yüksekliği genellikle 40–110 cm arasındadır. Bu yüksekliğe yaklaştıkça debi hızla düşer ve sınırda hortumdan neredeyse hiç su gelmez. Daha yüksek bir noktaya su göndermen gerekiyorsa 12 V'luk daha güçlü bir pompa ya da diyaframlı bir pompa kullan.

Arduino ile su pompasının hızı ayarlanabilir mi?

Evet. Pompayı bir lojik seviye MOSFET ile sürüyorsan PWM pinine analogWrite() vererek hızını ayarlayabilirsin. Küçük pompalar yaklaşık %30–40 doluluk oranının altında kalkamaz, bu yüzden önce kısa bir tam güç darbesi verip sonra hızı düşürmek gerekir. Röle ile hız ayarı yapılamaz.

Tüm projeleri gör
Akıllı Sulama İstasyonu
#83İleri
Premium

Akıllı Sulama İstasyonu

Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

5.0(42)
57
ESP32 Async Web Server (LCD'de IP Göstergeli)
#129İleri

ESP32 Async Web Server (LCD'de IP Göstergeli)

Bu projede ESP32'yi aynı Wi-Fi ağındaki telefonunuzdan veya bilgisayarınızdan kontrol edebileceğiniz asenkron bir web sunucusuna dönüştürüyoruz. ESPAsyncWebServer kütüphanesi sayesinde sunucu birden fazla isteği aynı anda işleyebiliyor (klasik WebServer.h gibi tek istekte bloklamıyor). Tarayıcıdan ESP32'nin IP adresine bağlanıp ON/OFF butonlarına basarak (/on ve /off adresleri) GPIO 5'e bağlı LED'i açıp kapatabileceksiniz.

4.8(16)
26
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
#127İleri

ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)

Bu projede ESP32'yi Station (STA) modunda evdeki Wi-Fi ağına güvenli ve hata toleranslı şekilde bağlıyoruz. SSID/şifreyi secrets.h dosyasına ayırarak Git'e sızmasını önlüyor, otomatik yeniden bağlanma mekanizması kuruyor, RSSI sinyal seviyesini ve IP adresini I2C LCD ekranda gösteriyoruz. Dahili LED durum göstergesi olarak çalışır. Üretim seviyesi bir bağlantı yöneticisidir.

4.4(21)
34
ESP32 RTC DS1307 ile Dijital Saat (I2C + LCD)
#120Orta
Premium

ESP32 RTC DS1307 ile Dijital Saat (I2C + LCD)

Bu projede DS1307 gerçek zaman saati (RTC) modülü ile 16x2 I2C LCD ekrana saat ve tarih bilgisi yansıtıyoruz. DS1307 pil destekli bir RTC'dir; ESP32 kapansa bile zamanı korur. Her iki modül de aynı I2C hattını (SDA/SCL) paylaşır, böylece sadece iki sinyal kablosu ile çoklu cihaz kontrolü öğrenmiş oluruz. Bu proje sayesinde I2C haberleşme protokolünü, RTC modüllerinin çalışma prensibini ve LCD ekranda dinamik veri gösterimini pratik bir şekilde öğreneceksiniz.

4.6(26)
40
DS1302 RTC Saat Modülü Kurulum
#45Başlangıç

DS1302 RTC Saat Modülü Kurulum

Arduino kapansa bile zamanı unutmayan küçük bir saat modülünü çalıştırırsın. Modülün kendi minik pili vardır; saat bir kez ayarlandıktan sonra tarih ve saat her saniye bilgisayar ekranına yazılır. Ala

4.5(23)
31
Bluetooth İle Telefondan Led Yakma
#34Başlangıç
Premium

Bluetooth İle Telefondan Led Yakma

Telefonundan odadaki ışıkları açıp kapatmanın küçük bir provası. Bluetooth modülü telefondan gelen harfleri Arduino'ya iletir; bir harf kırmızı LED'i, başka bir harf yeşil LED'i yakar, aynı harflerin

4.8(68)
89
ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)
#141İleri
Premium

ESP32 Akıllı Aydınlatma (PIR + LDR + Röle + OLED)

ESP32, PIR hareket sensörü, LDR ışık sensörü ve röle modülü ile evinin koridorunu, tuvaletini veya kilerini akıllı aydınlatmaya dönüştürüyoruz. Klasik "karanlıkta hareket algılanınca ışık yansın" senaryosunu inşa ediyoruz — ortam aydınlıksa hareket olsa bile ışık yanmaz, böylece gündüz gereksiz yere yanmaz ve enerji tasarrufu sağlanır. Işık 30 saniye yanık kalır; hareket devam ederse timer otomatik sıfırlanır ve süre uzar. SSD1306 OLED ekranda büyük fontlarla durum (AÇIK / GÜNDÜZ / BEKLE), geri

4.3(6)
11