Skip to main content

Pertemuan-08

MATERI PEMBELAJARAN: ARRAY DALAM BAHASA PEMROGRAMAN C#

Mata Kuliah: Pemrograman Berorientasi Objek Topik: Serial Komunikasi dan Parsing Data Bahasa: C# (.NET)


Daftar Isi

  1. Pendahuluan
  2. Konsep Dasar Serial Communication
  3. Pengolahan String di C#
  4. Persiapan Hardware
  5. Setup Arduino DHT11
  6. Implementasi Visual Studio 2022
  7. Praktikum Modul 4
  8. Troubleshooting

Pendahuluan

Dalam praktik industri modern, sistem embedded seperti Arduino sering perlu berkomunikasi dengan aplikasi desktop untuk:

  • Monitoring real-time — mengamati parameter sensor secara langsung
  • Kontrol jarak jauh — mengirim perintah ke mikrokontroler
  • Data logging — menyimpan data historis untuk analisis
  • Visualisasi grafik — menampilkan tren data dalam bentuk visual

Materi ini menggabungkan tiga komponen utama:

  1. Hardware Layer — Arduino dengan sensor DHT11
  2. Communication Layer — Serial Port Protocol
  3. Software Layer — C# Windows Forms GUI + String Processing

Konsep Dasar Serial Communication

Apa itu Serial Communication?

Serial communication adalah metode pengiriman data bit demi bit melalui satu saluran komunikasi. Berbeda dengan parallel yang mengirim 8 bit sekaligus, serial mengirim 1 bit per waktu, namun lebih handal untuk jarak jauh.

Parameter Serial Communication

Agar PC dan Arduino dapat berkomunikasi, parameter harus persis sama:

ParameterDeskripsiDefault ArduinoCatatan
Baud RateKecepatan transmisi (bit/detik)9600Pilihan: 1200, 2400, 4800, 9600, 14400, 19200, 28800, 57600, 115200
Data BitsJumlah bit data per karakter8 bitStandar: 8 bit
ParityPengecekan errorNoneOpsi: None, Even, Odd
Stop BitsSinyal akhir pengiriman1 bitOpsi: 1 atau 2 bit

Contoh Konfigurasi Standar:

Baud Rate    = 9600
Data Bits = 8
Parity = None
Stop Bits = 1

Flow Diagram Serial Communication

Arduino UNO (Transmitter)      Serial Port (Cable)      PC (Receiver)
┌─────────────────┐ USB Cable ┌──────────────┐
│ Sensor Data │ ┌────────┐ │ C# GUI │
│ (ADC Value) │───────────►│ 9600 │─────────────►│ SerialPort │
│ 0-1023 │ │ 8N1 │ │ ReadLine() │
└─────────────────┘ └────────┘ └──────────────┘

Tipe-Tipe Data Transmisi

1. Raw Binary (8-bit)

// Arduino
Serial.write(255); // Kirim 1 byte saja (8 bit)

// C#
byte data = serialPort1.ReadByte(); // Terima 1 byte

Keuntungan: Hemat bandwidth (8 bit per nilai) Kerugian: Sulit di-debug, rentan error

2. ASCII Text (Lebih Boros)

// Arduino
Serial.print(255); // Kirim sebagai "255" = 3 karakter = 24 bit
Serial.println(); // Tambah newline = 2 karakter = 16 bit

// Total: 255 menjadi 5 byte (40 bit) — jauh lebih boros!

// C#
string data = serialPort1.ReadLine(); // Terima sebagai string
int value = int.Parse(data); // Konversi ke int

Keuntungan: Mudah di-debug, readable Kerugian: Membuang bandwidth


Pengolahan String di C#

String Basics

String adalah kumpulan karakter yang dianggap sebagai satu unit. Di C#, string adalah object dari class System.String.

// Deklarasi string
string nama = "Arduino Monitoring";
string kosong = "";
string nullStr = null;

// Akses karakter individual (array-like)
char firstChar = nama[0]; // 'A'
char lastChar = nama[nama.Length - 1]; // 'g'

