25 Aralık 2015 Cuma

Arduino - ULN2003A ile Step (Adım) Motor Sürme


DC Motor ve  Servo Motoru PWM yöntemiyle sürmüştük. Step motorun sürülmesi ise bu diğer 2 motora göre biraz daha farklı. Step motorlar dijital kontrollüdürler ve her gönderilen pals için belli açıda döndürülebilirler. Hassasiyet gereken küçük açılarla hareket etmesi istenen cihazlar için kullanılırlar.



Soldaki gifte görüldüğü gibi step motorun 4 sargısında sırasıyla verilen lojik-1'ler ile oluşan manyetik alan sayesinde rotorun dönmesi sağlanır.

Step motorun sürülmesi için 2 yöntem vardır. Bunlar "Tam Adım" ve "Yarım Adım" sürme teknikleridir.

Tam Adım'da motor sargılarının ikisi aynı anda enerjilendirilir, tıpkı soldaki gifte görüldüğü gibi.

Yarım Adım'da ise tek faz ve tam adım sürme adımları art arda uygulanır. Böylece motor her enerjilendirmede yarım adım döner.



Kullandığımız motor 28BYJ-48 Tam adımda 3º , Yarım Adımda 1.5º dönmekte. Biz uygulamamızda yarım adım yöntemini kullanacağız. Tam adım ve yarım adım motor sürmek için sargılara sırasıyla uygulanması için gereken pals tablosu  aşağıda.




Yapacağımız uygulamayı özetlemek gerekirse bağladığımız 2 buton ile step motorumuza 1.5º'lik açıyla yön vereceğiz. 

Bu sargılara verilmesi gereken akımı Arduino karşılayamadığı için dolaylı yoldan, ULN2003A entregresini kullanarak süreceğiz. Bu entegre 500mA'e kadar çıkış verebilmektedir.





Kodlarımız;




  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
#define IN1  8
#define IN2 9
#define IN3 10
#define IN4 11
#define saga 2
#define sola 3

int bekle=1;

void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(saga,INPUT_PULLUP);
pinMode(sola,INPUT_PULLUP);
}

void loop()
{
if(digitalRead(saga)==HIGH)
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(bekle);
}
if(digitalRead(sola)==1)
{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(bekle);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
delay(bekle);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
delay(bekle);

}
}

Denemek için zamanım olmadı fakat I/O kodlarını hexal moda çevirip kısaltarak burda tekrar paylaşacağım. 

Tam adım sürmek isteyenler, sargıları tek tek lojik-1 (HIGH) yaparak sonuca ulaşabilirler.

NOT: Daha önce ki motor uygulamalarımızda yaptığımız gibi motorun beslemesini toprakları ortak olmak şartıyla dışardan almanızda fayda var. Fakat beslemeyi Arduino'dan almanızda da bir sakınca yok, çalışıyor.

Uygulama Videosu;





Şemalarını kullanmış olduğum kaynaklar;
http://domoticx.com/arduino-modules-stappenmotor-28byj-48/

http://www.electricaleasy.com/2014/10/stepper-motor.html

16 Aralık 2015 Çarşamba

PIC18F452 CCS C - Yazılımsal PWM ile Servo Motor Sürme

Bu yazımda daha önce Arduino kullanarak sürdüğümüz servo motoru aynı şekilde PIC ile yapmaya çalışacağız. Bildiğiniz gibi Arduino, kütüphaneleri sayesinde  işimizi çok kolaylaştırmakta fakat aynı durumu PIC için söyleyemeyeceğim. Kütüphane kullanmadan yazılımsal PWM ile servoyu CCS C kullanarak kontrol etmeye çalışacağız.

Öncelikle servo motorlar hakkında detaylı bilgi için Arduino ile yaptığımız uygulamanın yazısını okumanız yeterli olacaktır.Bağlantı linki;

