Boleh β anda boleh bina sistem siram pokok automatik dengan Arduino Uno dalam masa sejam lebih kurang, tanpa perlu solder. Uno baca sensor kelembapan tanah capacitive pada A0, dan bila kelembapan tanah jatuh bawah threshold yang anda kalibrasi, ia trigger relay yang hidupkan pump submersible 5V kecil. Ada safety timeout supaya pasu tak banjir.
Macam mana sistem siram pokok automatik berfungsi?
Arduino Uno berjalan dalam loop ringkas sense-decide-act: sensor kelembapan tanah capacitive keluarkan voltan yang berubah ikut kandungan air, Uno banding bacaan tu dengan dua threshold yang dah dikalibrasi, dan relay module hidupkan pump. Corak yang sama dengan projek jemuran automatik dengan sensor hujan kami β tukar sensor dan actuator, logiknya kekal sama.
Air disimpan dalam apa-apa bekas β tub aiskrim lama pun boleh β dengan pump di dalamnya dan tiub silikon menghala ke pokok. Bila tanah baca kering, pump tolak air sampai sensor baca lembap semula.
Apa komponen yang diperlukan?
Arduino Uno, sensor kelembapan tanah capacitive, relay module dan pump 5V β empat modul ni sahaja untuk keseluruhan projek, disambung dengan jumper wire dan tiub pendek pump. Arduino Uno compatible (CH340G) jadi otaknya; sensor, relay dan pump uruskan bahagian input dan output.
Senarai komponen
Sediakan juga satu USB power bank atau charger telefon 5V lebih β pump dapat bekalan kuasa sendiri, dan bahagian wiring nanti terangkan kenapa.
Kenapa pilih sensor kelembapan tanah capacitive, bukan jenis garpu dua pin?
Sensor kelembapan tanah capacitive v1.2 (CAPSOIL) mengesan melalui lapisan solder-mask, jadi tiada logam terdedah yang sentuh tanah. Sensor garpu resistive yang murah alirkan arus terus melalui tanah lembap, dan electrolysis perlahan-lahan makan sadurannya; untuk projek yang memang nak dibiar jalan sendiri, probe capacitive jauh lebih tahan lama.
Ia boleh guna bekalan 3.3β5.5V, tapi outputnya tak pernah swing penuh dari rail ke rail: pada bekalan 5V, jangkakan sekitar 3V dalam udara kering, turun ke sekitar 1.5V dalam air. Voltan lebih rendah maksudnya tanah lebih lembap, dan julat tepat setiap unit berbeza β sebab itulah kalibrasi jadi langkah wajib, bukan pilihan.
Satu amaran pasal clone: sesetengah batch guna varian 555 timer atau wiring regulator yang hanya elok pada 5V, atau keluarkan output hampir paras supply rail. Pada Uno 5V benda ni tak jadi masalah; cuma ukur dulu outputnya sebelum percayakan sensor tu pada board 3.3V.
Macam mana nak wiring sensor, relay dan pump?
Relay module 5V (1WRELAY) jadi jambatan antara otak Uno dengan tenaga pump β jangan sesekali pacu pump terus dari pin Arduino. Pin Uno hanya mampu sekitar 20mA berterusan (maksimum mutlak 40mA), sedangkan coil relay sahaja tarik sekitar 70mA dan mini pump pula ambil dalam lingkungan 100β220mA dengan spike lebih besar masa start. Pin cuma bagi isyarat pada relay module; arus berat mengalir di laluan lain.
| Pin modul | Pin Arduino Uno | Fungsi |
|---|---|---|
| CAPSOIL VCC (merah) | 5V | Bekalan sensor |
| CAPSOIL GND (hitam) | GND | Ground |
| CAPSOIL AOUT (kuning) | A0 | Isyarat analog kelembapan |
| 1WRELAY VCC | 5V | Kuasa coil relay dan opto |
| 1WRELAY GND | GND | Ground |
| 1WRELAY IN | D7 | Isyarat trigger (active LOW) |
Pada kebanyakan relay board opto-isolated, pin IN adalah active LOW β tarik IN ke GND akan energize relay β dan board tu dah sedia ada driver transistor dan flyback diode sendiri, jadi bahagian coil tak perlu komponen tambahan. Sketch di bawah anggap active LOW; kalau relay anda berkelakuan terbalik, tukar dua constant di bahagian paling atas.

