FLOW. CONNECT. INNOVATE.
← KEMBALI KE ARTIKEL
HARDWARE

Kontrol Relai dengan Arduino Nano untuk Pengendalian Pompa Air Otomatis

Header Image

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

Caption
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).

  1. Pembacaan Input: Arduino Nano membaca sinyal masukan dari sensor ketinggian air (misalnya sakelar pelampung).

  2. Pemrosesan Logika: Jika tangki air terdeteksi kosong, Arduino akan mengirim sinyal logika ke pin kontrol relai.

  3. 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.

  4. 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)

B. Sisi Tegangan Tinggi (Modul Relai ke Pompa Air 220V AC)

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:

  1. 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.

  2. 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.

  3. 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

Cara Kerja Sistem

  1. Inisialisasi Sistem: Node setupLogTrigger langsung memicu systemReadyLog untuk menampilkan log awal: "Sistem Kontrol Pompa Air Arduino Nano Siap."

  2. Kondisi Tangki Kosong (Sensor = LOW):

    • Sensor membaca nilai LOW, lalu node compareEmpty mencocokkannya dengan constLowValue sehingga bernilai true.

    • Node ifElseRelayState meneruskan nilai constRelayOnValue (LOW / 0) ke Pin 3 (controlRelay), yang menyebabkan Pompa Air NYALA (relay active-low bekerja saat diberi sinyal LOW).

    • Node triggerLogEmpty aktif dan menampilkan log serial: "Status: Tangki Kosong -> Pompa Air NYALA".

  3. Kondisi Tangki Penuh (Sensor = HIGH):

    • Ketika tangki terisi, sensor terbaca HIGH sehingga pembanding compareEmpty bernilai false.

    • Node ifElseRelayState mengalihkan output ke constRelayOffValue (HIGH / 1) ke Pin 3, sehingga Pompa Air MATI.

    • Sinyal false dibalikkan oleh logicNotEmpty menjadi true untuk mengaktifkan triggerLogFull, 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"
    }
  ]
}