Lezzetli Robot Tarifleri Sosyal'e Hoş Geldiniz.. Devamı..

Giriş Yap Üye Ol


Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DS18B20 SICAKLIK SENSÖRÜ
#1
Lightbulb 
MERHABA ARKADAŞLAR

Bu konumuzda sizlere DS18B20 adlı dijital sıcaklık sensöründen bahsedeceğim. LM35 adlı sıcaklık sensörü bildiğiniz gibi analog bir sıcaklık sensörü ancak DS18B20 yine aynı işi yapan fakat dijital olarak çalışan bir sensördür. Fazla uzatmadan konuya girelim.

Başlayalım...

DS18B20 NEDİR?
DS18B20 dijital bir sıcaklık sensörüdür. LM35'e göre en önemli üstünlüğü hassasiyetinin yüksek olmasıdır ve analog değil dijital bir sensör olmasıdır. Bu sayede daha kararlı bir sıcaklık ölçümü gerçekleşmektedir. Ancak bu sensörün kütüphanesiz ve datasheet bilgilerinden yola çıkarak kullanılmaya çalışılması uğraş ve emek gerektirmektedir. Sebebi ise kullanılan 1-Wire (OneWire) yani tek hat üzerinden iletişim protokolüdür. I2C protokolüne benzeyen 1-Wire iletişim protokolü hem biraz daha yavaş çalışmaktadır hemde Arduinoda  1-Wire donanımı olmadığından bu iletişim Arduinoda yazılımsal çalışmaktadır. Yazılımsal çalışmasının dezavantajı gönderilen verilerin bazen gecikmesi gecikmeden dolayı bazı bitlerin hatalı yollanabilmesi gibi sorunlarla karşılaşılabilmektedir.

DS18B20 BAĞLANTILARI
DS18B20 3 farklı kılıf yapısında üretilmektedir. Bunlar bizim bildiğimiz transistöre benzeyen TO-92 ve iki adet SMD yapıda biri SOIC diğeri de uSOP kılıfında olanlardır. Birde piyasada kablolu ve çelik problu tipi vardır, içerisinde TO-92 kılıfında DS18B20 bulunur. Aşağıdaki görselde kılıflardaki DS18B20 sensörünü ve bacak isimlerini görebilirsiniz.
za68z7.png

DS18B20 ELEKTRİKSEL BAĞLANTISI
Bu sensörün iki farklı şekilde enerjilendirme yolu bulunmaktadır. Aşağıda bu iki farklı yola göre Arduino ile bağlantısı fritzing şemasında görülmektedir. 
g27NX5.png
Üstteki bağlantıya ParaziteMode bağlantı adı verilir ve sensör enerjisini DQ(DATA) hattından Pull-Up direnci üzerinden alır ve sensörün VDD ve GND bacakları toprağa bağlıdır. Bunun avantajı daha az güç tüketmesidir.

Alttaki bağlantı ise normal bağlantıdır. VDD bacağı +5V bağlıdır, GND bacağı toprağa yani Arduinonun GND'sine bağlıdır. DQ(DATA) bacağı da her iki bağlantıda olduğu gibi 4.7kOhm dirençle +5V'a bağlıdır bu direnç olmadan sensör ile Arduino arasında iletişim gerçekleşemez.

İster ParaziteMode bağlantı ister normal bağlantı olsun sensör aynı kütüphane ile çalışmaktadır ve kodlarda farklılık olmamaktadır. Bazı yabancı ve Türkçe internet kaynaklarında gördüğüm kadarı ile nadir de olsa sensörün sadece ParaziteMode bağlantı ile çalıştırılabildiği yazmaktadır. Sırf bunun nedenini öğrenmek amacı ile iki adet bu sensörden alıp denemeler yaptım. Benim aldığım iki DS18B20 de her iki bağlantı ile çalışabildi. Büyük ihtimalle kullandıkları kütüphanelerden kaynaklı olduğunu düşündüğüm bir durumken acaba yanlış bir bağlantı yaparsam ne olur diye merakımdan sensörün VDD bacağına toprağa ve GND bacağını +5V verdim sonuç olarak bu sensör şuan sadece ParaziteMode bağlantı ile çalışabilir hale geldi.

