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
- Pendahuluan
- Konsep Dasar Serial Communication
- Pengolahan String di C#
- Persiapan Hardware
- Setup Arduino DHT11
- Implementasi Visual Studio 2022
- Praktikum Modul 4
- 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:
- Hardware Layer — Arduino dengan sensor DHT11
- Communication Layer — Serial Port Protocol
- 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:
| Parameter | Deskripsi | Default Arduino | Catatan |
|---|---|---|---|
| Baud Rate | Kecepatan transmisi (bit/detik) | 9600 | Pilihan: 1200, 2400, 4800, 9600, 14400, 19200, 28800, 57600, 115200 |
| Data Bits | Jumlah bit data per karakter | 8 bit | Standar: 8 bit |
| Parity | Pengecekan error | None | Opsi: None, Even, Odd |
| Stop Bits | Sinyal akhir pengiriman | 1 bit | Opsi: 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
| Komponen | Jumlah | Fungsi |
|---|---|---|
| Arduino UNO | 1 | Mikrokontroler utama |
| Sensor DHT11 | 1 | Membaca suhu & humidity |
| Kabel Jumper | 10+ | Koneksi antar komponen |
| Kabel USB Type-B | 1 | Komunikasi dengan PC |
| Laptop/PC | 1 | Menjalankan GUI aplikasi |
| Resistor 10kΩ | 1 | Pull-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
- Buka Arduino IDE
- Navigasi ke: Sketch → Include Library → Manage Libraries
- Cari:
DHT sensor library - 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
- Pilih Board: Tools → Board → Arduino AVR Boards → Arduino Uno
- Pilih Port: Tools → Port → COM3 (atau COM port Arduino Anda)
- Upload: Klik tombol Upload (➤) atau tekan Ctrl+U
- Tunggu sampai muncul: "Done Uploading"
Step 4: Test dengan Serial Monitor
- Buka: Tools → Serial Monitor
- Atur Baud Rate ke 9600
- 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
- Klik Create a new project
- Cari:
Windows Forms App - Pilih Windows Forms App (.NET Framework)
- 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
- Dari Toolbox, cari Label
- Drag Label ke Form1
- Klik Label → Properties (F4)
- Ubah:
- Name:
lblSuhu - Text:
0 °C - Font.Size:
24 - Font.Bold:
True - AutoSize:
False - Width:
200, Height:50
- Name:
Step 5: Tambahkan Label untuk Humidity
- Drag Label kedua ke Form1
- Klik Label → Properties
- Ubah:
- Name:
lblHum - Text:
0 % - Font.Size:
24 - Font.Bold:
True - AutoSize:
False - Width:
200, Height:50
- Name:
Step 6: Tambahkan Button untuk Connect
- Drag Button dari Toolbox ke Form
- Klik Button → Properties
- Ubah:
- Name:
btnConnect - Text:
CONNECT - Font.Size:
12 - Width:
120, Height:40
- Name:
Step 7: Tambahkan Button untuk Disconnect
- Drag Button kedua ke Form
- Klik Button → Properties
- Ubah:
- Name:
btnDisconnect - Text:
DISCONNECT - Font.Size:
12 - Width:
120, Height:40
- Name:
Step 8: Tambahkan ComboBox untuk Port Selection
- Drag ComboBox dari Toolbox
- Klik ComboBox → Properties
- Ubah:
- Name:
cmbPort - DropDownStyle:
DropDownList
- Name:
Step 9: Tambahkan Timer
- Dari Toolbox, cari Timer
- Drag Timer ke Form (akan muncul di bawah form, bukan di atas)
- Klik Timer → Properties
- Ubah:
- Name:
timer1 - Interval:
1000(1 detik) - Enabled:
False
- Name:
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
- Build Solution: Ctrl+Shift+B
- Run: Tekan F5 atau klik tombol Start
- 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:
| Button | Output |
|---|---|
| IndexOf | Kata 'sensor' tidak ditemukan |
| Replace | (ganti S dengan Temperature) |
| Split | Total bagian: 3, Bagian 1: S:25.5, dst |
| Substring | Substring(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
| Masalah | Penyebab | Solusi |
|---|---|---|
| "Access denied" saat buka port | Serial Monitor masih terbuka | Tutup Serial Monitor di Arduino IDE |
| COM port tidak terdeteksi | Arduino tidak terhubung | Periksa koneksi USB, driver belum install |
| Data tidak update di GUI | Thread issue | Gunakan Invoke() untuk update UI |
| Sensor error (NaN) | DHT11 error | Periksa koneksi, ganti sensor |
| Baud rate mismatch | Arduino & PC berbeda baud | Pastikan keduanya 9600 |
| Serial.ReadLine() timeout | Arduino tidak mengirim newline | Gunakan Serial.println() di Arduino |
| Grafik tidak terisi data | Parsing error | Debug dengan MessageBox nilai yang diterima |
| Application crash saat close | Port belum ditutup | Implement 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.