Zedgraph Kullanımı, Grafik Çizdirme – C#

Merhaba arkadaşlar, bu yazımızda c#’ ta zedgraph kullanımı konusunda bir uygulama yapacağız. Grafik çizdirme kütüphanesini kullanacağız. Bu kütüphane sayesinde verilerimizi grafiğe dökebilir anlamlı hale getirebiliriz.

İlk önce aşağıdaki linkten zedgraph.dll dosyamızı indirelim.

https://sourceforge.net/projects/zedgraph/files/

Daha sonra .dll dosyamızı solution explorer’ dan projeye sag tıklayarak >> add referance’ dan browse deyip >> zedgraph.dll i seçelim.

Zedgraph Kütüphanesinin Yüklenmesi
Zedgraph Kütüphanesinin Yüklenmesi

Şimdi ise toolbox’ ımıza ekleyelim ve ardından formumuza sürükleyip bırakalım.

toolbox >> general >> choose item >> browse >> zedgraph’ i seçip >> ok diyoruz.

Zedgraph C# Eklentisi
Zedgraph C# Eklentisi

Formumuzu aşağıdaki gibi ayarlayın. C# serial port uygulamamızdaki Arduino ComPort Terminal uygulamamız üzerine bu uygulamayı inşa edeceğiz.

Zedgraph C# Form
Zedgraph C# Form

Şimdi gelelim kodlamaya. Zedgraph’ ın bir çok özelliği bulunmaktadır. Biz bu yazımızda sadece x ve y bilgilerini plot yaptıracağız. Bunun üzerine siz kendinizi geliştirerek ve paylaşım yaparak bilginizi büyütebilirsiniz.

İlk önce using ataması yapın ve aşağıdaki kodu inceleyerek kendi uygulamanıza entegre edin.

Bu kod Arduino’ nun seri portundan gelen verileri okuyarak saniyede bir grafiğe eklemektedir.

// www.kaizen40.com

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using ZedGraph;                   // eklemeyi unutmayın


namespace GrafikUygulama
{
    public partial class Form1 : Form
    {
        string Gelen = string.Empty;
        string[] ports = SerialPort.GetPortNames();

        string ArduinoGelen = "";

        private int i = 0;
        
        GraphPane myPane = new GraphPane();                                 // graph oluşturuluyor
        RollingPointPairList listPoints = new RollingPointPairList(40);     // 40 adet bilgi tutuluyor fazlası siliniyor
        LineItem myCurve;                                                   // curve oluşturuluyor


        public Form1()
        {
            InitializeComponent();

            FormClosing += Form1_FormClosing;                                                                                           // form kapatıldığında çalışması için            
            serialPortArduino.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPortArduino_DataReceived);       // barkod serial port kesmesi oluştuğunda
        }

        private void serialPortArduino_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            ArduinoGelen = serialPortArduino.ReadLine();                    // string olarak oku

