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/

Hiç yorum yok:

Yorum Gönder