Node-RED dengan Arduino (I/O Digital)

Berikut contoh program Arduino dan Node-RED untuk mengontrol input/output digital melalui komunikasi serial. Kita akan membuat sistem sederhana dengan:

- **Arduino**: Membaca input tombol (digital) dan mengirim statusnya ke Node-RED via serial. Node-RED akan mengirim perintah untuk menyalakan/mematikan LED (digital).

### **1. Program Arduino**

  1. // Pin Configuration
  2. const int buttonPin = 2;    // Tombol terhubung ke pin 2 (INPUT)
  3. const int ledPin = 13;      // LED terhubung ke pin 13 (OUTPUT)
  4. // Variables
  5. int buttonState = 0;        // Status tombol
  6. int prevButtonState = 0;    // Status tombol sebelumnya
  7. void setup() {
  8.   Serial.begin(9600);       // Inisialisasi serial (baud rate 9600)
  9.   pinMode(buttonPin, INPUT_PULLUP); // Mode INPUT_PULLUP untuk tombol
  10.   pinMode(ledPin, OUTPUT);
  11. }
  12. void loop() {
  13.   // Baca status tombol (LOW = ditekan, HIGH = tidak ditekan)
  14.   buttonState = digitalRead(buttonPin);
  15.   // Kirim status tombol ke serial jika ada perubahan
  16.   if (buttonState != prevButtonState) {
  17.     Serial.print("Button:"); 
  18.     Serial.println(buttonState);
  19.     prevButtonState = buttonState;
  20.   }
  21.   // Baca perintah dari Node-RED via serial
  22.   if (Serial.available() > 0) {
  23.     char command = Serial.read();
  24.      if (command == '1') {
  25.       digitalWrite(ledPin, HIGH); // Nyalakan LED
  26.     } else if (command == '0') {
  27.       digitalWrite(ledPin, LOW);  // Matikan LED
  28.     }
  29.   }
  30.   delay(50); // Delay kecil untuk stabilisasi
  31. }

---

### **2. Node-RED Flow**

Berikut langkah-langkah membuat flow di Node-RED:

#### **Komponen yang Dibutuhkan**:

  1. Node `serial in` (untuk membaca data dari Arduino).
  2. Node `function` (untuk memproses data).
  3. Node `debug` (untuk menampilkan data di debug panel).
  4. Node `serial out` (untuk mengirim perintah ke Arduino).
  5. Node `inject` atau `dashboard button` (untuk mengontrol LED).

#### **Flow Configuration**:

1. **Baca Data Tombol dari Arduino**:

   - Tambahkan node `serial in`:

     - **Serial port**: Port Arduino (misal: `COM3` atau `/dev/ttyUSB0`).

     - **Baud rate**: `9600`.

   - Hubungkan ke node `function` untuk ekstraksi data:

     // Fungsi untuk memproses data serial

  1.      let rawData = msg.payload.trim();
  2.      let data = rawData.split(":");
  3.      if (data[0] === "Button") {
  4.          msg.payload = {
  5.              button: parseInt(data[1])
  6.          };
  7.      }
  8.      return msg;

   - Tambahkan node `debug` untuk menampilkan output.

2. **Kontrol LED dari Node-RED**:

   - Tambahkan node `inject` atau `dashboard button` untuk mengirim perintah:

     - Atur payload ke `1` (nyala) atau `0` (mati).

   - Hubungkan ke node `serial out`:

     - **Serial port**: Port yang sama dengan Arduino.

     - **Baud rate**: `9600`.

#### **Contoh Flow JSON**:

```json

[
  {
    "id": "a1b2c3d4",
    "type": "serial in",
    "z": "flow",
    "name": "Arduino Serial",
    "serial": "arduino_port",
    "x": 150,
    "y": 100,
    "wires": [["b1b2c3d4"]]
  },
  {
    "id": "b1b2c3d4",
    "type": "function",
    "z": "flow",
    "name": "Process Data",
    "func": "let rawData = msg.payload.trim();\nlet data = rawData.split(\":\");\n\nif (data[0] === \"Button\") {\n    msg.payload = {\n        button: parseInt(data[1])\n    };\n}\nreturn msg;",
    "outputs": 1,
    "x": 350,
    "y": 100,
    "wires": [["c1c2c3d4"]]
  },
  {
    "id": "c1c2c3d4",
    "type": "debug",
    "z": "flow",
    "name": "Show Button Status",
    "active": true,
    "x": 550,
    "y": 100,
    "wires": []
  },
  {
    "id": "d1d2d3d4",
    "type": "serial out",
    "z": "flow",
    "name": "Send to Arduino",
    "serial": "arduino_port",
    "x": 550,
    "y": 200,
    "wires": []
  },
  {
    "id": "e1e2e3e4",
    "type": "inject",
    "z": "flow",
    "name": "Turn LED ON",
    "props": [{"p": "payload"}],
    "repeat": "",
    "crontab": "",
    "once": false,
    "payload": "1",
    "payloadType": "str",
    "x": 350,
    "y": 200,
    "wires": [["d1d2d3d4"]]
  },
  {
    "id": "f1f2f3f4",
    "type": "inject",
    "z": "flow",
    "name": "Turn LED OFF",
    "props": [{"p": "payload"}],
    "repeat": "",
    "crontab": "",
    "once": false,
    "payload": "0",
    "payloadType": "str",
    "x": 350,
    "y": 300,
    "wires": [["d1d2d3d4"]]
  }

]


### **Cara Kerja**:

1. **Arduino**:

  1.    Membaca tombol di pin 2 (input digital dengan pull-up internal).
  2.    Mengirim status tombol ke serial dalam format `Button:0` atau `Button:1`.
  3.    Menerima perintah `1` atau `0` dari Node-RED untuk mengontrol LED di pin 13.

2. **Node-RED**:

  1.    Membaca data serial dari Arduino dan menampilkan status tombol di debug panel.
  2.    Mengirim perintah `1` (nyala) atau `0` (mati) ke Arduino via serial ketika tombol di UI ditekan.

### **Instalasi Node-RED**:

1. Pastikan Node-RED sudah terinstal.

2. Tambahkan node `node-red-node-serialport` untuk koneksi serial:

3. Deploy flow dan pastikan port serial Arduino terdeteksi.


### **Skema Rangkaian Arduino**:

- **Tombol**:

  - Pin 2 → Tombol → GND (dengan resistor pull-up internal).

- **LED**:

  - Pin 13 → LED → Resistor 220Ω → GND.

Dengan ini, Anda bisa memantau status tombol fisik melalui Node-RED dan mengontrol LED dari antarmuka Node-RED! 🚀

Comments

Popular posts from this blog

Node-RED dengan Arduino (data teks)

Cyber Physical System, apa itu?