[Tutorial] Cara Akses Monitoring ADC Grafik Realtime dengan Zedgraph pada Visual Basic 2013


Pada kali ini saya akan membagikan cara mengakses zedgraph dengan menggunakan bahasa basic pada visual studio 2013. Pada tutorial ini kalian perlu untuk mendownload framework zedgraph disini. Kemudian kalian add reference dengan cara berikut :


Kemudian pastikan bahwa zedgraph sudah tercentang pada add reference project yang anda buat, seperti ini :

Lalu buatlah project baru dengan susunan komponen seperti ini :

dengan rincian :
combobox1 : beri nama "cmbPort"
combobox2 : beri nama "cmbBaud"
button1 : beri nama "btnConnect"
button2 : beri nama "btnDisconnect"
Zedgraph : beri nama"ZedGraphControl1"
TextBox1 : beri nama "rtbReceived"
Timer1,Timer2,SerialPort,TimerZedGraph

Berikut list program VB :
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
Imports ZedGraph 'Imports Library Zedgraph untuk grafik
Public Class Form1
    'Variabel Untuk Data Serial
    Private readBuffer As String = String.Empty
    Private Bytenumber As Integer
    Private ByteToRead As Integer
    Private byteEnd(2) As Char
    Dim strinput As String
    Dim prosesoff As Boolean = False
    Dim disconnect As Boolean = False

    'Variabel Untuk Zedgrapgh
    'Untuk Grafik
    Dim currentgraph As GraphPane
    Dim listcurrent As RollingPointPairList
    Dim currentgraph_line As LineItem
    Dim starting_time As Double = 100
    Dim nilai As Integer

    'Variabel Penampung Port
    Dim myPort As Array  'COM Ports detected on the system will be stored here
    Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'When our form loads, auto detect all serial ports in the system and populate the cmbPort Combo box.
        myPort = IO.Ports.SerialPort.GetPortNames() 'Get all com ports available
        cmbBaud.Items.Add(9600)     'Populate the cmbBaud Combo box to common baud rates used
        cmbBaud.Items.Add(19200)
        cmbBaud.Items.Add(38400)
        cmbBaud.Items.Add(57600)
        cmbBaud.Items.Add(115200)

        For i = 0 To UBound(myPort)
            cmbPort.Items.Add(myPort(i))
        Next
        cmbPort.Text = cmbPort.Items.Item(0)    'Set cmbPort text to the first COM port detected
        cmbBaud.Text = cmbBaud.Items.Item(0)    'Set cmbBaud text to the first Baud rate on the list
        btnDisconnect.Enabled = False           'Initially Disconnect Button is Disabled

        starting_time = Environment.TickCount
        currentgraph = ZedGraphControl1.GraphPane
        currentgraph.Title.Text = "ADC Monitoring"
        currentgraph.XAxis.Title.Text = "Timing (Secon)"
        currentgraph.YAxis.Title.Text = "Value Current (Bit)"
        listcurrent = New RollingPointPairList(120)
        currentgraph_line = currentgraph.AddCurve("ADC", listcurrent, Color.Blue, SymbolType.None)
    End Sub

    Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
        SerialPort1.PortName = cmbPort.Text         'Set SerialPort1 to the selected COM port at startup
        SerialPort1.BaudRate = cmbBaud.Text         'Set Baud rate to the selected value on

        'Other Serial Port Property
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.DataBits = 8            'Open our serial port
        SerialPort1.Open()

        btnConnect.Enabled = False          'Disable Connect button
        btnDisconnect.Enabled = True        'and Enable Disconnect button

        System.Threading.Thread.Sleep(10)
        Timer1.Enabled = True
        TimerZedgraph.Enabled = True
    End Sub

    Private Sub btnDisconnect_Click(sender As Object, e As EventArgs) Handles btnDisconnect.Click
        'SerialPort1.Close()             'Close our Serial Port
        Timer1.Enabled = False
        btnConnect.Enabled = True
        btnDisconnect.Enabled = False
        System.Threading.Thread.Sleep(10)
        disconnect = True
        Timer2.Enabled = True
        rtbReceived.Text = "   "
        TimerZedgraph.Enabled = False
    End Sub

    Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        If SerialPort1.IsOpen Then
            Try
                '================Default Coding Data Serial===========================
                byteEnd = SerialPort1.NewLine.ToCharArray
                Bytenumber = SerialPort1.BytesToRead
                readBuffer = SerialPort1.ReadLine()

                Me.Invoke(New EventHandler(AddressOf DoUpdate))
            Catch ex As Exception
                'MsgBox("read " & ex.Message)
            End Try
        End If
    End Sub

    Public Sub DoUpdate(ByVal sender As Object, ByVal e As System.EventArgs)
        'Pada TextBox1.Text sudah dapat menampilkan data dari SerialPort1

        Timer1.Enabled = True

        'Jika membaca boolean disconnect maka mengirim perintah true ke prosesoff
        If disconnect Then
            prosesoff = True
        End If
    End Sub

    Private Sub cmbPort_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbPort.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = cmbPort.Text         'pop a message box to user if he is changing ports
        Else                                                                               'without disconnecting first.
            MsgBox("Valid only if port is Closed", vbCritical)
        End If
    End Sub

    Private Sub cmbBaud_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbBaud.SelectedIndexChanged
        If SerialPort1.IsOpen = False Then
            SerialPort1.BaudRate = cmbBaud.Text         'pop a message box to user if he is changing baud rate
        Else                                                                                'without disconnecting first.
            MsgBox("Valid only if port is Closed", vbCritical)
        End If
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If SerialPort1.IsOpen Then
            rtbReceived.Text = readBuffer
            nilai = Val(rtbReceived.Text)
        End If
    End Sub

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        If prosesoff Then
            SerialPort1.Close()
            Timer2.Enabled = False
            rtbReceived.Text = "   "
        End If
    End Sub

    Private Sub TimerZedgraph_Tick(sender As Object, e As EventArgs) Handles TimerZedgraph.Tick
        Dim xScale As Scale
        Dim kurvaSuhu As LineItem = ZedGraphControl1.GraphPane.CurveList(0)
        Dim list As IPointListEdit
        Dim waktu As Double = (Environment.TickCount - starting_time) / 1000.0
        list = kurvaSuhu.Points

        list.Add(waktu, nilai)

        xScale = ZedGraphControl1.GraphPane.XAxis.Scale
        If (waktu > xScale.Max - xScale.MajorStep) Then
            xScale.Max = waktu + xScale.MajorStep
            xScale.Min = xScale.Max - 10
        End If
        ' Pastikan Y axis di scale ulang untuk mengakomodir data aktual
        ZedGraphControl1.AxisChange()
        ' Redraw paksa
        ZedGraphControl1.Invalidate()
    End Sub
End Class

Berikut hasilnya :

Terima Kasih :)



Post a Comment

Previous Post Next Post