| Dari | Ke | Nota |
|---|---|---|
| Power bank 5V (+) | Terminal COM relay | Bekalan pump masuk ke suis |
| Terminal NO relay | Wayar merah pump | NO = normally open, jadi pump default-nya mati |
| Wayar hitam pump | Power bank GND (β) | Lengkapkan litar pump |
Bekalkan kuasa mini pump submersible dari sumber 5V berasingan tu, bukan dari pin 5V Uno. Spike arus motor yang lalu regulator Uno ialah punca bug klasik “Arduino saya restart setiap kali pump start”. Sebab contact relay terpisah secara elektrik, litar pump langsung tak perlu kongsi ground dengan Uno.
Dua peraturan penempatan: jauhkan kabel sensor dari wayar pump, sebab hingar motor boleh goyangkan bacaan analog, dan pastikan pump sentiasa tenggelam penuh dalam air β ia bergantung pada air untuk penyejukan dan tak boleh sesekali jalan kering.

Macam mana nak kalibrasi sensor kelembapan tanah?
Sensor kelembapan tanah capacitive tak pernah baca julat penuh ADC 0β1023, dan tiada dua unit yang baca sama, jadi kalibrasi cuma perlukan dua ukuran ringkas. Dengan serial monitor terbuka, catat nilai raw semasa probe kering di udara terbuka (biasanya sekitar 590 pada Uno 5V) dan sekali lagi semasa dicelup dalam segelas air (biasanya sekitar 270). Dua nombor itulah yang jadi RAW_AIR dan RAW_WATER dalam sketch.
Cucuk probe hanya sampai garisan had yang tercetak melintang pada PCB, biar komponen SMD kekal di atas tanah dan bebas percikan air. Kalau tanam sampai ke bahagian elektronik, hilanglah kelebihan tahan karat yang jadi sebab anda pilih sensor ni.

