back to top

Arduino ve C# Haberleşmesi ile RGB Led Kontrolü – 3. Ders

Arkadaşlar merhaba, Arduino ve C# haberleşmesi serisinin 3. yazısında RGB led kontrolü yapabileceğimiz bir arayüz tasarlayacağız. Tasarladığımız arayüz üzerinden seçtiğimiz renkleri led üzerinden takip edebileceğiz.

Akış Diyagramı

Önceki iki yazıda sırasıyla veri gönderme ve alma işlemleri ile alakalı uygulamalar yapmıştık. Aynı zamanda bu iki yazı bazı temel konular üzerinde daha çok durduğumuz yazılardı. O yüzden bu yazıya geçmeden önce serinin ilk iki yazısını okumanızı tavsiye ederim.

RGB Led Kontrol Uygulaması

Önceki yazılarda da olduğu gibi işe gerekli bağlantıları yaparak ve Arduino kodumuzu yükleyerek başlıyoruz.

Gerekli Malzemeler:

RGB led ile alakalı daha detaylı bilgiye buraya tıklayarak ulaşabilirsiniz.

NOT: Bu projede ortak anot bir RGB led kullandık, eğer elinizdeki led ortak katot bir yapıya sahipse ikinci bacaktaki 5V bağlantısını GND‘ye çevirmelisiniz. Bununla birlikte kod tarafında da yorum satırı şeklinde eklediğim kodu kullanmalısınız.

RGB Led ve Arduino Bağlantı Şeması

Bağlantıyı şemadaki gibi yaptıktan sonra aşağıdaki kodu Arduino’ya yüklüyoruz. Kod basit bir şekilde seri port üzerinden gelen değerlerle ledimizi yakacak.

#define kirmizi 9
#define yesil 10
#define mavi 11
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() == 3)
{
analogWrite(kirmizi, 255 - Serial.read());
analogWrite(yesil, 255 - Serial.read());
analogWrite(mavi, 255 - Serial.read());
/*Lediniz ortak katot ise aşağıdaki kodu kullanın
analogWrite(kirmizi, Serial.read());
analogWrite(yesil, Serial.read());
analogWrite(mavi, Serial.read()); */
}
}

C# Arayüz Tasarımı

Önceki iki yazıda kullandığımız araçlardan farklı olarak Panel, ColorDialog ve TrackBar araçlarını tasarımımıza dahil edeceğiz. Panel, seçilen rengi görüntüleyeceğimiz kısım olacak. ColorDialog, Timer ve SerialPort gibi form üzerinde gözükmeyen bir nesnedir, renk paletini kullanarak özel renkler tanımlamamızı sağlar. TrackBar ile de hem mevcut rengin R-G-B değerlerini görebileceğiz hem de bu değerler üzerinde değişiklik yapabileceğiz.

RGB Renk Kontrolü Arayüzü

Arayüz tasarımını görseldeki gibi tamamlamış olduk. Form üzerindeki nesnelerin işlevlerinden bahsetmek gerekirse: Arayüz üstündeki 12 renkli buton ledimizin rengini ayarlamamızı sağlıyor. Bu 12 butonun altındaki buton ise renk paletini kullanarak özel renkler tanımlamamıza yarıyor. Seçtiğimiz rengi panel kısmında görebildiğimiz gibi rengin R-G-B değerlerini de 3 TrackBar ve 3 Label üzerinden takip edebiliyoruz. Renk ayarı TrackBar’lar kullanılarak da yapılabilir.

C# Proje Kodu

Bu yazıda önceki yazılarda olduğu gibi kod içindeki her kısmın üzerinde durmayacağım. Kod, önceki iki uygulamadan uzun olsa da birbirine çok benzer komutlardan oluşuyor.

Önceki derslerden farklı olarak bu projede kendi oluşturduğumuz bir fonksiyonu kod içinde sıkça kullanacağız. Fonksiyon, içerisine gelen rengi panel rengi olarak ayarlayacak. Bununla beraber TrackBar ve Label’da rengin R-G-B değerlerini gösterecek ve bu değerleri seri port üzerinden bir dizi olarak gönderecek.

SetColor() Fonksiyonu

Peki neden bir fonksiyon yazma ihtiyacı duyduk? Form üzerindeki neredeyse tüm nesnelerin görevi aynı: Rengi ayarlamak. Bu yüzden her bir nesnede gerçekleşecek olaylar için yazacağımız kod birbirinin neredeyse aynısı, değişen tek şey göndereceğimiz renk. Bu yüzden her nesne için fazladan kod satırı yazmak yerine bunu bir fonksiyon olarak tek seferde yazıyoruz ve kodun neredeyse tamamında kullanıyoruz.

“RENK PALETİ” butonuna bastığımızda paletin açılmasını Show.Dialog() fonksiyonu ile sağlıyoruz. Ardından panel üzerinde seçtiğimiz rengi, SetColor() fonksiyonu içine atıyoruz. Bunu renk ayarlaması için eklediğimiz tüm butonlarda yapacağız.

