Herkese merhabalar! Bu yazımızda projelerimizden seri haberleşme ile nasıl veri alabileceğimizi ve bunu bir text dosyası içine nasıl kaydedebileceğimizi göreceğiz. Sonraki derslerde de bu metodu kullanarak farklı uygulamalar geliştirmeye devam edeceğiz. Önceki derste Arduino ve C# ile seri haberleşmeye giriş yapmıştık ve C# ile tasarladığımız arayüzden led kontrol etmiştik. Eğer doğrudan bu yazıya geldiyseniz önceki yazıya göz atmanızı tavsiye ederiz.

Akış Diyagramı

Hatırlayacağınız üzere önceki dersimizde bilgisayarımız üzerinden led kontrol etmiştik, bu sefer bir veri gönderme işlemi değil de okuma işlemi gerçekleştireceğiz. Bu iş için bir LDR kullanacağız. LDR’den gelen değerleri arayüz üzerinden görebileceğiz.

LDR ile Işık Algılama Uygulaması

Oldukça basit bir uygulama yapacağız. LDR’den aldığımız verileri seri porta gönderen basit bir kod kullanacağız. LDR ile alakalı daha detaylı bilgiye buraya tıklayarak ulaşabilirsiniz.

Devremizi şemadaki gibi kurarak işe başlıyoruz. Bu uygulama için gereken malzemeler:

Bağlantıyı aşağıdaki şemaya uygun şekilde yapıyoruz.

LDR Bağlantı Şeması

Kodumuzu yüklüyoruz.

int ldr = 0;
char c;
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available())
c = Serial.read(); //Gelen değeri oku
if(c == '1') //Gelen değer 1 ise;
{
int deger = analogRead(ldr); //ldr'den gelen değeri oku
Serial.println(deger); //değeri seri port ekranına yaz
delay(1000); //1000 milisaniye bekle
}
}

C# ile Arduino’dan Veri Alma

Bu kısımda kurduğumuz devreden aldığımız verileri arayüz üzerinden anlık zaman bilgisi ile beraber görüntülemeyi göreceğiz. Ardından bu verileri bir text dosyası içine kaydedeceğiz. Visual Studio ile alakalı genel özelliklere ilk yazımızda değinmiştik. Genel bilgilerle alakalı takıldığınız noktalarda önceki yazıdan yardım alabilirsiniz.

C# Arayüz Tasarımı

Kullanacağımız arayüzü tasarlayarak işe başlıyoruz. İlk yazımızdaki arayüzde kullandığımız araçlardan farklı olarak bu uygulamada TextBox, PictureBox, ProgressBar ve Timer araçlarını da kullanacağız. Görseldeki düzen için 3 Button, 1 ComboBox, 2 Label, 1 TextBox, 1 ProgressBar, 1 PictureBox, 1 Timer ve 1 SerialPort’u araç kutusundan sürükleyerek forma taşıyorum.

Arayüz Tasarımı

Butonları veri almayı başlatma-durdurma ve TextBox içinde biriken veriyi sıfırlamak için kullanacağız. PictureBox’a bir “Kaydet” ikonu ekleyeceğiz ve kaydetme işlemini bu ikona tıklayarak gerçekleştireceğiz. Bu işlem için bir buton da kullanılabilir. ProgressBar üzerinden de güncel LDR verisi ile ilgili bilgi alacağız. Timer ile de belli bir sıklıkta LDR verilerini çekeceğiz.

TextBox Multiline Özelliğini Aktif Hale Getirm

TextBox’ı forma sürüklediğinizde tek satır olarak gelir. Biz ardı sıra veriler alacağımız için MultiLine özelliğini aktif etmemiz gerekiyor. Aynı zamanda TextBox üzerindeki ScrollBars özelliğini de aktif ediyoruz.

ScrollBars Aktif Hale Getirme

Öncesinde bilgisayarımıza yüklediğimiz ikonumuzu -kaydet butonu için- PictureBox‘a ekliyoruz ve boyut modunu StretchImage olarak seçiyoruz.

PictureBox Resim Ekleme

ProgressBar için ise maksimum ve minimum değerleri belirlememiz gerekiyor. Maksimum okuyabileceğimiz değer 1023 olduğu için buna uygun şekilde bir düzenleme yapabiliriz.

ProgressBar Özellikler

Tasarım kısmını tamamladıktan sonra kodumuzu yazmaya başlayabiliriz.

C# Proje Kodu

Kod tarafında neler yapacağımızı kısaca görelim.

Kod içinde try-catch yapısını birkaç kez kullanacağız. Bunu basitçe şu şekildeaçıklayabiliriz:“try{}” butona tıklandığında gerçekleşmesini istediğimiz kod satırlarını; “catch{}” ise bir hata türü ile karşılaşıldığında gerçekleşmesini istediğimiz komutları barındırıyor.

Baslat_click olayı için yazdığımız kodlara bir göz atarak başlayalım. try{} içerisine seri port ismini ve iletişim hızını belirleyerek iletişimi başlatan komutlarımı ekliyorum. Bu kısma önceki yazıdan aşinayız. Ardından Timer1’i başlatıyorum ve Timer1’in zaman aralığını 1000 milisaniye olarak belirliyorum. Butona basıldığında tekrar basarak bir hata ile karşılaşmamak adına başlat butonunu pasif; durdur butonunu aktif hale getiriyorum. Hata durumunda hata mesajını kullanıcıya aktaran fonksiyonumu da catch{} içine ekliyorum.