Sizde sensörünüze zarar gelmesini istemiyorsanız kesinlikle bağlantılarınızı dikkatli yapmanızı öneririm.

DS18B20 KÜTÜPHANE DOSYALARI
Kurmanız gereken iki kütüphane bulunmaktadır. Bu kütüphane dosyalarından en önemlisi OneWire adlı kütüphanedir. Çünkü DS18B20 ikinci kütüphane olmadan da çalışabilmektedir. Fakat OneWire kütüphanesi örneklerinde bulunan DS18B20 örnek kodları o kadar karışık ki ancak datasheet incelediğinizde anlaşılıyor ve projelerinizde böyle bir şekilde kod kullanmanız kodlarınızın karmaşık görünmesine sebebiyet verecektir.
Bundan dolayı DallasTemperature adlı bir kütüphane daha bulunmaktadır ve bunu da kurmanız gerekmektedir.

Kullanılacak fonksiyonlar DallasTemperature kütüphanesine ait olduklarından OneWire kütüphane fonksiyonlarından sizlere bahsetmeyeceğim.

DallasTemperature KÜTÜPHANE FONKSİYONLARI

void Setup() içinde kullanılacak hazırlık fonksiyonları
  • begin();
    bu fonksiyon ile sensörümüzü iletişime hazır hale getirir. 
  • getAddress(okunacakSensorAdresi, 0);
    bu fonksiyon sensöre ait adres bilgisini elde etmeye yarar ve elde ettikten sonra 1 sonucunu geri döndürür. elde edemezse yani sensör bağlı değilse 0 sonucunu geri döndürür. ve sensör hiç bir şekilde okunamaz. 
  • setResolution(okunacakSensorAdresi, cozunurlukDegeri);
    Bu fonksiyon sensörün ne kadar kaç bit çözünürlükte sıcaklığı okuyacağını ayarlamaya yarar. cozunurlukDegeri yerine 9,10,11 veya 12 yazılabilir.Burada sizlere sensörün bir dezavantajından bahsetmem gerekecek.Çözünürlük arttıkça sıcaklık okuma süresi uzamaktadır.Aşağıdaki tabloda hangi çözünürlükte ne kadar bir bekleme gerçekleştiği görülmektedir. Projelerinizi bu sensör ile yaparken bunlara dikkat etmenizi tavsiye ederim.
ErGllZ.png

void loop() içinde kullanılacak fonksiyonları
  • requestTemperatures();
    Bu fonksiyon ile sensöre sıcaklık okumak istediğimze ait komutu yollarız ve sensör sıcaklığı ölçer ve okunması için hazır da bekletir. Her sıcaklık okunmadan önce bu fonksiyon kullanılmalıdır.
  • getTempC(okunacakSensorAdresi);
    Bu fonksiyon ile Santigrat cinsinden sıcaklık bilgisini elde ederiz. Foksniyon sicaklik bilgisini geri döndür.
  • toFahrenheit(sicaklik);
    getTempC(okuncakaSensorAdresi); fonksiyonu ile okunanan sicaklik bilgisini Santigrat cinsinden Fahrenheit cinsine çevirmektedir.

Fonksiyonları burada açıkladık ama kullanmadan öğrenmemiz biraz zor o yüzden hemen bir uygulama yapalım ve bu fonksiyonların aslında nasıl çalıştığını ve kullanıldığını görelim çünkü hepsini kullanmamız gerekiyor Fahrenheit dönüşümü biraz kişisel bir olay yani minimum yukardaki 5 fonksiyonu kullanmalıyız.