// Property penting
int length = nama.Length; // 17

Method String Manipulation

1. Menambah/Menghapus

string text = "My String";

// Insert
string result1 = text.Insert(9, "!"); // "My String!"

// Remove
string result2 = text.Remove(2, 1); // "MyString"

// Trim
string result3 = " hello ".Trim(); // "hello"

2. Case Conversion

string text = "Arduino Uno";

string lower = text.ToLower(); // "arduino uno"
string upper = text.ToUpper(); // "ARDUINO UNO"

3. Searching (IndexOf & LastIndexOf)

string text = "Data sensor 1, sensor 2, sensor 3";

// IndexOf — cari posisi pertama
int pos1 = text.IndexOf("sensor"); // 5 (posisi 's' pertama)
int pos2 = text.IndexOf("sensor", 10); // 18 (posisi 's' setelah index 10)

// LastIndexOf — cari posisi terakhir
int lastPos = text.LastIndexOf("sensor"); // 26 (posisi 's' terakhir)

// Jika tidak ditemukan, return -1
if (text.IndexOf("Arduino") != -1)
{
MessageBox.Show("Ditemukan!");
}

4. Extract Substring

string fullData = "S:25.5,H:65.3";

// Substring(startIndex, length)
string suhuPart = fullData.Substring(2, 4); // "25.5"
string humPart = fullData.Substring(10, 4); // "65.3"

// Atau gunakan untuk extract dari posisi tertentu sampai akhir
string afterColon = fullData.Substring(2); // "25.5,H:65.3"

5. Replace

string data = "S:25.5,H:65.3";

// Ganti semua kemunculan
string cleanSuhu = data.Replace("S:", ""); // "25.5,H:65.3"
string cleanHum = cleanSuhu.Replace("H:", ""); // "25.5,65.3"

// Atau lebih efisien
string clean = data.Replace("S:", "").Replace("H:", "");

6. Split — Memisah String

string data = "S:25.5,H:65.3";

// Split dengan delimiter ','
string[] parts = data.Split(',');
// parts[0] = "S:25.5"
// parts[1] = "H:65.3"

// Ambil suhu
string suhuStr = parts[0].Replace("S:", ""); // "25.5"
float suhu = float.Parse(suhuStr);

// Ambil humidity
string humStr = parts[1].Replace("H:", ""); // "65.3"
float hum = float.Parse(humStr);

// Split dengan multiple delimiters
string[] tokens = data.Split(new char[] {',', ':'});
// tokens[0] = "S"
// tokens[1] = "25.5"
// tokens[2] = "H"
// tokens[3] = "65.3"

7. Join — Menggabung String

string[] values = {"25.5", "65.3", "1013"};

// Join dengan separator '-'
string result = string.Join("-", values); // "25.5-65.3-1013"

// Join untuk CSV
string csvLine = string.Join(",", values); // "25.5,65.3,1013"

String Parsing — Data Type Conversion

string dataStr = "25.5";

// String → int (akan error jika ada koma)
int intValue = int.Parse(dataStr); // Error! "25.5" bukan integer

// String → float
float floatValue = float.Parse(dataStr); // 25.5 OK

// String → double
double doubleValue = double.Parse(dataStr); // 25.5 OK

// Lebih aman dengan TryParse (return bool)
if (float.TryParse(dataStr, out float hasil))
{
lblSuhu.Text = hasil + " °C";
}
else
{
MessageBox.Show("Konversi gagal!");
}

// Convert class
float value = Convert.ToSingle(dataStr);

String Interpolation (Format String)

float suhu = 25.5f;
float hum = 65.3f;
DateTime time = DateTime.Now;

// Format lama (concatenation)
string msg1 = "Suhu: " + suhu + "°C, Humidity: " + hum + "%";

// Format dengan String.Format
string msg2 = string.Format("Suhu: {0}°C, Humidity: {1}%", suhu, hum);

