Node-RED dengan Arduino (I/O Analog)

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

- **Arduino**: Membaca nilai analog dari potensiometer (input) dan mengirimkannya ke Node-RED. Node-RED akan mengirim nilai PWM (0-255) untuk mengontrol kecerahan LED (output analog).

### **1. Program Arduino** (Membaca Input Analog & Output PWM)

  1. const int potPin = A0;     // Potensiometer terhubung ke pin A0
  2. const int ledPin = 9;      // LED terhubung ke pin PWM 9
  3. int potValue = 0;          // Nilai pembacaan potensiometer (0-1023)
  4. int pwmValue = 0;          // Nilai PWM untuk LED (0-255)
  5. void setup() {
  6.   Serial.begin(9600);
  7.   pinMode(ledPin, OUTPUT);
  8. }
  9. void loop() {
  10.   // Baca nilai analog dari potensiometer
  11.   potValue = analogRead(potPin);
  12.   // Kirim ke Node-RED dalam format "Pot:XXX"
  13.   Serial.print("Pot:");
  14.   Serial.println(potValue);
  15.   // Baca perintah PWM dari Node-RED
  16.   if (Serial.available() > 0) {
  17.     // Baca nilai integer (0-255) dari serial
  18.     pwmValue = Serial.parseInt();
  19.     // Pastikan nilai dalam rentang valid
  20.     pwmValue = constrain(pwmValue, 0, 255);
  21.     // Terapkan ke LED
  22.     analogWrite(ledPin, pwmValue);
  23.   }
  24.  delay(100); // Delay untuk stabilisasi
  25. }


### **2. Node-RED Flow** (Pemrosesan Data Analog)

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

1. `serial in` - Membaca data dari Arduino.

2. `function` - Memproses data potensiometer.

3. `chart/gauge` (dari node-red-dashboard) - Visualisasi data.

4. `slider` (dari node-red-dashboard) - Kontrol PWM.

5. `serial out` - Mengirim nilai PWM ke Arduino.


#### **Flow Configuration**:

1. **Baca Data Potensiometer**:

   - Tambahkan node `serial in`:

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

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

   - Hubungkan ke node `function` untuk ekstraksi data:

     // Fungsi: Ekstrak nilai potensiometer

     let rawData = msg.payload.trim();
     let data = rawData.split(":");
     if (data[0] === "Pot") {
         msg.payload = {
             pot: parseInt(data[1])  // Konversi ke integer (0-1023)
         };
     }
     return msg;

   - Tambahkan node `chart` atau `gauge` untuk menampilkan data.


2. **Kontrol PWM LED**:

   - Tambahkan node `slider` dari dashboard:

     - **Range**: 0-255.

     - **Step**: 1.

   - Hubungkan ke node `serial out` untuk mengirim nilai ke Arduino.


#### **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 Potentiometer",
    "func": "let rawData = msg.payload.trim();\nlet data = rawData.split(\":\");\n\nif (data[0] === \"Pot\") {\n    msg.payload = {\n        pot: parseInt(data[1])\n    };\n}\nreturn msg;",
    "outputs": 1,
    "x": 350,
    "y": 100,
    "wires": [["c1c2c3d4"]]
  },
  {
    "id": "c1c2c3d4",
    "type": "ui_chart",
    "z": "flow",
    "name": "Potentiometer Chart",
    "group": "dashboard",
    "order": 1,
    "width": "6",
    "height": "4",
    "label": "Potentiometer Value",
    "chartType": "line",
    "legend": "false",
    "xformat": "HH:mm:ss",
    "interpolate": "linear",
    "nodata": "",
    "dot": false,
    "ymin": "0",
    "ymax": "1023",
    "x": 550,
    "y": 100,
    "wires": []
  },
  {
    "id": "d1d2d3d4",
    "type": "serial out",
    "z": "flow",
    "name": "Send PWM to Arduino",
    "serial": "arduino_port",
    "x": 550,
    "y": 200,
    "wires": []
  },
  {
    "id": "e1e2e3e4",
    "type": "ui_slider",
    "z": "flow",
    "name": "LED Brightness",
    "label": "PWM Value (0-255)",
    "tooltip": "",
    "group": "dashboard",
    "order": 2,
    "width": "6",
    "height": "1",
    "passthru": true,
    "outs": "all",
    "topic": "pwm",
    "min": 0,
    "max": 255,
    "step": 1,
    "x": 350,
    "y": 200,
    "wires": [["d1d2d3d4"]]
  }
]


### **Cara Kerja**:

1. **Arduino**:

  1.    Membaca nilai analog dari potensiometer (0-1023) dan mengirimnya ke Node-RED via serial.
  2.    Menerima nilai PWM (0-255) dari Node-RED dan mengatur kecerahan LED.

2. **Node-RED**:

  1.    Menampilkan nilai potensiometer dalam bentuk grafik atau gauge.
  2.    Menggunakan slider untuk mengirim nilai PWM ke Arduino.

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

1. Pastikan paket dashboard dan serialport terinstal:

2. Restart Node-RED dan akses dashboard di `http://localhost:1880/ui`.


### **Skema Rangkaian Arduino**:

- **Potensiometer**:

  - Pin tengah → A0.

  - Pin lainnya → 5V dan GND.

- **LED**:

  - Anoda (+) → Pin 9 (PWM).

  - Katoda (-) → Resistor 220Ω → GND.


### **Testing**:

  1. Upload program ke Arduino.
  2. Deploy flow Node-RED.
  3. Buka dashboard di `http://localhost:1880/ui`:
    1.    Gerakkan potensiometer, nilai akan terupdate di grafik.
    2.    Geser slider untuk mengubah kecerahan LED.

Dengan ini, Anda bisa memantau data analog dan mengontrol perangkat fisik melalui antarmuka Node-RED! 🔄💡

Comments

Popular posts from this blog

Node-RED dengan Arduino (I/O Digital)

Node-RED dengan Arduino (data teks)

Cyber Physical System, apa itu?