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.
// 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 yorum
zelis · 20 Mayıs 2020 01:50 tarihinde
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..
Remzi Şahinoğlu · 20 Mayıs 2020 14:50 tarihinde
Nasıl bir hata alıyorsunuz, paylaşailirseniz fikir verebilirim.
zelis · 22 Mayıs 2020 23:48 tarihinde
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. 😀
Remzi Şahinoğlu · 23 Mayıs 2020 16:43 tarihinde
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.