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.

Ş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.

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

Ş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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | // 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,
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..
Nasıl bir hata alıyorsunuz, paylaşailirseniz fikir verebilirim.
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. 😀
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.