http://arduinotik.blogspot.com.tr/2014/05/arduino-pwm-ile-servo-motor-surme.html




 
Yazılımsal PWM oluşturma mantığımız soldaki gifte görüldüğü gibi olacak. Toplamda 20 ms'lik bir sinyal üretip 0 Derece için 1ms, 180 Derece için 2 ms lik bir duty cycle oluşturacağız. En azından teorik olarak. Çünkü kullandığım servo motor (SG90), 550us-2550 us'lik duty cycle ile çalışmakta. Tabii ki sinyal genişliğimiz yine 20ms olacak.





Yazılım kodlarını atmadan önce yaptığım işlemlerden kısaca bahsetmek istiyorum. Öncelikle servo motor için aç-kapa mantığı ile (led yakıp söndürme ile aynı) bir fonksiyon oluşturdum. Bu açma-kapama süreleri arasında kullandığım gecikme zamanlarını da potansiyometreden okuduğum adc değerleri ile belirledim. Yani servo motor potansiyometreden okundan adc değerine göre açıyı belirleyip konum alacak.

Neden donanımsal PWM kullanmadım ? Çünkü PIC ile 50 Hz'lik donanımsal PWM sinyali oluşturamıyorum. Bu yüzden yazılımsal PWM'i tercih ettim.




#include <main.h>
#include <flexy_lcd.c>
#use fast_io(a)
#use fast_io(d)

unsigned long int i=0,aci=0;

void servo(unsigned long int b,c)
{
output_high(pin_d7);
delay_us(550+b); // PWM Dolu Kısım
output_low(pin_d7);
delay_us(19450-b); //PWM Dolu Kısmı 20 ms'e tamamlayacak kısım
printf(lcd_putc,"\fAci = %u Derece",c);
continue;
}

void main()
{ set_tris_a(0x01);
set_tris_d(0x00);
output_d(0x00);
setup_adc(adc_clock_div_16);
setup_adc_ports(AN0);
set_adc_channel(0);
lcd_init();
while(1)
{
i=read_adc();
aci=i*2/11.1;
i=i*2;
servo(i,aci);
}
}


LCD kütüphanenizi kendinize göre belirlemeyi unutmayın.

Potansiyometrenin orta ucunuz A0 pinine, Servo motorun PWM ucunu da D7 pinine bağladım.

Ayrıca Servo motoru toprak uçları aynı olmak şartıyla başka bir kaynaktan beslemenizde gerekiyor.

SG90 Tower Pro Servo Motoru  550us-2550us arasında çalışıyor. Yani her şekilde en az 550 mikrosaniyelik bir PWM sinyalimiz olacak ve açı eklemelerimiz bu sürenin üzerine olmalı. En fazla da 2550 mikrosaniye.

Kabaca bir hesapla 10 bitlik ADC kullanarak 1023 değerini elde ettiğimizde PWM sinyalimizin doluluğun 2550 mikro saniye olması gerekiyor. Yani,

550+ADC.X=2550  denkleminde ADC yerine 1023 koyarsak,

X= 1,955 çıkıyor. delay_us fonksiyonunu kullanırken içinin tam sayı olması için bu değeri 2'ye yuvarladım. Ondalıklı değerlerde sıkıntı çıkıyor çünkü.

LCD'de açıyı göstermek için de, servonun her 1 derecelik dönüşünün 11.1 us olduğunu hesapladım. Dolayısıyla 2 ile çarptığım değeri 11.1'e böldüğümde açı değeri çıkıyor.

(2550-550) / 180 = 11.1 us

void servo fonksiyonu ile de  minimum 550us'lik lojik-1 ve bunu 20000us (20ms) ye tamamlayacak lojik-0  (20000-550=19450 us) değelerinden; lojik-1'e  2 ile çarptığımız ADC değerini ekler, lojik-0'dan da bu değeri çıkarırsak servomuzu sürebiliriz. 
PWM sinyalimizin frekansının  her zaman 50Hz, periyodunun da 20ms olduğuna dikkat ediniz.

Bu arada kullanmış olduğum






header dosyasının kodları da aşağıda ve siz direkt yazılımın başına ekleyebilirsiniz dilerseniz. Ya da benim kullandığım gibi ana programın olduğu klasöre atıp include edebilirsiniz.



#include <18F452.h>
#device adc=10

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits

#use delay(clock=20000000)

Uygulamanın videosu;



