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.



1 Mart 2015 Pazar

Arduino - MQ-4 Gaz Dedektörü (Metan&Propan) Uygulaması

Askerliğim nedeniyle verdiğim 6 aylık aranın ve de Liverpool zaferimizin ardından tekrar merhaba :).

Bu yazımda MQ Gaz Sensörleri serisinden MQ-4 sensörünün uygulamasını gerçekleştireceğiz. MQ serisinin sensörlerinin hangi gazlar için üretildiği sonundaki rakamla belirtilmiş. Resimde MQ6 sensörü LPG ve Bütan gazına duyarlı iken uygulamasını yapacağımız MQ4 sensörü Metan,Propan ve CNG gazlarına duyarlı. Propan bildiğiniz üzere çakmaklarda kullanılıyor. Diğer gaz sensörleri ile ilgili daha fazla bilgi için aşağıdaki linke tıklayabilirsiniz.

MQ Gaz Sensörleri



MQ-5 GAZ SENSÖRÜ
Bu sensörlerin 6 bacağı bulunmakta ve bunlardan 4 pini 2'şerli olarak birbirleriyle kendiliğinden kısa devre. Bu 6 pin 3'erli 2 gruba ayrılmış. Bu 2 grubun ortasındaki pinler ise Heater(ısıtıcı) pinleri. Bize ise hangi tarafı Vcc hangi tarafı GND olarak belirleyeceğimiz kalıyor. Şekilde de görüldüğü gibi A kısmındaki pinleri kendi arasında kısa devre yapıyor ve Arduino'daki 5V'a takıyoruz. B kısmındaki B pinlerini de birbiriyle kısa devre yapıp analog girişine bağlıyoruz. B kısmındaki H pinini (ortadaki pin) de 10-20k ohm'luk bir dirençle B kısmındaki B pinlerine bağlayıp toprağa takıyoruz. Yazı ile biraz karışık oldu ama aşağıdaki fiqürde açıklamam daha anlaşılır olacaktır. Fiqürde sensörün alt kısmı A kısmı olarak belirlenmiş.Out yazan yer ise analogpin'e girecek olan pin.


Kodlarımız diğer analog ölçüm yapan kodlarla aynı, sensör değeri belirli bir seviyeye gelince 13. pine bağlı ledin yanmasını istedim. Çakmağınızla denemeler yapabilirsiniz.



 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int analogInPin = A0;  
const int ledPin = 13;

int veri = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
veri = analogRead(analogInPin);
if (veri >= 200)
{ digitalWrite(ledPin, HIGH);}
else
{ digitalWrite(ledPin, LOW);}

Serial.print("Okunan Değer = " );
Serial.println(veri);
delay(750);
}

Devremiz ve sensörden okuduğumuz değerler;



Videomuz ;



Kaynak olarak kullandığım siteler;