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.

DS18B20 sensörünü kılıf

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.

DS18B20 sensörün iki farklı şekilde enerjilendirme yolu

Ü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.

DallasTemperature çözünürlük değerleri

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.

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.

ARDUINO VE BİRDEN FAZLA DS18B20 İLE SICAKLIK ÖLÇÜMÜ UYGULAMASI devresi

Kodlar

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

EK-1: OneWire Kütüphanesi

https://www.dropbox.com/s/ut7jsahzlwhc3pn/OneWire-master.zip?dl=0

EK-2: DallasTemperatue Kütüphanesi

https://www.dropbox.com/s/byqg7hfmeydw85i/DallasTemperature.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.

Yazar: Z1rqdym