// Format interpolation (C# 6.0+) — paling modern & readable
string msg3 = $"Suhu: {suhu}°C, Humidity: {hum}%";

// Dengan format specifier
string msg4 = $"Suhu: {suhu:F1}°C, Humidity: {hum:P1}";
// Output: "Suhu: 25.5°C, Humidity: 65.30%"

// Dengan datetime
string msg5 = $"Waktu: {time:yyyy-MM-dd HH:mm:ss}";
// Output: "Waktu: 2026-04-22 10:30:45"

Persiapan Hardware

Komponen yang Dibutuhkan

KomponenJumlahFungsi
Arduino UNO1Mikrokontroler utama
Sensor DHT111Membaca suhu & humidity
Kabel Jumper10+Koneksi antar komponen
Kabel USB Type-B1Komunikasi dengan PC
Laptop/PC1Menjalankan GUI aplikasi
Resistor 10kΩ1Pull-up untuk DATA pin (opsional, sudah built-in di modul)

Wiring Diagram DHT11

DHT11 Module        Arduino UNO
┌────────┐ ┌──────────┐
│ VCC ───┼──────────┤ 5V │
│ DATA ──┼──────────┤ Pin 2 │
│ GND ───┼──────────┤ GND │
└────────┘ └──────────┘

Penjelasan Pin:

  • VCC → 5V (Power supply)
  • DATA → Pin 2 (Digital input untuk data sensor)
  • GND → Ground (Referensi 0V)

Catatan: Pin 2 bisa diubah ke pin digital lain (3, 4, 5, dst) sesuai kebutuhan. Pastikan sesuaikan di kode Arduino.


Setup Arduino DHT11

Step 1: Install Library DHT11

  1. Buka Arduino IDE
  2. Navigasi ke: Sketch → Include Library → Manage Libraries
  3. Cari: DHT sensor library
  4. Install dua library berikut:
    • Adafruit DHT Sensor Library (oleh Adafruit)
    • Adafruit Unified Sensor (oleh Adafruit)

Step 2: Program Arduino

Ketikkan kode berikut ke Arduino IDE:

#include <DHT.h>

// Definisikan pin dan tipe sensor
#define DHTPIN 2 // Pin 2 untuk DATA
#define DHTTYPE DHT11 // Tipe sensor: DHT11

// Inisialisasi sensor
DHT dht(DHTPIN, DHTTYPE);

void setup()
{
Serial.begin(9600); // Baud rate 9600
dht.begin(); // Inisialisasi DHT
}

void loop()
{
// Baca data dari sensor
float suhu = dht.readTemperature(); // °C
float hum = dht.readHumidity(); // %

// Cek error pembacaan
if (isnan(suhu) || isnan(hum))
{
Serial.println("ERROR: Sensor tidak terdeteksi!");
return;
}

// Kirim data ke PC dengan format: S:25.5,H:65.3
Serial.print("S:");
Serial.print(suhu);
Serial.print(",H:");
Serial.println(hum);

// Tunggu 1 detik sebelum pembacaan berikutnya
delay(1000);
}

Step 3: Upload ke Arduino

  1. Pilih Board: Tools → Board → Arduino AVR Boards → Arduino Uno
  2. Pilih Port: Tools → Port → COM3 (atau COM port Arduino Anda)
  3. Upload: Klik tombol Upload (➤) atau tekan Ctrl+U
  4. Tunggu sampai muncul: "Done Uploading"

Step 4: Test dengan Serial Monitor

  1. Buka: Tools → Serial Monitor
  2. Atur Baud Rate ke 9600
  3. Periksa output data. Harusnya terlihat seperti:
    S:25.5,H:65.3
    S:25.6,H:65.2
    S:25.5,H:65.4

✅ Jika muncul data seperti di atas, Arduino siap digunakan!

❌ Jika error, periksa:

  • Koneksi DHT11 ke pin 2 sudah benar?
  • Baud rate di Serial Monitor = 9600?
  • Library DHT sudah diinstall?

Implementasi Visual Studio 2022

Part 1: Create Project