Buton “Click”

Hatırlayacağınız gibi forma eklediğimiz TrackBar’ları rengi ayarlamak için de kullanacaktık. TrackBar kaydırıldığında değişen rengi SetColor() fonksiyonuna gönderiyoruz. Butonlardakinden farklı olarak gönderdiğimiz rengi FromArgb() metodu ile gönderdik. Bu sayede 3 Bar üstündeki R-G-B değerlere bağlı olarak rengimizi değiştirebiliyoruz.

TrackBar “Scroll” olayı

Kodun bahsetmediğimiz kısımlarında da önceki uygulamalardan aşina olduğumuz SeriPort’u açıp kapatan fonksiyonları ekliyoruz. Kodu yorum satırları ile birlikte aşağıda ayrıntılı 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 rgb_led_kontrol
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        private void SetColor(Color color)   //Renk ayarlama fonksiyonu
        {
            try
            {
                panel1.BackColor = color;   //Panel rengini ayarla
                label1.Text = "R = " + color.R.ToString();  //Rengin R değerini yazdır
                label2.Text = "G = " + color.G.ToString();  //Rengin G değerini yazdır
                label3.Text = "B = " + color.B.ToString();  //Rengin B değerini yazdır
                R.Value = color.R;     //TrackBar 1
                G.Value = color.G;     //TrackBar 2
                B.Value = color.B;     //TrackBar 3
                SerialPort.Write(new[] { color.R, color.G, color.B }, 0, 3);  //Rengin RGB değerlerini porta gönder
            }
            catch(Exception ex2)
            {
                MessageBox.Show(ex2.Message, "Hata"); //Hata mesajı
            }

        }


        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();  //Seri portları diziye ekleme
            foreach (string port in ports)
                comboBox1.Items.Add(port);               //Seri portları comboBox1'e ekleme
        }
  

        private void button1_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();    //Renk paletini aç
            SetColor(colorDialog1.Color); //Rengi renk paletinde seçilen olarak ayarla
            
        }

        private void kirmizi_Click(object sender, EventArgs e)
        {
            SetColor(Color.Red);         //Rengi kırmızı olarak ayarla
        }

        private void yesil_Click(object sender, EventArgs e)
        {
            SetColor(Color.Lime);        //Rengi yeşil olarak ayarla
        }

        private void mavi_Click(object sender, EventArgs e)
        {
            SetColor(Color.Blue);        //Rengi mavi olarak ayarla
        }

        private void mor_Click(object sender, EventArgs e)
        {
            SetColor(Color.Purple);      //Rengi mor olarak ayarla
        }

        private void sari_Click(object sender, EventArgs e)
        {
            SetColor(Color.Yellow);      //Rengi sarı olarak ayarla
        }

        private void magenta_Click(object sender, EventArgs e)
        {
            SetColor(Color.Magenta);     //Rengi magenta olarak ayarla
        }

        private void cyan_Click(object sender, EventArgs e)
        {
            SetColor(Color.Cyan);        //Rengi cyan olarak ayarla
        }

        private void beyaz_Click(object sender, EventArgs e)
        {
            SetColor(Color.White);       //Rengi beyaz olarak ayarla
        }

        private void turuncu_Click(object sender, EventArgs e)
        {
            SetColor(Color.Orange);      //Rengi turuncu olarak ayarla
        }

        private void pembe_Click(object sender, EventArgs e)
        {
            SetColor(Color.DeepPink);    //Rengi pembe olarak ayarla
        }

        private void kahverengi_Click(object sender, EventArgs e)
        {
            SetColor(Color.Brown);       //Rengi kahverengi olarak ayarla
        }

        private void yesil2_Click(object sender, EventArgs e)
        {
            SetColor(Color.Green);       //Rengi yeşil olarak ayarla
        }

        private void R_Scroll(object sender, EventArgs e)
        {
            SetColor(Color.FromArgb(R.Value,G.Value,B.Value));   //RGB Renk ayarı
        }

        private void G_Scroll(object sender, EventArgs e)
        {
            SetColor(Color.FromArgb(R.Value, G.Value, B.Value)); //RGB Renk ayarı
        }

        private void B_Scroll(object sender, EventArgs e)
        {
            SetColor(Color.FromArgb(R.Value, G.Value, B.Value)); //RGB Renk ayarı
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                if (!SerialPort.IsOpen)
                {
                    SerialPort.PortName = comboBox1.Text; //Port ismini comboBox1'den al
                    SerialPort.BaudRate = 9600;           //BaudRate'i 9600 olarak ayarla
                    SerialPort.Open();                    //Seri portu aç
                    button2.Text = "KES";                 //Buton2 yazısını değiştir
                }
                else
                {
                   
                    SetColor(Color.Black);                //Rengi siyah olarak ayarla
                    button2.Text = "BAĞLAN";              //Buton2 yazısını değiştir
                    SerialPort.Close();                   //Seri portu kapa

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

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

    }
}