19 Haziran 2015 Cuma

Arduino - Android Arayüzünden Bluetooth ile Veri Okuma

2 aylık bir aranın ardından tekrardan merhaba :).

Bu yazımda, MIT App Inventor 2 aracılığı ile oluşturduğum android programdan bahsedeceğim. Aslında programı ben oluşturmadım,internet üzerinden araştırırken buldum, görünümünde bir kaç değişiklik yaptım göze daha hoş gelmesi için.

Android programımız ,arduino ile herhangi bir sensörden ölçtüğümüz değeri HC-06 bluetooth modülüne bağlanarak görmemizi sağlıyor. Bu modül ile ilgili daha önceki uygulamamız ve yazılım için buraya tıklayınız.

Arduino yazılımınızı oluştururken, android bağlantısı için ayrıca bir kod yazmanıza gerek yok. Sadece HC-06 Bluetooth modülünüzü Arduino'ya bağlamanız ve görmek istediğiniz sensör ya da herhangi değeri, Arduino IDE'deki "Serial Monitör" de görmek ister gibi yazmanız yeterli. 
Bunun için bildiğiniz üzere "Serial.println();" komutunu kullanıyoruz.


ÖNEMLİ !!! 
Arduino yazılımını oluştururken okunan verinin ekranda gösterilme sıklığını yüksek tutmanız( 1000 ms ve fazlası) ya da okunan değeri integer olarak gösterirseniz sıkıntı yaşamazsınız. Diğer türlü bazı okuma sıkıntıları oluşabiliyor android programda.


LM35 ile sıcaklık ölçümü yaptım, %100 olmasa bile başarılı.

APP Inventor komutları;



Proje dosyalarına aşağıdaki linkten ulaşabilirsiniz.Hem App Inventor 2 'de kendinize göre düzenlemeniz için .aia uzantılı proje dosyasını, hem de telefonunuza kendi hazırlamış olduğum programı direkt yükleyip kullanmanız için  .apk uzantılı andorid programı da attım.

https://drive.google.com/file/d/0B7Iv2kkg1He_SnB1WHpJckswQUk/view?usp=sharing

14 Nisan 2015 Salı

PIC16F877A CCS C - PWM ile DC Motor Sürme


Arduino ile DC motor sürmüştük. Aynı uygulamayı PIC ile yapmak isteyenler için bu yazıyı oluşturdum. 
0-1023 arası okunan ADC değerini, 0-255 arasında bir değere dönüştürerek motoru istediğimiz hızda süreceğiz.
Şemada npn,pnp ve mosfet kullanarak oluşturulmuş bir sürücü devresi var. İsterseniz Arduino ile yaptığımız uygulamadaki sürücü devresi ile de bu uygulamayı gerçekleştirebilirsiniz.2N2222 transistörünü kullanabilirsiniz. Tek transistörlü sürücü devresi için,

Arduino ile DC Motor Sürme

Uygulama kodlarına geçmeden önce belirtmek istediğim birşey var. LCD kütüphanesini ben kendime göre ayarlamıştım. LCD devresini oluştururken kablolamaları kendi kütüphanenize uygun olarak bağlayın ve yazılımın LCD ile alakalı yerlerini de yine aynı şekilde kendinize göre oluşturun . 






#use fast_io(a) 
#use fast_io(c)
unsigned long int data,k; //data=adc değeri, k pwm değeri olacak
#include <flexy_lcd.c> // kendi LCD kütüphanenizi yazın
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1); // PWM için timer2 kullanılıyor, maksimum değeri 255 olarak ayarladık


set_tris_a(0x01);
set_tris_c(0x00);
setup_ccp1(CCP_PWM); //17 nolu pin, RC2
setup_adc(adc_clock_div_32);
setup_adc_ports(AN0); // AN0 'ı ADC portu olarak ayarladık
lcd_init();
set_adc_channel(0); //ADC kanalını setledik
set_pwm1_duty(k); // PWM'i setledik
delay_us(20);
while(1)
{
data=read_adc(); //Datayı okuyoruz.
k=(data*0.249266862); //0-1023 arası okunan değeri 0-255 arası değere çeviriyoruz
set_pwm1_duty(k); //PWM sinyalini gönderiyoruz.
printf(lcd_putc,"\fADC=%Lu \nPWM=%Lu",data,k); // LCD'ye yazdırıyoruz.
delay_ms(100);
}
}