            Invoke(new EventHandler(ArduinoGoster));                        // textbox a yazmak için gönder
        }

        private void ArduinoGoster(object sender, EventArgs e)
        {
            try
            {
                if (chkArduinoDebug.Checked == true)                        // debug tıklı ise datayı ekrana yaz
                {
                    txtArduinoGelen.Text += ArduinoGelen + "\r\n";
                }
            }
            catch (Exception hata)
            {
                if (chkArduinoDebug.Checked == true)
                {
                    txtArduinoGelen.Text += hata;        // hatayı terminale yaz
                }
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPortArduino.IsOpen == true)
            {
                serialPortArduino.Close();          // Barkod okuyucu portu açıksa çıkarken kapat
            }

            if (serialPortArduino.IsOpen == true)
            {
                serialPortArduino.Close();         // Arduino portu açıksa çıkarken kapat
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string port in ports)                              // pc ye takılı olan device ların portlarını ekle
            {
                cmbArduinoPort.Items.Add(port);
            }

            cmbArduinoBaudRate.Items.Add("300");
            cmbArduinoBaudRate.Items.Add("600");
            cmbArduinoBaudRate.Items.Add("1200");
            cmbArduinoBaudRate.Items.Add("2400");
            cmbArduinoBaudRate.Items.Add("4800");
            cmbArduinoBaudRate.Items.Add("9600");
            cmbArduinoBaudRate.Items.Add("19200");
            cmbArduinoBaudRate.Items.Add("57600");
            cmbArduinoBaudRate.Items.Add("115200");

            cmbArduinoBaudRate.SelectedIndex = 5;
           
            myPane = zedGraphControl1.GraphPane;
            myPane.XAxis.Title.Text = "Zedgraph";
            myPane.XAxis.Title.Text = "Zaman(sn)";
            myPane.YAxis.Title.Text = "Basınç(bar)";

            zedGraphControl1.Invalidate();
            zedGraphControl1.AxisChange();
            zedGraphControl1.Refresh();
            
        }

        private void btnArduinoBaglan_Click(object sender, EventArgs e)
        {
            try
            {
                if (btnArduinoBaglan.Text == "Bağlan")   // bağlantıyı kes
                {
                    btnArduinoBaglan.Text = "Bağlantıyı Kes";
                    labelArduinoBaglanti.Text = cmbArduinoPort.Text + "," + cmbArduinoBaudRate.Text + ", Hat Açık";
                    serialPortArduino.PortName = cmbArduinoPort.Text;
                    serialPortArduino.BaudRate = Convert.ToInt32(cmbArduinoBaudRate.Text);
                    serialPortArduino.Open();     // portu aç
                }
                else// bağlan
                {
                    btnArduinoBaglan.Text = "Bağlan";
                    labelArduinoBaglanti.Text = "Hat Kapalı";
                    serialPortArduino.Close();    // portu kapat
                }
            }
            catch (Exception hata)
            {
                MessageBox.Show(hata.Message);
            }
        }

        private void btnArduinoTemizle_Click(object sender, EventArgs e)
        {
            txtArduinoGelen.Clear();
        }

        private void btnArduinoGonder_Click(object sender, EventArgs e)
        {
            if (serialPortArduino.IsOpen == true)
            {
                serialPortArduino.Write(txtArduinoGiden.Text);       // textbox ta yaz
            }
            else
            {
                MessageBox.Show("Port kapalıyken data gönderilemez!");
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                // zedgraph a her gelen datayı yükle
                i++;

                double x = i;              
                double y = Convert.ToDouble(ArduinoGelen);      // gelen değere göre interpolasyon yapabilirsiniz

                double limit = 500;    // limit değeri

                LineObj threshHoldLine = new LineObj(Color.Red, myPane.XAxis.Scale.Min, limit, myPane.XAxis.Scale.Max, limit);
                myPane.GraphObjList.Add(threshHoldLine);

                // grafiğe noktaları ekle
                listPoints.Add(x, y);
                myCurve = myPane.AddCurve(null, listPoints, Color.Blue);

                // ekranı scaleini ayarla
                myPane.YAxis.Scale.Min = 0;
                myPane.YAxis.Scale.Max = 10;

                // grafiği yenile
                zedGraphControl1.Invalidate();
                zedGraphControl1.AxisChange();
                zedGraphControl1.Refresh();

            }
            catch (Exception hata)
            {
                MessageBox.Show(hata.Message);
            }
        }

        private void BtnCiz_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void BtnDur_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;

            listPoints.Clear();
            i = 0;
        }
    }
}

Bol kodlamalar,

4 thoughts on “Zedgraph Kullanımı, Grafik Çizdirme – C#

  • 20 Mayıs 2020 tarihinde, saat 01:50
    Permalink

    Harika bir paylaşım teşekkür ederim… Ama ben yaptığımda tam çalışmıyor acaba nerede hata yaptığıma bakabilir misiniz??
    Bu programa ihtiyacım var baya bir süredir uğraşıyorum geri dönüş saglarsanız çok mutlu olurum..

    Yanıtla
      • 22 Mayıs 2020 tarihinde, saat 23:48
        Permalink

        sanırım isimlerin neler olduğunu bilmediğim için yanlış yapıyorum. Hata vermiyor ama com portları da gelmiyor.
        ilginiz için teşekkürler. 😀

        Yanıtla
  • 23 Mayıs 2020 tarihinde, saat 16:43
    Permalink

    taktığınız cihaz bilgisayar tarafından algılanmıyor olabilir. Basitce arduino ide’ yi açıp comport lar var mı yok mu bakın. Yada aygıt yöneticisinden taktığınız cihazın hangi portu alıp almadığını görebilirsiniz.

    Yanıtla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.