Macam mana rupa kod siraman yang selamat?
Sketch Arduino di bawah siram ikut band, bukan satu threshold: pump start bila kelembapan jatuh bawah 35% dan berhenti selepas naik melepasi 55%. Satu threshold sahaja akan buat relay chatter on-off di sempadan; band bagi setiap sesi siraman start dan stop yang bersih.
Tiga jaring keselamatan siap terbina dalam. Pump jalan paling lama lebih kurang lapan saat setiap kitaran, jarak antara siraman sekurang-kurangnya 30 minit, dan mana-mana bacaan di luar julat kalibrasi terus kunci pump off β sensor tercabut biarkan A0 floating, dan bacaannya biasanya hanyut keluar dari julat tu. Air bergerak dalam tanah secara perlahan, jadi pulse pendek berselang rehat lebih berkesan dari satu rendaman panjang.
// Siram pokok automatik β Arduino Uno + sensor tanah capacitive v1.2 + relay + pump 5V
// AOUT sensor ke A0, IN relay ke D7. Kebanyakan relay board opto adalah ACTIVE LOW.
const int SENSOR_PIN = A0;
const int RELAY_PIN = 7;
const int RELAY_ON = LOW; // tukar dua nilai ni kalau relay board anda active HIGH
const int RELAY_OFF = HIGH;
// ---- Kalibrasi: ganti dengan bacaan ANDA (rujuk bahagian kalibrasi) ----
const int RAW_AIR = 590; // bacaan raw, probe kering di udara terbuka
const int RAW_WATER = 270; // bacaan raw, probe dalam segelas air
// ---- Band siraman (hysteresis) ----
const int START_PUMP_BELOW_PCT = 35; // lebih kering dari ni -> mula siram
const int STOP_PUMP_ABOVE_PCT = 55; // lebih lembap dari ni -> berhenti siram
// ---- Had keselamatan ----
const unsigned long MAX_PUMP_MS = 8000UL; // maksimum 8 saat pam setiap kitaran
const unsigned long MIN_GAP_MS = 30UL * 60UL * 1000UL; // sekurang-kurangnya 30 minit antara siraman
const int FAULT_MARGIN = 60; // bacaan di luar julat kalibrasi +/- margin = sensor fault
bool pumping = false;
unsigned long pumpStartedAt = 0;
unsigned long lastWateringAt = 0;
void setup() {
digitalWrite(RELAY_PIN, RELAY_OFF); // tulis keadaan OFF dulu sebelum pin diaktifkan
pinMode(RELAY_PIN, OUTPUT);
Serial.begin(9600);
}
int readMoisturePct() {
long sum = 0;
for (int i = 0; i < 10; i++) { // purata 10 bacaan untuk redakan hingar motor
sum += analogRead(SENSOR_PIN);
delay(20);
}
int raw = sum / 10;
// Pin tercabut akan floating dan boleh baca apa saja -> anggap sebagai fault.
if (raw > RAW_AIR + FAULT_MARGIN || raw < RAW_WATER - FAULT_MARGIN) {
return -1;
}
// Raw lebih rendah = lebih lembap. Map ke 0 % (kering udara) .. 100 % (dalam air).
int pct = map(raw, RAW_AIR, RAW_WATER, 0, 100);
return constrain(pct, 0, 100);
}
void loop() {
int moisture = readMoisturePct();
unsigned long now = millis();
if (moisture < 0) { // sensor fault -> fail safe: pump dikunci off
digitalWrite(RELAY_PIN, RELAY_OFF);
pumping = false;
Serial.println("Sensor fault - pump locked off");
delay(5000);
return;
}
if (!pumping) {
bool dryEnough = (moisture <= START_PUMP_BELOW_PCT);
bool rested = (lastWateringAt == 0) || (now - lastWateringAt >= MIN_GAP_MS);
if (dryEnough && rested) {
pumping = true;
pumpStartedAt = now;
digitalWrite(RELAY_PIN, RELAY_ON);
}
} else {
bool wetEnough = (moisture >= STOP_PUMP_ABOVE_PCT);
bool timedOut = (now - pumpStartedAt >= MAX_PUMP_MS);
if (wetEnough || timedOut) {
pumping = false;
lastWateringAt = now;
digitalWrite(RELAY_PIN, RELAY_OFF);
}
}
Serial.print("Moisture: ");
Serial.print(moisture);
Serial.println(" %");
delay(1000);
}
Nak tengok dulu build sensor-relay-pump yang serupa disiapkan sebelum anda mula? Walkthrough ni tunjuk rantaian yang sama:
Kesilapan biasa yang kami jumpa daripada pelanggan sebenar
Pin sensor tak berlabel. “air sensor takde label VCC/GND/SIG” β ada batch sensor yang sampai dengan silkscreen pudar atau langsung tiada. Pada kabel yang disertakan dengan sensor CAPSOIL, kebiasaannya merah = VCC, hitam = GND, kuning = analog out; kalau warna anda lain, sahkan pad mana yang terima bekalan guna multimeter sebelum hidupkan power.
Bekalkan pump dari pin 5V Uno. Nampak okay masa test atas meja, lepas tu Uno reset tengah-tengah siraman. Bagi pump power bank atau charger sendiri, dan misteri reset tu terus hilang.
Guna satu threshold, bukan band. Betul-betul di threshold, bacaan jitter beberapa count, jadi relay chatter on-off laju. Hysteresis band dalam sketch memang wujud untuk elak benda ni.
Tanam sensor sampai ke connector. Bahagian probe memang tahan karat; komponen di atasnya tidak. Cucuk sampai garisan had sahaja, dan jaga bahagian elektronik dari percikan air siraman.
Soalan Lazim (FAQ)
Boleh ke guna sensor capacitive ni dengan ESP32 atau board 3.3V lain?
Boleh β julat bekalannya 3.3β5.5V. Tapi sebab ada batch clone yang bermasalah bawah 5V atau keluarkan output hampir paras supply rail, hidupkan sensor dulu dan ukur outputnya, pastikan ia kekal bawah 3.3V sebelum sambung ke input analog 3.3V.
Kenapa pump saya jalan tak berhenti sampai pasu melimpah?
Selalunya sebab sensor tak duduk di zon yang air betul-betul sampai, jadi ia tak pernah baca lembap. Alihkan probe dekat dengan akar di tempat tiub menitik, dan kekalkan timeout MAX_PUMP_MS dalam sketch β itulah penyelamat yang hadkan setiap sesi siraman.
Boleh ke seluruh sistem ni jalan guna bateri?
USB power bank boleh bekalkan Uno dan pump serentak, cuma banyak power bank auto-sleep bila beban terlalu kecil β test power bank anda semalaman dulu. Untuk bekalan berasaskan 18650 yang lebih jimat, rujuk panduan cas 18650 dengan TP4056 kami.
Kenapa relay klik sekali masa Arduino baru boot?
Punca biasa ialah urutan initialization: pinMode(pin, OUTPUT) default-nya pacu pin ke LOW, dan pada board active-LOW itu akan tarik relay masuk sampai arahan OFF sempat ditulis. Sketch ni elak masalah tu dengan tulis keadaan OFF sebelum pin diaktifkan, jadi relay kekal lepas sepanjang start-up; bunyi klik ringkas dari modul sendiri masa power naik tak jadi apa-apa masalah untuk pump air.
Boleh ke pump jalan tanpa air?
Tak boleh β mini pump submersible bergantung pada air untuk penyejukan dan pelinciran. Pastikan intake sentiasa bawah paras air, tambah air dalam bekas sebelum ia kering, dan biar timeout pump dalam kod hadkan kerosakan kalau bekas betul-betul kehabisan air.
Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.



Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
Capacitive Soil Moisture Sensor V1.2 Corrosion Resistant with Cable For Arduino IOT Application
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)
Mini Water Pump Submersible DC 3V-5V - 5V WATER PUMP