baslat_click olayı

Veri alma işlemini durduracak olan buton(Durdur) ve textBox içindeki yazıyı sıfırlayacak olan buton(Sıfırla) için de gerekli kodları ekliyorum.

Durdur ve Sıfırla Butonları

Timer çalıştığında Arduino üzerinden verileri almaya başlayacağız. Seri port üzerinden “1” göndererek Arduino’dan veri akışını başlatıyoruz. Port üzerinden ReadLine() fonksiyonu ile okuduğumuz değeri string tipinde bir değişkene kaydediyoruz. Ardından progressBar’daki değeri ve barın hemen üstündeki label1 metnini güncel veriye eşitliyoruz. Aynı şekilde textBox içine de data değişkeni ile beraber güncel tarih ve saati de eklemeyi ihmal etmiyoruz.

timer1_Tick

“Kaydet” ikonuna tıkladığımızda textBox1 içindeki tüm veriyi bir text dosyası içine kaydetmesini istiyorum. Bunun için dosyayı kaydedeceğim lokasyonu ve kaydedeceğim dosyanın ismini belirlemem gerekiyor. Bu isimleri string tipindeki 2 değişkene ekliyorum. Ardından WriteAllText() fonksiyonu ile textBox1 içindeki değerleri belirlediğimiz lokasyona kaydediyorum.

Kaydet butonu

Yalnızca Form1_Load ve Form1_FormClosed için yazdığımız kodlardan bahsetmedik. Bu kısımlara önceki yazıda değinmiştik. Tüm kodu aşağıda bulabilirsiniz. Yorum satırlarını da takip ederek kodu detaylı bir şekilde inceleyebilirsiniz.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace arduino_ldr_veri_okuma
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.ReadOnly = true;                    //textBox1'i yalnızca okunabilir şekilde ayarla
            string[] ports = SerialPort.GetPortNames();  //Seri portları diziye ekleme
            foreach (string port in ports)
                comboBox1.Items.Add(port);               //Seri portları comboBox1'e ekleme

        }

        private void baslat_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;  //ComboBox1'de seçili nesneyi port ismine ata
                serialPort1.BaudRate = 9600;            //BaudRate 9600 olarak ayarla
                serialPort1.Open();                     //Seri portu aç
                timer1.Start();                         //Zamanlayıcıyı başlat
                timer1.Interval = 1000;                 //Zamanlayıcı aralığını 1000 milisaniye olarak ayarla
                durdur.Enabled = true;                  //Durdurma butonunu aktif hale getir
                baslat.Enabled = false;                 //Başlatma butonunu pasif hale getir
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Hata");    //Hata mesajı göster
            }
        }

        private void durdur_Click(object sender, EventArgs e)
        {
            timer1.Stop();              //Zamanlayıcıyı durdur
            serialPort1.Close();        //Seri Portu kapa
            durdur.Enabled = false;     //Durdurma butonunu pasif hale getir
            baslat.Enabled = true;      //Başlatma butonunu aktif hale getir
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();    //Seri port açıksa kapat
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Write("1");
                string data = serialPort1.ReadLine();                                  //Seri port üzerinden okunan değeri data değişkenine ata
                progressBar1.Value = Convert.ToInt16(data);                            //Data değişkenini int olarak çevir ve progressBar1 değeri yap
                textBox1.Text += DateTime.Now.ToString() + "        " + data + "\n";   //textBox1'deki metne güncel tarih ve saatle beraber data değerini ekle
                label1.Text = "Işık Değeri = " + data;                                 //label1'e data'yı yazdır
            }
            catch
            {
            }
        }

        private void sifirla_Click(object sender, EventArgs e)
        {
            textBox1.ResetText();           //textBox1'i sıfırla
        }

        private void kaydet_Click(object sender, EventArgs e)
        {
            try
            { 
                string filelocation = @"C:\Users\alperen\Desktop\dosya\";                                   //Dosyanın kaydedileceği konumu belirliyoruz
                string filename = "data.txt";                                                               //Kaydedilecek dosyanın ismi
                System.IO.File.WriteAllText(filelocation + filename, "Zaman\t\t\tDeğer\n" + textBox1.Text); //Dosya konumuna textBox1 üstündeki verilerden oluşan text dosyamızı kaydediyoruz
                MessageBox.Show("Dosya başarıyla kaydedildi", "Mesaj");                                     //Dosya kaydedildiğinde kullanıcıya mesaj gönder
            }
            catch (Exception ex2)
            {
                MessageBox.Show(ex2.Message, "Hata");       //Hata mesajı
            }
        }
    }
}

Böylece serinin 2. yazısının da sonuna gelmiş olduk. Sonraki yazılarda da Arduino projeleri için arayüzler geliştirmeye devam edeceğiz. 3. derse kadar pratik yapmanızı ve öğrendiklerimizi kullanarak arayüzler geliştirmenizi tavsiye ederim. Yazı hakkındaki yorumlarınızı bekliyorum, bir sonraki projede görüşmek dileğiyle, hoşça kalın! 🙂

CEVAP VER

Please enter your comment!
Please enter your name here