Step 1: Buka Visual Studio 2022

  1. Klik Create a new project
  2. Cari: Windows Forms App
  3. Pilih Windows Forms App (.NET Framework)
  4. Klik Next

Step 2: Configure Project

  • Project Name: MonitoringDHT11
  • Location: Pilih lokasi folder
  • .NET Framework: .NET Framework 4.7.2 atau lebih baru
  • Klik Create

Part 2: Design GUI

Step 3: Tampilkan Toolbox

Navigasi ke: View → Toolbox (atau tekan Ctrl+Alt+X)

Step 4: Tambahkan Label untuk Suhu

  1. Dari Toolbox, cari Label
  2. Drag Label ke Form1
  3. Klik Label → Properties (F4)
  4. Ubah:
    • Name: lblSuhu
    • Text: 0 °C
    • Font.Size: 24
    • Font.Bold: True
    • AutoSize: False
    • Width: 200, Height: 50

Step 5: Tambahkan Label untuk Humidity

  1. Drag Label kedua ke Form1
  2. Klik Label → Properties
  3. Ubah:
    • Name: lblHum
    • Text: 0 %
    • Font.Size: 24
    • Font.Bold: True
    • AutoSize: False
    • Width: 200, Height: 50

Step 6: Tambahkan Button untuk Connect

  1. Drag Button dari Toolbox ke Form
  2. Klik Button → Properties
  3. Ubah:
    • Name: btnConnect
    • Text: CONNECT
    • Font.Size: 12
    • Width: 120, Height: 40

Step 7: Tambahkan Button untuk Disconnect

  1. Drag Button kedua ke Form
  2. Klik Button → Properties
  3. Ubah:
    • Name: btnDisconnect
    • Text: DISCONNECT
    • Font.Size: 12
    • Width: 120, Height: 40

Step 8: Tambahkan ComboBox untuk Port Selection

  1. Drag ComboBox dari Toolbox
  2. Klik ComboBox → Properties
  3. Ubah:
    • Name: cmbPort
    • DropDownStyle: DropDownList

Step 9: Tambahkan Timer

  1. Dari Toolbox, cari Timer
  2. Drag Timer ke Form (akan muncul di bawah form, bukan di atas)
  3. Klik Timer → Properties
  4. Ubah:
    • Name: timer1
    • Interval: 1000 (1 detik)
    • Enabled: False

Design hasil akhir bisa terlihat seperti:

┌─────────────────────────────────────┐
│ Monitoring DHT11 Sensor [_][□][X] │
├─────────────────────────────────────┤
│ Port: [COM3 ▼] [CONNECT] │
│ │
│ Suhu: [ 0 °C ] │
│ Humidity: [ 0 % ] │
│ │
│ [CONNECT] [DISCONNECT] │
├─────────────────────────────────────┤

Part 3: Code Implementation

Step 10: Add Using Statements

Buka Form1.cs dan tambahkan di bagian atas:

using System;
using System.IO.Ports;
using System.Windows.Forms;

Step 11: Deklarasi SerialPort

Tambahkan di dalam class Form1, tepat setelah public partial class Form1 : Form:

public partial class Form1 : Form
{
// Deklarasi SerialPort
SerialPort serialPort1 = new SerialPort();

public Form1()
{
InitializeComponent();
}

// ... kode selanjutnya ...
}

Step 12: Inisialisasi Form Load

Double-click pada Form untuk membuat event Form1_Load:

private void Form1_Load(object sender, EventArgs e)
{
// Konfigurasi SerialPort
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;

// Subscribe ke event DataReceived
serialPort1.DataReceived += SerialPort1_DataReceived;

// Populate ComboBox dengan port yang tersedia
RefreshPorts();
}

// Method untuk refresh daftar COM Port
private void RefreshPorts()
{
cmbPort.Items.Clear();
string[] ports = SerialPort.GetPortNames();

if (ports.Length == 0)
{
cmbPort.Items.Add("Tidak ada port");
cmbPort.SelectedIndex = 0;
}
else
{
foreach (string port in ports)
{
cmbPort.Items.Add(port);
}
cmbPort.SelectedIndex = 0;
}
}

