
Penggunaan Arduino Nano sebagai pengontrol otomatisasi sistem pengairan atau pengisian tangki air merupakan salah satu proyek elektronika terapan yang paling populer dan praktis. Dengan mengombinasikan ukuran mikrokontroler yang ringkas dan modul relai (relay module), kita dapat mengendalikan beban bertegangan tinggi seperti pompa air AC 220V secara aman melalui sinyal logika bertegangan rendah (5V).
Artikel ini membahas secara rinci prinsip kerja, skema perkabelan, komponen yang dibutuhkan, serta kode program untuk membangun sistem kontrol pompa air otomatis berbasis Arduino Nano.
1. Komponen Utama yang Dibutuhkan
| Komponen | Spesifikasi / Keterangan | Fungsi Utama |
| Arduino Nano | ATmega328P, 5V, 16MHz | Pengendali logika utama |
| Modul Relai 1-Channel | 5V Optocoupler (Active LOW/HIGH) | Sakelar elektronik pemicu beban 220V |
| Pompa Air | Pompa Celup / Pompa Air AC 220V | Beban utama pengangkut air |
| Sensor Water Level / Pelampung | Floating Switch / Sensor Ketinggian Air | Pendeteksi status air tangki/sumur |
| Catu Daya / Adaptor | 5V 1A-2A (Micro USB atau via Pin Vin) | Sumber daya Arduino Nano |
| Kabel Jumper & Cable Gland | Male-to-Female & Terminal Blok | Jalur koneksi sinyal & daya |
2. Prinsip Kerja Sistem
Modul relai berfungsi sebagai jembatan pembatas (isolator) antara sirkuit digital Arduino yang bertegangan rendah (5V DC) dan sirkuit daya pompa air (220V AC).
-
Pembacaan Input: Arduino Nano membaca sinyal masukan dari sensor ketinggian air (misalnya sakelar pelampung).
-
Pemrosesan Logika: Jika tangki air terdeteksi kosong, Arduino akan mengirim sinyal logika ke pin kontrol relai.
-
Eksekusi Sakelar: Modul relai mengaktifkan kumparan elektromagnetik (coil), menutup kontak sakelar internal (Normally Open / NO menjadi Closed), dan menyambungkan arus listrik PLN 220V ke pompa air.
-
Pemutusan Otomatis: Saat tangki sudah penuh, sinyal kontrol dimatikan, relai terbuka kembali, dan pompa air berhenti beroperasi.
3. Skema Rangkaian & Perkabelan
Diagram Pengkabelan (Pinout List)
A. Sisi Sinyal Logika (Arduino Nano ke Modul Relai & Sensor)
-
VCC Relai $\rightarrow$ Pin 5V Arduino Nano
-
GND Relai $\rightarrow$ Pin GND Arduino Nano
-
IN (Input Relai) $\rightarrow$ Pin D3 Arduino Nano
-
Sensor Pelampung (Pin 1) $\rightarrow$ Pin D2 Arduino Nano (Di-set internal
INPUT_PULLUP) -
Sensor Pelampung (Pin 2) $\rightarrow$ Pin GND Arduino Nano
B. Sisi Tegangan Tinggi (Modul Relai ke Pompa Air 220V AC)
-
Kabel Fasa (Live) PLN $\rightarrow$ Pin COM (Common) pada Modul Relai.
-
Pin NO (Normally Open) Relai $\rightarrow$ Salah satu kabel daya Pompa Air.
-
Kabel Netral PLN $\rightarrow$ Directly terhubung ke kabel daya Pompa Air yang tersisa.
Peringatan Keselamatan: Pemasangan kabel AC 220V berisiko tersengat listrik. Pastikan catu daya utama PLN terputus penuh saat merangkai kabel daya ke terminal modul relai.
4. Kode Program (Arduino IDE)
Kode berikut menggunakan fitur debounce logic sederhana dan memanfaatkan Internal Pull-Up Resistor pada pin sensor untuk menghindari sinyal palsu (noise) akibat goncangan air pada tangki.
// Definisi Pin
const int PIN_SENSOR = 2; // Pin untuk Sakelar Pelampung
const int PIN_RELAY = 3; // Pin Kontrol Modul Relai
// Catatan Relai: Mayoritas Modul Relai 5V bersifat Active LOW
// (LOW = Relai Nyala, HIGH = Relai Mati)
const int RELAY_ON = LOW;
const int RELAY_OFF = HIGH;
void setup() {
Serial.begin(9600);
// Inisialisasi Pin Output Relai
pinMode(PIN_RELAY, OUTPUT);
// Matikan pompa di awal booting untuk keamanan
digitalWrite(PIN_RELAY, RELAY_OFF);
// Inisialisasi Pin Input Sensor dengan Internal Pull-Up
pinMode(PIN_SENSOR, INPUT_PULLUP);
Serial.println("Sistem Kontrol Pompa Air Arduino Nano Siap.");
}
void loop() {
// Membaca kondisi sakelar pelampung
// LOW = Pelampung turun (Air Kosong / Butuh Pompa)
// HIGH = Pelampung terangkat (Air Penuh)
int statusAir = digitalRead(PIN_SENSOR);
if (statusAir == LOW) {
// Tangki Air Kosong -> Nyalakan Pompa
digitalWrite(PIN_RELAY, RELAY_ON);
Serial.println("Status: Tangki Kosong -> Pompa Air NYALA");
} else {
// Tangki Air Penuh -> Matikan Pompa
digitalWrite(PIN_RELAY, RELAY_OFF);
Serial.println("Status: Tangki Penuh -> Pompa Air MATI");
}
// Jeda pembacaan untuk stabilitas
delay(1000);
}
5. Fitur Pengaman Tambahan (Tips Proyek Industri)
Untuk menghindari kerusakan pada pompa air atau relai saat diterapkan pada kehidupan sehari-hari, pertimbangkan untuk menambahkan pengaman berikut:
-
Diode Freewheeling & Optocoupler: Gunakan modul relai yang sudah dilengkapi komponen isolasi optocoupler (seperti modul relai Songle 5V) untuk mencegah arus balik (back-EMF) dari mesin pompa merusak mikrokontroler Arduino.
-
Timer Timeout (Dry Run Protection): Tambahkan batas waktu maksimum menyalanya pompa pada kode program. Jika pompa menyala lebih dari 30 menit namun air tidak kunjung penuh (misal karena sumur kering), sistem akan otomatis mematikan relai untuk mencegah pompa terbakar.
-
Histeresis 2-Sensor: Gunakan dua buah sensor pelampung (sensor batas bawah dan sensor batas atas) agar relai tidak cetrek-cetrik (sakelar terputus-sambung berulang kali) saat permukaan air bergelombang.
Kesimpulan
Mengontrol pompa air menggunakan Arduino Nano dan modul relai adalah solusi praktis dan terjangkau untuk membangun sistem pengairan otomatis. Dengan penambahan logika keamanan program serta pengkabelan tegangan AC 220V yang rapi dan terisolasi, sistem ini dapat bekerja secara andal untuk kebutuhan rumah tangga maupun pertanian.
========================================================================
Dengan Arduflow