Projeyi oluşturduğumuz klasörün içerisinde bir de .h uzantılı bir dosyamız var. Onun içinde bir kaç değişiklik yapmamız gerekiyor. 8 olan ADC değerini 10 yapmak gibi.





#include <16F877A.h>
#device ADC=10 //ADC değeri genelde 8 oluyor burda , 10 yapıyoruz

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#FUSES XT

#use delay(clock=4000000) //delay fonksiyonunu kullanmak için OSC frekansını girdik.


Kolay gelsin :)



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;

14 Şubat 2015 Cumartesi

Arduino - DS18B20 One Wire Sıcaklık Sensörü

Daha önceden LM35 sıcaklık sensörü ile bir uygulama gerçekleştirmiştik. LM35 analog çıkış veren bir sensördü. Bu yazımda ise sizlere dijital çıkış veren bir sıcaklık sensörü olan Dallas 18B20 (DS18B20) ile ilgili bilgi vermek istiyorum.


DS18B20 'nin özelliklerinden bahsedecek olursak ;

* ±0.5°C ölçüm hassasiyetine sahip
* Dallas firmasının geliştirdiği One Wire haberleşmesini kullanır
* Ölçüm aralığı -55°C 'den +125°C 'ye kadardır.
* Termometre çözünürlüğü kullanıcının seçimine bağlı olarak 9 bitten 12 bite kadardır.





Daha ayrıntılı bilgiyi datasheet sayfasında bulabilirsiniz.
DS18B20 Datasheet

Bu sensör ile ilgili yazı yazmak istedim çünkü DS18B20 sensörü ki uygulamayı gerçekleştirdiğinizde siz de anlayacaksınız, LM35 sensörüne göre daha kararlı ve daha hassas. Oda sıcaklığı ölçümünden ziyade vücut ateşi vb. hassasiyet gereken ölçümler yapabilirsiniz. Uygulamaya geçmeden önce aşağıdaki linkten "One Wire" kütüphanesini indirip Arduino klasörünün libraries klasörüne yüklüyoruz.

OneWire Kütüphanesi Linki







 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
// Arduinoturkiye.com DS18B20 Dijital Sıcaklık Sensörü Kullanımı
// Tek Sensör Örnek Programı
// Düzenleme: İsmail BUÇGÜN

#include <OneWire.h> // OneWire kütüphanesini ekliyoruz.

// Sıcaklık sensörünü bağladığımız dijital pini 2 olarak belirliyoruz.
int DS18S20_Pin = 2;

// Sıcaklık Sensörü Giriş-Çıkışı
OneWire ds(DS18S20_Pin); // 2. Dijital pinde.

void setup(void) {
Serial.begin(9600); // Seri iletişimi başlatıyoruz.
}

void loop(void) {
// temperature değişkenini sıcaklık değerini alma fonksiyonuna bağlıyoruz.
float temperature = getTemp();
// Sensörden gelen sıcaklık değerini Serial monitörde yazdırıyoruz.
Serial.print("Sicaklik: ");
Serial.println(temperature);
// 1 saniye bekliyoruz. Monitörde saniyede 1 sıcaklık değeri yazmaya devam edecek.
delay(1000);

}

// Aşağıdaki fonksiyon DS18B20 sıcaklık sensörümüzden gelen verileri
// Celcius cinsinden sıcaklık değerlerine çevirmek için kullanılıyor.
// Herhangi bir değişiklik yapmamız gerekmiyor.

float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;

return TemperatureSum;

}
Seri haberleşme monitörünü kullanarak LM35'deki gibi aynı ölçümleri almanız mümkün, hatta belirttiğim gibi daha kararlı olduğunu göreceksiniz.

Kaynak;
http://arduinoturkiye.com/ds18b20-dijital-sicaklik-sensorunun-arduino-ile-kullanimi/