Step 13: Connect Button Click Event

Double-click tombol CONNECT:

private void btnConnect_Click(object sender, EventArgs e)
{
try
{
// Cek jika port sudah terbuka
if (!serialPort1.IsOpen)
{
// Set port name dari ComboBox
serialPort1.PortName = cmbPort.SelectedItem.ToString();

// Buka port serial
serialPort1.Open();

// Mulai timer untuk pembacaan
timer1.Start();

// Update UI
btnConnect.Enabled = false;
btnDisconnect.Enabled = true;
cmbPort.Enabled = false;

MessageBox.Show("Arduino Connected!");
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}

Step 14: Disconnect Button Click Event

Double-click tombol DISCONNECT:

private void btnDisconnect_Click(object sender, EventArgs e)
{
try
{
// Stop timer
timer1.Stop();

// Tutup port serial
if (serialPort1.IsOpen)
{
serialPort1.Close();
}

// Update UI
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
cmbPort.Enabled = true;

MessageBox.Show("Disconnected!");
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}

Step 15: SerialPort DataReceived Event

Tambahkan event handler:

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
// Baca satu baris data dari Arduino
string data = serialPort1.ReadLine();

// Update UI harus di thread utama
this.Invoke(new Action(delegate ()
{
ParseAndDisplay(data);
}));
}
catch (Exception ex)
{
MessageBox.Show("Error reading data: " + ex.Message);
}
}

// Method untuk parsing dan menampilkan data
private void ParseAndDisplay(string rawData)
{
try
{
// Contoh format: "S:25.5,H:65.3"
string[] parts = rawData.Split(',');

// Parse Suhu
string suhuStr = parts[0].Replace("S:", "").Trim();
float suhu = float.Parse(suhuStr);

// Parse Humidity
string humStr = parts[1].Replace("H:", "").Trim();
float hum = float.Parse(humStr);

// Tampilkan di Label
lblSuhu.Text = suhu.ToString("F1") + " °C";
lblHum.Text = hum.ToString("F1") + " %";

// Log ke file (opsional)
LogToFile(suhu, hum);
}
catch (Exception ex)
{
MessageBox.Show("Error parsing: " + ex.Message);
}
}

// Method untuk logging data ke file
private void LogToFile(float suhu, float hum)
{
try
{
string logPath = "sensor_log.csv";
string line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{suhu:F1},{hum:F1}";

System.IO.File.AppendAllText(logPath, line + Environment.NewLine);
}
catch (Exception ex)
{
// Silent fail untuk logging
}
}

Step 16: Form Closing Event

Tambahkan untuk handle saat form ditutup:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Pastikan port tertutup saat aplikasi ditutup
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}

Part 4: Run Application

  1. Build Solution: Ctrl+Shift+B
  2. Run: Tekan F5 atau klik tombol Start
  3. Test:
    • Pastikan Arduino sudah terhubung via USB
    • Pilih COM port dari ComboBox
    • Klik CONNECT
    • Lihat data Suhu dan Humidity ter-update

Praktikum Modul 4

Praktikum 1: String Manipulation

Tujuan: Menguasai berbagai method string processing untuk parsing data sensor

Langkah 1-5: Setup Project

(Sama dengan setup di atas)

Langkah 6: Design Form

Buat form dengan layout:

┌──────────────────────────────────┐
│ String Processing Demo [_][□][X] │
├──────────────────────────────────┤
│ Input: [ ] │
│ [txtInput ] │
│ │
│ Results: │
│ ┌─────────────────────────────┐ │
│ │ │ │
│ │ txtOutput (MultiLine) │ │
│ │ │ │
│ └─────────────────────────────┘ │
│ │
│ [Button1] [Button2] [Button3] │
│ [Button4] │
└──────────────────────────────────┘