Diagram visual di atas mendeskripsikan sistem Kontrol Pompa Air Otomatis menggunakan Arduino Nano. Sistem ini membaca input dari sensor pelampung (float switch) untuk mengatur hidup/matinya pompa air via relay (active-low) serta mencetak status sistem pada log serial.
Komponen & Peran Node
-
Sensor & Input:
-
readFloatSensor(DIGITAL IN - Pin 2): Membaca kondisi sensor pelampung dengan mode internal pull-up diaktifkan. -
constLowValue(BOOLEAN LOW): Menyediakan acuan pembanding logika bernilaiLOW(false).
-
-
Logika Pemprosesan:
-
compareEmpty(COMPARE==): Membandingkan pembacaan Pin 2 denganconstLowValue. Menghasilkantruejika kondisi tangki kosong (sensor terbacaLOW). -
ifElseRelayState(IF THEN ELSE): Menentukan sinyal daya relay berdasarkan hasil komparasi. -
logicNotEmpty(LOGIC NOT): Membalikkan status komparasi untuk memicu log kondisi saat tangki penuh. -
triggerLogEmpty&triggerLogFull(LOGIC AND): Menghubungkan logika status dengandummyTrigger(BOOLEAN HIGH) untuk memicu node log status secara konsisten.
-
-
Output & Log:
-
controlRelay(DIGITAL OUT - Pin 3): Mengendalikan modul relay yang terhubung ke pompa air. -
systemReadyLog,logEmptyStatus,logFullStatus(VALUE MONITOR / Serial Log): Menampilkan pesan status sistem pada konsol pemantau.
-
Cara Kerja Sistem
-
Inisialisasi Sistem: Node
setupLogTriggerlangsung memicusystemReadyLoguntuk menampilkan log awal: "Sistem Kontrol Pompa Air Arduino Nano Siap." -
Kondisi Tangki Kosong (Sensor = LOW):
-
Sensor membaca nilai
LOW, lalu nodecompareEmptymencocokkannya denganconstLowValuesehingga bernilaitrue. -
Node
ifElseRelayStatemeneruskan nilaiconstRelayOnValue(LOW/0) ke Pin 3 (controlRelay), yang menyebabkan Pompa Air NYALA (relay active-low bekerja saat diberi sinyalLOW). -
Node
triggerLogEmptyaktif dan menampilkan log serial: "Status: Tangki Kosong -> Pompa Air NYALA".
-
-
Kondisi Tangki Penuh (Sensor = HIGH):
-
Ketika tangki terisi, sensor terbaca
HIGHsehingga pembandingcompareEmptybernilaifalse. -
Node
ifElseRelayStatemengalihkan output keconstRelayOffValue(HIGH/1) ke Pin 3, sehingga Pompa Air MATI. -
Sinyal
falsedibalikkan olehlogicNotEmptymenjaditrueuntuk mengaktifkantriggerLogFull, lalu mencetak log: "Status: Tangki Penuh -> Pompa Air MATI".
-
Kode JSON: OPEN IDE
{
"name": "kontrol-pompa-air",
"board": "nano",
"nodes": [
{
"id": "setupLogTrigger",
"type": "constant",
"position": {
"x": 100,
"y": 50
},
"data": {
"value": true
},
"measured": {
"width": 160,
"height": 106
},
"selected": false
},
{
"id": "systemReadyLog",
"type": "serialLog",
"position": {
"x": 350,
"y": 50
},
"data": {
"label": "Sistem Kontrol Pompa Air Arduino Nano Siap.",
"value": true
},
"measured": {
"width": 178,
"height": 125
}
},
{
"id": "readFloatSensor",
"type": "digitalRead",
"position": {
"x": 100,
"y": 200
},
"data": {
"pin": "2",
"pullup": true,
"lastPullup": true
},
"measured": {
"width": 160,
"height": 151
}
},
{
"id": "constLowValue",
"type": "constant",
"position": {
"x": 100,
"y": 379.784375
},
"data": {
"value": false
},
"measured": {
"width": 160,
"height": 106
},
"selected": false,
"dragging": false
},
{
"id": "compareEmpty",
"type": "compare",
"position": {
"x": 350,
"y": 275
},
"data": {
"mode": "==",
"value": true
},
"measured": {
"width": 178,
"height": 165
}
},
{
"id": "logicNotEmpty",
"type": "logicNot",
"position": {
"x": 394.125,
"y": 511.0437500000001
},
"data": {
"value": false
},
"measured": {
"width": 160,
"height": 129
},
"selected": false,
"dragging": false
},
{
"id": "constRelayOnValue",
"type": "constant",
"position": {
"x": 100,
"y": 500
},
"data": {
"value": false
},
"measured": {
"width": 160,
"height": 106
},
"selected": false
},
{
"id": "constRelayOffValue",
"type": "constant",
"position": {
"x": 100,
"y": 650
},
"data": {
"value": true
},
"measured": {
"width": 160,
"height": 106
},
"selected": false
},
{
"id": "ifElseRelayState",
"type": "ifElse",
"position": {
"x": 601.103125,
"y": 117.63749999999999
},
"data": {
"value": false
},
"measured": {
"width": 160,
"height": 201
},
"selected": false,
"dragging": false
},
{
"id": "controlRelay",
"type": "digitalWrite",
"position": {
"x": 852.2062500000001,
"y": 150.73125
},
"data": {
"pin": "3",
"value": false,
"lastStateKey": "3-false-undefined"
},
"measured": {
"width": 167,
"height": 164
},
"selected": false,
"dragging": false
},
{
"id": "dummyTrigger",
"type": "constant",
"position": {
"x": 395.921875,
"y": 662.8781250000001
},
"data": {
"value": true
},
"measured": {
"width": 160,
"height": 106
},
"selected": false,
"dragging": false
},
{
"id": "triggerLogEmpty",
"type": "logicAnd",
"position": {
"x": 600,
"y": 350
},
"data": {
"value": true
},
"measured": {
"width": 160,
"height": 165
}
},
{
"id": "logEmptyStatus",
"type": "serialLog",
"position": {
"x": 850,
"y": 350
},
"data": {
"label": "Status: Tangki Kosong -> Pompa Air NYALA",
"value": true
},
"measured": {
"width": 178,
"height": 125
}
},
{
"id": "triggerLogFull",
"type": "logicAnd",
"position": {
"x": 629.7843750000001,
"y": 565.084375
},
"data": {
"value": false
},
"measured": {
"width": 160,
"height": 165
},
"selected": false,
"dragging": false
},
{
"id": "logFullStatus",
"type": "serialLog",
"position": {
"x": 850,
"y": 500
},
"data": {
"label": "Status: Tangki Penuh -> Pompa Air MATI",
"value": false
},
"measured": {
"width": 184,
"height": 125
}
}
],
"edges": [
{
"id": "e-setupLogTrigger-systemReadyLog-default",
"source": "setupLogTrigger",
"target": "systemReadyLog",
"targetHandle": "default"
},
{
"id": "e-readFloatSensor-compareEmpty-a",
"source": "readFloatSensor",
"target": "compareEmpty",
"targetHandle": "a"
},
{
"id": "e-constLowValue-compareEmpty-b",
"source": "constLowValue",
"target": "compareEmpty",
"targetHandle": "b"
},
{
"id": "e-compareEmpty-ifElseRelayState-condition",
"source": "compareEmpty",
"target": "ifElseRelayState",
"targetHandle": "condition"
},
{
"id": "e-constRelayOnValue-ifElseRelayState-trueVal",
"source": "constRelayOnValue",
"target": "ifElseRelayState",
"targetHandle": "trueVal"
},
{
"id": "e-constRelayOffValue-ifElseRelayState-falseVal",
"source": "constRelayOffValue",
"target": "ifElseRelayState",
"targetHandle": "falseVal"
},
{
"id": "e-ifElseRelayState-controlRelay-default",
"source": "ifElseRelayState",
"target": "controlRelay",
"targetHandle": "default"
},
{
"id": "e-compareEmpty-logicNotEmpty-in1",
"source": "compareEmpty",
"target": "logicNotEmpty",
"targetHandle": "in1"
},
{
"id": "e-compareEmpty-triggerLogEmpty-in1",
"source": "compareEmpty",
"target": "triggerLogEmpty",
"targetHandle": "in1"
},
{
"id": "e-dummyTrigger-triggerLogEmpty-in2",
"source": "dummyTrigger",
"target": "triggerLogEmpty",
"targetHandle": "in2"
},
{
"id": "e-triggerLogEmpty-logEmptyStatus-default",
"source": "triggerLogEmpty",
"target": "logEmptyStatus",
"targetHandle": "default"
},
{
"id": "e-logicNotEmpty-triggerLogFull-in1",
"source": "logicNotEmpty",
"target": "triggerLogFull",
"targetHandle": "in1"
},
{
"id": "e-dummyTrigger-triggerLogFull-in2",
"source": "dummyTrigger",
"target": "triggerLogFull",
"targetHandle": "in2"
},
{
"id": "e-triggerLogFull-logFullStatus-default",
"source": "triggerLogFull",
"target": "logFullStatus",
"targetHandle": "default"
}
]
}