ARDUINO VE BİR ADET DS18B20 İLE SICAKLIK ÖLÇÜMÜ UYGULAMASI
Öncelikle OneWire ve DallasTemperature kütüphanelerini kurmalısınız. Kütüphane dosyaları konu sonunda ekte bulunmaktadır indirip kurabilirsiniz.
Aşağıdaki kod aslında DallasTemperature kütüphanesinin örneklerinde bulunan Single örneğinin sadeleştirmiş olduğum örnek koddur.
Devre şeması yukarıdaki fritzing şeması ile aynıdır.
Kod:
#include <OneWire.h> // OneWire kütüphane dosyası çağrıldı
#include <DallasTemperature.h> // DallasTemperature kütüphane dosyası çağrıldı

// kullanılacak arduino dijital pini seçiliyor ne oneWire adlı bir nesne oluşturuluyor
OneWire oneWire(2);
// üst satırdaki oneWire nesne tanımlamasını DallasTempereture
// kütüphanesine bundan sonra kullanacağımız yeni nesne ismi ile aktarıyoruz
// nesne ismi olarak DS18B20 yazıldı siz istediğinizi yazabilirsiniz
DallasTemperature DS18B20(&oneWire);

// bu satırda ise okunacak sensörün adres bilgisi için
// DS18B20adres adında bir nesne daha tanımladık
// siz isterseniz farklı bir isim verebilirsiniz
DeviceAddress DS18B20adres;

// santigrat ve fahrenheit sicaklik bilgileri için değişkenler tanımlanıyor
float santigrat, fahrenheit;

void setup(void)
{
 // seri haberleşme başlatıldı
 Serial.begin(9600);
 
 // DS18B20 iletişime hazır hale getirilir
 DS18B20.begin();

 // burada sensörden sensöre ait adres bilgisi okunup
 // DS18B20adres nesnesine aktarılmaktadır
 // 0 yazan parametre sadece bir adet sensör olduğunu belirtir
 DS18B20.getAddress(DS18B20adres, 0);

 // burada DS18B20adres nesnesine göre bağlı olan sensörün sıcaklık
 // ölçüm çözünürlüğü kaç bir o ayarlandı, burada 12 yazıldığı için
 // 12bit çözünürlükte ayarlanmış oldu.
 // isterseniz 9, 10 veya 11 de yazabilirsiniz.
 DS18B20.setResolution(DS18B20adres, 12);
}

void loop(void)
{
 // sensöre sıcaklık okuma isteği gönderiliyor
 DS18B20.requestTemperatures();

 // sicaklik santigrat cinsinden okunuyor
 santigrat = DS18B20.getTempC(DS18B20adres);

 // sicaklik santigrat cinsinden fahrenhaiet cinsine dönüştürülüyor
 fahrenheit = DS18B20.toFahrenheit(santigrat);

 // sicaklik hem santigrat hemde fahrenheit cinsinden Serial monitöre gönderiliyor
 Serial.print(santigrat);
 Serial.print(" C -- ");
 Serial.print(fahrenheit);
 Serial.println(" F");
}

ARDUINO VE BİRDEN FAZLA DS18B20 İLE SICAKLIK ÖLÇÜMÜ UYGULAMASI
Devre şeması aşağıdaki gibidir. Kodların bu sefer nasıl işlediğini sizlere bırakıyorum çünkü tekli olandan tek farklı başka bir sensör için bir tane daha nesne adresi tanımlamak ve okunacak sensörün bu adres nesnesi ile okutmak tıpkı tekli yani yukarıdaki örnek uygulamadaki gibi.
ErGlBz.png
Kodlar
Kod:
#include <OneWire.h> // OneWire kütüphane dosyası çağrıldı
#include <DallasTemperature.h> // DallasTemperature kütüphane dosyası çağrıldı

// kullanılacak arduino dijital pini seçiliyor ne oneWire adlı bir nesne oluşturuluyor
OneWire oneWire(2);
// üst satırdaki oneWire nesne tanımlamasını DallasTempereture
// kütüphanesine bundan sonra kullanacağımız yeni nesne ismi ile aktarıyoruz
// nesne ismi olarak DS18B20 yazıldı siz istediğinizi yazabilirsiniz
DallasTemperature DS18B20(&oneWire);