Komponen:

  • TextBox (Name: txtInput) — Input string
  • TextBox (Name: txtOutput, Multiline: True) — Output hasil
  • Button 1 (Text: IndexOf) — Cari posisi string
  • Button 2 (Text: Replace) — Ganti string
  • Button 3 (Text: Split) — Pisah string
  • Button 4 (Text: Substring) — Ambil bagian string

Langkah 7: Implementasi Button Events

Button 1 - IndexOf:

private void button1_Click(object sender, EventArgs e)
{
string input = txtInput.Text;
string search = "sensor";

int pos = input.IndexOf(search);

if (pos != -1)
{
txtOutput.Text = $"Kata '{search}' ditemukan di posisi: {pos}";
}
else
{
txtOutput.Text = $"Kata '{search}' tidak ditemukan";
}
}

Button 2 - Replace:

private void button2_Click(object sender, EventArgs e)
{
string input = txtInput.Text;

// Ganti "suhu" dengan "temperature"
string result = input.Replace("suhu", "temperature");

txtOutput.Text = $"Original: {input}\n\n";
txtOutput.Text += $"Result: {result}";
}

Button 3 - Split:

private void button3_Click(object sender, EventArgs e)
{
string input = txtInput.Text;

// Split dengan koma
string[] parts = input.Split(',');

txtOutput.Text = $"Total bagian: {parts.Length}\n\n";

for (int i = 0; i < parts.Length; i++)
{
txtOutput.Text += $"Bagian {i + 1}: {parts[i]}\n";
}
}

Button 4 - Substring:

private void button4_Click(object sender, EventArgs e)
{
string input = txtInput.Text;

if (input.Length >= 5)
{
// Ambil 5 karakter pertama
string sub1 = input.Substring(0, 5);

// Ambil dari karakter ke-5 sampai akhir
string sub2 = input.Substring(5);

txtOutput.Text = $"Substring(0, 5): {sub1}\n";
txtOutput.Text += $"Substring(5): {sub2}";
}
else
{
txtOutput.Text = "Input terlalu pendek";
}
}

Contoh Test Input

Coba input berikut:

S:25.5,H:65.3,P:1013

Hasil untuk setiap button:

ButtonOutput
IndexOfKata 'sensor' tidak ditemukan
Replace(ganti S dengan Temperature)
SplitTotal bagian: 3, Bagian 1: S:25.5, dst
SubstringSubstring(0,5): S:25., Substring(5): 5,H:65.3

Praktikum 2: Serial Transmit

Tujuan: Mengirimkan data dari PC ke Arduino melalui serial port

Langkah 1-3: Setup Project dan Hardware

Pastikan Arduino sudah terpasang dengan LED di pin 13.

Langkah 4: Upload Program Arduino

#define LED_PIN 13

void setup()
{
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // Awalnya LED mati
}

void loop()
{
// Cek jika ada data dari PC
if (Serial.available() > 0)
{
char command = Serial.read();

if (command == 'A' || command == 'a')
{
digitalWrite(LED_PIN, HIGH); // Nyalakan LED
Serial.println("LED ON");
}
else if (command == 'B' || command == 'b')
{
digitalWrite(LED_PIN, LOW); // Matikan LED
Serial.println("LED OFF");
}
}
}

Langkah 5: Design Visual Studio Form

┌──────────────────────────────┐
│ Serial Transmit Demo [_][□][X] │
├──────────────────────────────┤
│ Port: [COM3 ▼] │
│ │
│ Command: [A (ON) B (OFF)] │
│ │
│ [LED ON] [LED OFF] │
│ [Open Port] [Close Port] │
│ │
│ Status: [Disconnected ] │
└──────────────────────────────┘

Langkah 6: Koding

Deklarasi:

SerialPort sp = new SerialPort();

private void Form1_Load(object sender, EventArgs e)
{
sp.BaudRate = 9600;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.DataReceived += Sp_DataReceived;
}

private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string response = sp.ReadLine();
this.Invoke(new Action(delegate ()
{
lblStatus.Text = "Status: " + response;
}));
}

Button LED ON:

