21 Mart 2015 Cumartesi

Arduino - C# Arayüzü ile Veri Okuma

Merhaba.
Arduino'dan okuduğumuz verileri direkt Serial Monitör'den ya da LCD'den okuyabiliyorduk. Fakat bu okunan veriler için bir tasarrufumuz olmuyordu.

Bu yazıda Arduino'dan okuduğumuz veriyi C# da gösterip, istediğimiz değerleri listbox'a kaydettiğim arayüzden bahsedeceğim. Bu arayüzü oluşturmamda yardımcı olan Necmettin Zengin arkadaşıma teşekkür ederim. 


Resimde de görüldüğü gibi arayüzde 4 buton, 2 combobox, 2 label ve 1 tane de listbox bulunmakta. 0 yazan yerde ölçülen analog değer gösterilecek ve ekle butonuna bastığımızda okunan değer listbox a eklenecek. C# da hazırlanan bu arayüz için ayrıca bir arduino yazılımına ihtiyaç bulunmamakta. Serial Monitör'de veri okuyacakmış gibi yazılımınızı oluşturmanız yeterli. 
RS232 vb. seri port haberleşmesinde deneme şansım olmadı, en yakın zamanda PIC için deneyip sonucunu burada yazarım.
C# kodlarına geçecek olursak ki yakın zamanda bununla alakalı bir video çekmeyi de planlıyorum;






  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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace Data_Okuma
{
    public partial class Form1 : Form
    {
        string[] ports = SerialPort.GetPortNames(); //Port Numaralarını ports isimli diziye atıyoruz.
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {   
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port); // Port isimlerini combobox1'de gösteriyoruz.
                comboBox1.SelectedIndex = 0;
            }            
            comboBox2.Items.Add("2400");  // Baudrate'leri kendimiz combobox2'ye giriyoruz.
            comboBox2.Items.Add("4800");
            comboBox2.Items.Add("9600");
            comboBox2.Items.Add("19200");
            comboBox2.Items.Add("115200");
            comboBox2.SelectedIndex = 2;
           
            label3.Text = "Bağlantı Kapalı";   //Bu esnada bağlantı yok. }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            {
            // Form kapandığında Seri Port Kapatılmış Olacak.
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
            }
        }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                string sonuc = serialPort1.ReadExisting();//Serial.print kodu ile gelen analog veriyi alıyoruz,string formatında sonuc'a atıyoruz
                label1.Text = sonuc + ""; //Labele yazdırıyoruz.
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); // basarısız olursa hata verecek.
                timer1.Stop();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start(); //250 ms olarak ayarladım timer'ı.
            if (serialPort1.IsOpen == false)
            {
                if (comboBox1.Text == "")
                    return;
                serialPort1.PortName = comboBox1.Text;  // combobox1'e zaten port isimlerini aktarmıştık.
                serialPort1.BaudRate = Convert.ToInt16(comboBox2.Text); //Seri Haberleşme baudrate'i combobox2 'de seçilene göre belirliyoruz.
                try
                {
                    serialPort1.Open(); //Haberleşme için port açılıyor
                    label3.ForeColor = Color.Green;
                    label3.Text = "Bağlantı Açık";


                }
                catch (Exception hata)
                {
                    MessageBox.Show("Hata:" + hata.Message);
                }
            }
            else
            {
                label3.Text = "Bağlantı kurulu !!!";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //BAĞLANTIYI KES BUTONU
            timer1.Stop();
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                label3.ForeColor = Color.Red;
                label3.Text = "Bağlantı Kapalı";
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add(label1.Text); //Okunan veri listbox'a atılıyor
        }

        private void button4_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear(); // listbox temizleniyor.
        }
       
                       

    }
        }
 


Arayüz oluşturma vidyom. Aynı arayüz değil :)

Microsoft Visual Basic Form şeklinde ve exe olarak aşağıdaki linkten programa ulaşabilirsiniz.

İndirme Linki


Burda da aynı arayüz programına Serial.ReadLine() methodu ile devam ederek veri okumayı daha stabil daha işlenebilir hale getirdim.



12 yorum:

  1. eline sağlık çok güzel olmuş.

    YanıtlaSil
  2. Selamlar Bahadır hocam.
    Arduinoya eklediğim bir butonla visual C# de yazdığım programa nasıl komut vermek istiyorum yardımcı olurmusunuz ?

    YanıtlaSil
    Yanıtlar
    1. E-mail adresimden ulaşın bana,yardımcı olurum size.

      Sil
  3. windows defender programa virüslü diyor.

    YanıtlaSil
    Yanıtlar
    1. .exe uzantılı bir dosya olduğu için normaldir. Windows form şeklinde olanı kullanın dilerseniz.

      Sil
  4. C# ile arduino bağlantısı kablosuz üzerinden nasıl yapabiliriz ve nasıl veri okuyabiliriz bunla ilgili yardımcı olabilirmisiniz?

    YanıtlaSil
  5. öncelikle böyle bir örnek için teşekkürler. bu örneğe bir buton ekleyerek seri porttan bilgi göndermek istiyorum naıl bir yol izlemem lazım

    YanıtlaSil
  6. plc c# bağlantısı ile bilgi verebilir misiniz?

    YanıtlaSil
  7. bende serial port 1 dee hata alıyorum tanımlı değil diyor nasıl düzelteceğim yada tanımlı hale geetireceğim

    YanıtlaSil
  8. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  9. bunu zedgrapha nasıl aktarabilirim

    YanıtlaSil