// bu satırda ise okunacak sensörün adres bilgisi
// birinci sensör için DS18B20adres0 ikinci sensör için DS18B20adres1
// adında bir nesne daha tanımladık
// siz isterseniz farkl isimler verebilirsiniz
DeviceAddress DS18B20adres0, DS18B20adres1;

// santigrat ve fahrenheit sicaklik bilgileri için değişkenler tanımlanıyor
// 0 ile bitenler birinci sensör için 1 ile bitenler ikinci sensör için
float santigrat0, fahrenheit0, santigrat1, fahrenheit1;

void setup(void)
{
 // seri haberleşme başlatıldı
 Serial.begin(9600);
 
 // DS18B20 iletişime hazır hale getirilir
 DS18B20.begin();

 // burada sensörden sensöre ait adres bilgisi okunup
 // DS18B20adres nesnesine aktarılmaktadır
 // 0 yazan parametre sadece bir adet sensör olduğunu belirtir
 DS18B20.getAddress(DS18B20adres0, 0);
 DS18B20.getAddress(DS18B20adres1, 1);

 // burada DS18B20adres nesnesine göre bağlı olan sensörün sıcaklık
 // ölçüm çözünürlüğü kaç bir o ayarlandı, burada 12 yazıldığı için
 // 12bit çözünürlükte ayarlanmış oldu.
 // isterseniz 9, 10 veya 11 de yazabilirsiniz.
 DS18B20.setResolution(DS18B20adres0, 12);
 DS18B20.setResolution(DS18B20adres1, 12);
}