private void btnLedOn_Click(object sender, EventArgs e)
{
if (sp.IsOpen)
{
sp.Write("A"); // Kirim karakter 'A'
}
}

Button LED OFF:

private void btnLedOff_Click(object sender, EventArgs e)
{
if (sp.IsOpen)
{
sp.Write("B"); // Kirim karakter 'B'
}
}

Button Open Port:

private void btnOpenPort_Click(object sender, EventArgs e)
{
try
{
sp.PortName = cmbPort.SelectedItem.ToString();
sp.Open();
lblStatus.Text = "Status: Connected";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Praktikum 3: Serial Receive dengan Grafik

Tujuan: Menerima data sensor dan menampilkan dalam bentuk grafik real-time

Langkah 1-2: Upload Arduino

Gunakan program Arduino yang mengirim random number (Modul 4, Praktikum 3)

Langkah 3: Design Form

Tambahkan Chart dari Toolbox. Chart dapat diatur melalui Properties → Series.

Langkah 4: Implementasi Plotting

SerialPort sp = new SerialPort();
int x = 0;

private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = sp.ReadLine();

this.Invoke(new Action(delegate ()
{
// Parse data
int value = int.Parse(data.Trim());

// Add ke chart
chart1.Series["Series1"].Points.AddXY(x, value);
x++;

// Update label
lblValue.Text = value.ToString();
}));
}

Praktikum 4: Data Logging

Tujuan: Menyimpan data sensor ke file CSV untuk analisis

private void LogData(float suhu, float hum)
{
string fileName = "sensor_data.csv";
string line = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{suhu:F1},{hum:F1}";

// Tambahkan header jika file baru
if (!System.IO.File.Exists(fileName))
{
System.IO.File.WriteAllText(fileName, "DateTime,Suhu,Humidity\n");
}

// Append data
System.IO.File.AppendAllText(fileName, line + "\n");
}

File output (sensor_data.csv):

DateTime,Suhu,Humidity
2026-04-22 10:30:45,25.5,65.3
2026-04-22 10:30:46,25.6,65.2
2026-04-22 10:30:47,25.5,65.4

Troubleshooting

MasalahPenyebabSolusi
"Access denied" saat buka portSerial Monitor masih terbukaTutup Serial Monitor di Arduino IDE
COM port tidak terdeteksiArduino tidak terhubungPeriksa koneksi USB, driver belum install
Data tidak update di GUIThread issueGunakan Invoke() untuk update UI
Sensor error (NaN)DHT11 errorPeriksa koneksi, ganti sensor
Baud rate mismatchArduino & PC berbeda baudPastikan keduanya 9600
Serial.ReadLine() timeoutArduino tidak mengirim newlineGunakan Serial.println() di Arduino
Grafik tidak terisi dataParsing errorDebug dengan MessageBox nilai yang diterima
Application crash saat closePort belum ditutupImplement FormClosing event

Ringkasan Konsep Penting

✅ Serial Communication

  • Parameter (Baud Rate, Data Bits, Parity, Stop Bits) harus sama
  • Gunakan Serial.println() untuk mengirim dengan newline
  • Gunakan ReadLine() di C# untuk menerima per baris
  • Raw binary lebih cepat tapi ASCII lebih readable

✅ String Processing

  • Split() untuk parsing data paket (S:25.5,H:65.3)
  • Replace() untuk cleaning string
  • IndexOf() untuk mencari posisi
  • Substring() untuk extract bagian
  • TryParse() lebih aman daripada Parse()

✅ Windows Forms

  • Sempre gunakan .Invoke() untuk update UI dari thread berbeda
  • Serial.DataReceived berjalan di thread lain
  • Close port saat aplikasi ditutup

✅ Data Logging

  • File.AppendAllText() untuk append data
  • Format CSV untuk kompatibilitas Excel
  • Include timestamp untuk analisis temporal

Selamat belajar! Semoga materi ini bermanfaat untuk memahami integrasi Hardware-Software dalam aplikasi real-time monitoring.