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.
Ö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.
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.
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.
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.
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.
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.
Genel olarak seri hakkındaki yorumlarınızı da bekliyorum. Bir sonraki yazıda görüşmek dileğiyle, hoşça kalın! 🙂
Eline sağlık, başlangıç için çok iyi oluyor. Çok fazla aralık vermeden devam derim…
Çok teşekkürler, beğenmenize sevindim. 🙂 Yazılar gelmeye devam edecek.
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
Yorumunuz için çok teşekkürler. Henüz yeni başladığımız bir seri olduğu için görüşleriniz çok kıymetli. 🙂
c# serinizi soluksuz takip ediyorum fakat python gibi farklı dillerle de örneklemeler gelicek mi ?
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. 🙂
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, bu hatayı hangi durumlarda veriyor acaba? Trackbarların minimum ve maksimum alabileceği değerleri barlara tıklayarak özellikler kısmından 0 ve 255 olarak ayarlarsanız muhtemelen sorununuz çözülecektir. İyi çalışmalar 🙂
Tşrklr
Hocam selamlar, ben System.IO.Ports kütüphanesini eklememe rağmen visual studio’m bazı komutları tanımlamıyor. Birkaç ekran görüntüsü aldım, yardım eder misiniz?
https://i.hizliresim.com/1pBd6Y.png
https://i.hizliresim.com/bvpbV0.png > bu görüntüde sarıyla işaretlediğim yerlerden komutun birini kabul ediyor diğerini etmiyor.
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 🙂
Teşekkür ederim düzeldi. Bu seri çok şey katıyor bana lütfen devam edin, hatta lcd ekranlı bir proje görmeyi çok isterim. İyi çalışmalar 🙂
Sıradaki proje lcd ekran ile alakalı olacak, başarılar 🙂
ya harikasınız elinize emeğinize sağlık
Combobox da portumu görmüyor nasıl düzeltebilirim ?
Merhaba, portu Arduino IDE üzerinden görebiliyor musunuz?
şu an bu sorunu çözdüm bu seferde rgb de green ve tonları yanmıyor
Form üzerindeki panelde gözüküyor, fakat lede mi yansımıyor? (yazıdakiyle aynı yaptığınızı varsayıyorum)
Aynen ben de bu hatayı alıyorum green ve tonlarını yanmıoyor led de, kodları birebir kontrol ettim acaba nerde hata yapıyorum ?
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.
Hocam önceki iki dersinizi takip ettim. Emekleriniz için takip ederim.
Bu derste kodu aynen yazmama rağmen hata verdi. Hatanın neden kaynaklandığını anlayamadım.
Açıklarsanız sevinirim.
https://hizliresim.com/PTM22x
Teşekkür ederim.
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 🙂
Teşekkür ederim.
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?
Merhaba, renkleri parlaklığı düşük bir şekilde mi görüyorsunuz? Ledi daha önce başka bir projede çalıştırmayı denediniz mi
programı 0 (0x0) koduyla çıktı hatası veriyor
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?
RGB renk kontrol ekranına nasıl girerim?
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?
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.