void loop(void)
{
 // sensöre sıcaklık okuma isteği gönderiliyor
 DS18B20.requestTemperatures();

 // birinci sensörden sicaklik santigrat cinsinden okunuyor
 santigrat0 = DS18B20.getTempC(DS18B20adres1);

 // birinci sensörden alınan sicaklik santigrat cinsinden
 // fahrenhaiet cinsine dönüştürülüyor
 fahrenheit0 = DS18B20.toFahrenheit(santigrat0);
 
 // ikinci sensörden sicaklik santigrat cinsinden okunuyor
 santigrat1 = DS18B20.getTempC(DS18B20adres1);
 
 // ikinci sensörden alınan sicaklik santigrat cinsinden
 // fahrenhaiet cinsine dönüştürülüyor
 fahrenheit1 = DS18B20.toFahrenheit(santigrat1);

 // sicaklik hem santigrat hemde fahrenhaiet cinsinden Serial monitöre gönderiliyor
 Serial.print("SENSOR No 0: ");
 Serial.print(santigrat0);
 Serial.print(" C -- ");
 Serial.print(fahrenheit0);
 Serial.print(" F //// SENSOR No 1: ");
 Serial.print(santigrat1);
 Serial.print(" C -- ");
 Serial.print(fahrenheit1);
 Serial.println(" F");
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EK-1: OneWire Kütüphanesi
https://www.dropbox.com/s/ut7jsahzlwhc3p...r.zip?dl=0
EK-2: DallasTemperatue Kütüphanesi
https://www.dropbox.com/s/byqg7hfmeydw85...e.zip?dl=0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Böylece bir konunun daha sonuna gelmiş bulunmaktayım. Yararlı olması dileklerimle. Eksiklerim ve hatalarım olduğunu görürseniz lütfen yorum atmayı unutmayın böylece eksik taraflarını ekler hatalarım varsa düzeltebilirim.
Ara
Cevapla
#2
Mehmet abi bu bomba gibi süper konuların sebebini açıklar mısın Smile Harika Smile
Maker by : Alperen Alpaydın   
     TEŞEKKÜR İÇİN REP BUTONUNU KULLANINIZ



Cevapla
#3
Sırada bir konu daha var en çok onu paylaşmak istiyorum ama bir türlü tamamlayamıyorum Big Grin
Ara
Cevapla
#4
Çok merak ettim Smile Tahmin ettiğim konu mu acaba ?
Maker by : Alperen Alpaydın   
     TEŞEKKÜR İÇİN REP BUTONUNU KULLANINIZ



Cevapla
#5
öncelikle bu paylaşım, bilgilendirme ve kodlar için teşekür ediyorum. ben bir proje yapmak istiyorum. Projemde uzaktaki bir yerin(40-50 metre) sıcaklığını DS18B20 kullanarak TM1637 display modülüne yazdırmak istiyorum. Yani bu sensörden gelen değeri virgürden önce iki karakter ve virgülden sonra iki karakter halinde TM1637 display modülüne yazdırmak istyorum. Nasıl Tm1637 ye yazdıracağımı bilmiyorum ve sizden kod yardımı istiyorum. Şimdiden teşekürler.
Ara
Cevapla
#6
bak bu linkte http://blog.arduinosensors.nl/2016/11/04...mp-sensor/ dht11 ile tm1637 displayi kullanmislar burdan ornek olarak bakabilirsin 
http://www.techmonkeybusiness.com/tm1637...ketch.html 
http://www.arduinoprojects.net/led-proje...xample.php
İnsan imkansızı başarabilir sözü yetersizdir çünkü insan imkansızın da ötesine ulaşabilir.
                                                                                                                                                          Nikola Tesla
Ara
Cevapla
#7
Merhaba...
Oncelikle bu super paylasim icin cok tesekkur ederim. Sayenizde her gecen gun yeni birseyler ogreniyoruz.
Sormak istedigim bir soru var;
Ds18b20 sensorunu 12 bit cozunurlukte aliyorum ama benim asil istedigim 0.1 cozunurlugunde degerler alabilmek.
24.5 - 24.6 - 24.7 seklinde deger almak istiyorum. Bu mumkunmudur?
Yuvarlama komutlari ile yapilabilecegini ogrendim ancak bu durumda da tam ve gercek sicaklik degerlerine ulasamayacagim. Belki 0.25 cozunurlugunde yuvarlayabilirim ama yine de bir sorayim dedim.
Bu konuda bilgi verebilirseniz cok sevinirim.
Simdiden detsekleriniz icin tesekkur eder, iyi calismalar dilerim.
Saygilarimla.
Ara
Cevapla
#8
Hocam devreyi yaptım sıkıntı yok ancak seri haberleşme ekranında belli süreçlerde -270 gibi saçma bir değer okuyor nasıl çözebilirim, teşekkürler.
Ara
Cevapla
#9
Hocam merhaba.
Paylastiginiz kutuphane ve kodlarla istedigim sekilde sicaklik degerlerini okuyabildim. Super.  Bu nedenle cok tesekkur ederim. 

Ancak bir problemim var. 
Bu kutuphaneyi ve kodlari kullandigimda sicaklik degeri 5-10 sn. de bir - ( eksi ) deger gosteriyor ve sonra tekrar normal degere geliyor. 
Stabil bir okuma saglayamiyorum. 
Eskiden yaptigim gibi asagidaki kodlari kullandigimda ise bu sorun ortadan kalkiyor. Fakat bu seferde 12 bit degerini gosteremiyorum. Ben sicaklik degerini "#.#" seklinde almak istiyorum. 
Acaba neden "-" ( eksi) deger aldigim dair br fikriniz varmidir? 
Tesekkurler, iyi calismalar.
Saygilarimla. 
-------------
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;}----------------- pid='4970' dateline='1486905557'][/quote]
Ara
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Duman sensörü Mtayyip 6 239 15-03-2018, Saat: 01:01
Son Yorum: Ozan Bayramoglu
  Mesafe sensörü tavsiyesi ALTAYLI00 1 180 26-02-2018, Saat: 19:43
Son Yorum: umtc
  Alev-Ateş Sensörü Mtayyip 3 233 15-02-2018, Saat: 03:02
Son Yorum: Online
Lightbulb ACS71X AKIM SENSÖRÜ z1rqdym 11 6,261 03-02-2018, Saat: 00:17
Son Yorum: burak23358
Lightbulb Hareket Sensörü meryun 1 237 23-01-2018, Saat: 01:26
Son Yorum: umtc

Hızlı Menü:


Konuyu Okuyanlar:
1 Ziyaretçi