3. dersin sonuna gelmiş olduk. Bir sonraki yazıda sizlerle başka bir yazımızda benzerini yaptığımız bir mesafe ölçer yapacağız. O yazıdan tek farkı mesafeyi kendi tasarladığımız arayüz üzerinden takip edebileceğiz.

RGB Led Kontrol Arayüzü

Genel olarak seri hakkındaki yorumlarınızı da bekliyorum. Bir sonraki yazıda görüşmek dileğiyle, hoşça kalın! 🙂

Son Çıkan Yazılar

32 YORUMLAR

  1. C# dilinde orta seviyede bilgisi olan biri olarak gerek arduino editörde gerekse visual studio da yazılan kodlar açıklayıcı bir şekilde verilmiş ve zaten kodlar da basit. Teşekkürler. Umarım böyle devam edersiniz

    • Merhaba, öncelikle ilginiz için teşekkürler. 🙂 C# serisi bitene kadar farklı bir seriye başlama planımız yok. Bu seriyi bitirdikten sonra farklı diller ile de çalışmalar yapabiliriz tabii. 🙂

  2. Merhaba, C# ile arduino örnekleri hazırlamanız çok isabetli olmuş. Bu örneği yaptım ancak çözemediğim bir sorunum var.Yardımcı olursanız sevinirim.

    ‘255’ değeri ‘Value’ için geçerli değil. ‘Value’ değeri ‘Minimum ile ‘Maximum’ arasında olmalıdır.
    Paramtre adı :Value şeklinde hata veriyor. Sebebi ne olabilir?

    • Merhaba,
      Sarıyla işaretlediğiniz kısım ve hata aldığınız kısımda kullandığınız kısımdaki “SerialPort” aynı şeyi ifade etmiyor. Biri ilgili kütüphaneden gelen bir “class” diğeri ise bizim oluşturduğumuz port isminden geliyor. Tasarım kısmında serial port oluştururken program bu objenin ismini varsayılan olarak “serialPort1” olarak atar. Ben bu projede ismi “SerialPort” olarak değiştirmiştim(arayüz tasarımı bölümündeki resimde görebilirsiniz), siz de aynısını yaparsanız problem çözülecektir veya hata aldığınız kısımları “serialPort1” olarak değiştirirseniz sorun çözülür. Özetle objenin ismini kodda yanlış yazmaktan kaynaklanan bir hata alıyorsunuz. İyi çalışmalar 🙂

  3. Merhaba,
    Arduino programında yer alan “if (Serial.available() == 3)” satırında neden 3’e eşitliyoruz ? Mantığını anlayamadım. Açıklarsanız sevinirim.

    • Merhaba,
      Serial.available() seri porta gelen ve okunmaya hazır olan byte sayısını tutar. 3 bytelık bir veri alışverişi olduğu için bu şekilde bir şart koyduk.

    • Merhaba, bu yazıdaki kodlarda seri portun varsayılan ismini yani serialPort1’i değil de SerialPort ismini kullandık. Genel olarak kodları birebir alma şeklinde değil de konsepti anlayarak adım adım gitmeye çalışın, hatayı düzeltmek için port ismini serialPort1 olarak düzenlerseniz düzelecektir. Diğer değişkenler için de hata alıyorsanız muhtemelen aynı sebepten dolayıdır. Kolay gelsin 🙂

  4. Bağlantı şemasını ve Formların kodları doğru olduğu halde RGB led, formdaki renkleri yansıtmıyor ve güçsüz kalıyor. Mavi ve yeşil renklerini yakabiliyor sadece! ne yapmam gerekiyor?

  5. SerialPort.GetPortNames() üyesine erişilemez
    “Form1” bir “trackBar1_scroll” tanımı içermiyor ve “Form1” türünde bir ilk bağımsız değişken kabul eden hiçbir erişilebilir “trackBar1_scroll” genişletme yönetim bulunamadı
    hataları alıyorum lütfen yardımcı olabilir misiniz?

  6. Merhaba,
    Programı çalıştırırken SetColor fonksiyonunun R.Value, G.Value ve B.Value kısmında ‘R’,’G’,’B’ nin tanımsız olduğunu söylüyor. Programı çalıştırabilmem için R, G, B yi nasıl tanımlamam gerekiyor yardımcı olabilir misiniz?

  7. Sorunun trackbar adlandırmasına bağlı olduğunu anladım, şuan hata almıyorum, ancak şimdi de arayüzü çalıştırırken combobox’da port seçtikten sonra bağlanma butonuna basınca arduino ile bağlantı kuramıyorum(butonun yazısı dahi değişmiyor). Farklı serial port uygulamaları daha önce yaptım ve herhangi bir sorunla karşılaşmamıştım.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz