DS18B20 SICAKLIK SENSÖRÜ ÖRNEKLERLE DETAYLI ANLATIM. (PIC VE ARDUINO)

Bu sensör hakkında bir çok yerde bilgiler bulabilirsiniz. Bazı yerlerde one wire kütüphanesi kullanılıyor, bazı yerler de ise sensör komutları bile kütüphane şekline dönüştürülmüş. Yani iyice kolayına kaçılmış. Bu tip kütüphaneleri kullanmak size pek bir şey kazandırmaz. Çünkü sensör değiştiğinde siz de yeni sensör için kütüphane arayışına girersiniz. Bundan dolayı aşağıdaki gibi incelemek, diğer one wire ( tek kablo haberleşme ) sistemi kullanan cihazları anlamanızı sağlayacaktır. Bu Farklı anlatım ile benzer sistemleri kendiniz de çözebileceksiniz. DS18B20 popüler, fakat farklı bir sensör kullanmak isteseniz hemen kütüphane aramaya başlayacaksınız ve ihtiyacınız olan sensörün kütüphanesi yoksa, belki de kullanmaktan vazgeçebileceksiniz.

Bu konuyu anladıktan sonra, benzer sensörleri de DATASHEET dediğimiz teknik detaylarına bakarak kütüphane olmaksızın kullanabileceğinizi düşünüyorum.

DS18B20 PDF DATASHEET
DS18B20 HTML DATASHEET   ( HTML dosyasını google translate ile Türkçeye çevirebilirsiniz. Tam Türkçe olmasa da yine de faydası olacaktır.)

Sensör, 2 farklı bağlantı şekline sahip. Birincisi parasitic power mode ( Bu mod şemada görüldüğü şekilde bağlandığından, başlangıç enerjisini DATA ucundan alır, içerisindeki kondansatörü şarj eder, sonrasında ise aldığı şarjı kullanarak, hem sıcaklık değerlerini gönderir, hem de içerisindeki elektrik kesildiğinde kaybolabilecek değerleri kendi eeprom’una kayıt etmekte kullanır. Bu şekilde bağlantı tekli kullanımda sorun

yaratmasa da çoklu sensör kullanımında sorunlar yaratabileceğinden, Çoklu sistemlerde harici bağlantı kullanılması gerektiği söyleniyor.

ikincisi ise Harici bağlantıdır. Bu bağlantıda ise Vdd ucuna +3V-5V bağlanır.
Her iki sistemde de PULL UP direnci ihmal edilmemelidir. Pull up direnci 1,5ma akımdan daha fazla çekilmeyecek şekilde hesaplanabilir.
Bu sensörler çoklu kullanım olarak kullanılır demiştik. Aşağıdaki devrede olduğu gibi çoklu bağlantı yapılır. DATA ucu ile tek bir haberleşme hattından kontrol edilir.
Peki mikroişlemciler bunları nasıl ayırt edecekler?
Bu tip one wire haberleşme kullanan sistemlerde, ROM CODE denilen bir kod sistemi vardır. Tekli kullanımda rom kodu kullanmak zorunda değilsiniz. Fakat çoklu kullanımda kullanmanız gerekecektir. Mikroişlemci, rom kodu olmazsa  hangi sensörle haberleşeceğini bildiremez. Bağlı cihazlarda kendisinin cevap verip veremeyeceğini bilemez.
ROM kod nasıl öğrenilir. Bu da Datasheet te açıklandığı gibi, belirli bir kodun sensöre gönderilmesiyle mümkündür. Sensör, içerisindeki ROM kodunu size yollar.

Buraya kadar sensör hakkında bilgiler verdik. Burada önemli rol oynayan kısım ONE WIRE olarak bilinen tek kablodan haberleşmedir.
Bu sisteme bir göz atalım.
Tek kablo haberleşmesinde öncelikle MASTER ( Mikroişlemci) hattı resetler. Bu hatta bağlı olan sensörlere haberleşmeye geçileceğini bildirir. Daha sonra, haberleşme başlangıç kodu verilir ve hatta bağlı olan sensör hattı hazır eder. Sonrasında master önceden belirlenmiş kodları bildirerek karşıdan bilgi ister ve dinlemeye geçer.
Bu haberleşmede bit ve byte şeklinde bilgiler gönderilir ve alınır.
Araştırmalarımda Arduino için birden fazla One Wire kütüphanesi olduğunu gördüm. Buna dikkat etmeniz gerekir diye düşünüyorum.
Benim kullandığım kütüphane bu linktedir. Zaten kendi programlarımı da buradaki example dizinindeki programı değiştirerek yaptım.
Orjinal kütüphane yeri burasıdır.  Zaman içerisinde değişmesi mümkün olacağından benim kullandığım programlar için kullanılan versiyonu ise bu linktedir.

Bu sistemde, sadece sıcaklık sensörleri yoktur. Bir çok tek kablo haberleşmesini kullanan sistemler olabilir. Hepsi de benzer haberleşmeyi kullandığından aynı hatta bağlanabilir.

 

 

 

Tek kablo haberleşmesini kullanan ürünlerden bazıları.

Bu sistemlerden tanıdık gelebilecek ibutton denilen ürünlerdir.
Personel giriş çıkış gibi sistemlerde kullanılmaktadır. Daha önce istanbul belediye otobüslerinde kullanıyordu diye biliyorum. Sonradan barkod ve Rfid gibi sistemler geldiğinden belki personel sistemlerinde kullanımı azalmıştır.

Artık sistemin çalışmasına geçebiliriz.
DS18B20 sensörünün sıcaklık için gönderdiği byte 2 tanedir. 16 bit olduğundan Highbyte ve lowbyte olarak 2 byte bilgi gönderecektir. Bu iki byte aşağıdaki dizilimdedir.
Low byte’ın bit0-bit3 arasındakiler, ondalık kısımlardır. Bir altındaki tabloda görüldüğü gibi en küçük parça 0.0625 derecedir. Sistem bunun üzerine kurulu olup 0.0625 in katları olarak devam eder. Bit4-bit10 arası (ki buradaki bit8-bit10 Highbyte kısmındadır. ) sıcaklık değerinin tamsayı kısmını verir. S yazan bit11-bit15 ise işaret bitidir. Bu bitler derece olduğunda 1 değerini alır.
00000111 11111111 değeri +127.93C derece değerine karşılık gelir.
sistem +127 C derecede başlar , 0 a ulaşır ve -55 e kadar gider. Fakat değerlere geldiğinde işaret bitleri (11111) bu değeri aldığından hesaplamada değerin once bit11-bit15 arasını sıfırlamamız gerekecektir. sonrada sayının tümleyenini (complementer) alıp gerçek değeri buluruz.
Arduino programında hesaplama sistemi bu şekildedir. 
PIC işlemci programında ise farklı bir hesaplama kullanılıyor. Buradaki 625 sayısı 0.0625 in katları olmasından dolayı kullanılmıştır.
İlk okunan değer 85C dereceyi gösterir çünkü sensör power on reset yapıldığından buna ayarlanmıştır. Sonrasında ise normal değerler okunacaktır.
Görebileceğimiz bilgiler ds18b20 nin registerlerinde saklanır.
ROM CODE figure 8 dedir. CRC olan doğrulama kodudur 1 byte, daha sonra 6 byte rom code daha sonra ise,1 byte family code denilen ds18b20 yi tanımlayan koddur.
Figure-9 da ise SICAKLIK değerleri için kullanılan registerler görülmektedir. ilk 2 register SICAKLIK değerlerini tutar. 3. ve 4. register ise sıcaklık limitini ayarlayabileceğimiz registerlerdir. Bu registerlere yazdığımız değerler alt ve üst sıcaklık sınırları belirler ve sensör bu sınırlara girdiğinde alarm verir.
Diyeceksiniz ki zaten mikroişlemci bu sınırları biliyor. O sınırlara göre kendisi karar verir. NEDEN bu sınırları kayıt ediyoruz. Tek bir sensör koyarsanız bunu mikroişlemcide halledebilirsiniz. Fakat onlarcasını bağladığınızda her birine göre program yazmanız gerekir. Bundan dolayı her sensöre sıcaklık limitleri kayıt edilirse alarm bitini okumak yetecektir. Bu durum arduino programında gösterilmiştir.

5. register ise configürasyon registeridir. Bunun görevi de aşağıdaki tabloda açıklanmıştır. Bu da kullanıcı tarafından değiştirilebilir.
Config registeri sıcaklık değerinin kullanıcıya bildirilmeden önce ne kadar sürede dönüştürüleceğini belirler. 9-12 bit olarak istediğinizi seçebilirsiniz. Varsayılan olarak 12 bit ayarlanmıştır. Çoklu sistemlerde bu zamana ihtiyaç olacaktır.
Not: register 2,3,4 sıcaklık limitleri ve config registeri, güç kesildiğinde silinir. Bundan dolayı bu değerleri yükledikten sonra sensör içerisindeki eepprom’a kaydedip değişmesini önleyebiliriz.

DS18B20 sensörlerini kullanmadan önce rom kod belirleme ve sıcaklık limitleri yazma programı yapılarak çalıştırılabilir. ROM kodunu öğrenebiliriz aynı zamanda sıcaklık limitlerini eeproma kayıt edebiliriz. Ya da Arduino programında olduğu gibi ilk çalıştırmada bir switch koyup sensörün rom kodunu öğrenerek gerekli değişiklikleri yapabilirsiniz.
Arduino programı 4 adettir.
1. program : MUlti dediğimiz çoklu sensör kullanımı
2. program Rom koduna ihtiyaç olmadan tek sensör kullanma.(skip rom)
3. program (ardu_single_dene)  bir çok özelliği bünyesinde barındıran programdır.
(Sensörün haberleşme olarak kullandığı kodları kullanır.
4. program : SEARCH ROM programıdır.
PIC programı ise  rom kodu olmadan çalışmasını göstermek (single skip rom) için yapıldı. Diğer program ise Multi dediğimiz şekilde tek hattan 2 sensörün kullanımını gösterir.
PICBASIC kullanılarak ve 12F683 Kullanılarak DS18B20 sensörünün kontrol edilmesini gösteriyor.
( Datasheet teki kodları kullanarak PIC kodları geliştirilebilir.)

Sensörle haberleşmek için kullandığımız komutlar.

44h : Sıcaklık kullanıcıya gitmeden önce kendi içerisinde dönüştürme işlemi yapılır. Yukarıdaki bilgilerden hatırlarsanız config registerinde bu dönüştürme işleminin zamanını ayarlayabiliyorduk. Bu şekilde kendi içerisinde hazır olduğunda,
BEh kodu ile ilk 9 registeri okuyoruz. Bu registerlerden ilk 2 tanesini 44h ile dönüştürdüğümüz sıcaklık değerleridir. Bu değerleri alarak, sıcaklık değerini hesaplıyoruz.
4Eh : registerlerden 2. , 3. ve 4. registeri kendimiz değiştirebiliyorduk. Bu kod ile değiştireceğimiz değerleri gönderiyoruz.
48h : Bu kod ile gönderdiğimiz datalar, güç kesildiğinde silinmesin diye sensörün EEPROM’una kayıt ediyoruz.
B8h : Bu kod ile EEPROM’a kayıt ettiğimiz değerleri, tekrar kullanacağımız silinebilir hafızaya alıyoruz.
B4h : Güç durumunu mikroişlemciye bildirmesini sağlıyoruz. 1 bit ile bunu bildirir.
( programda yer alıyor fakat çalışıp çalışmadığını gerçek devrede kontrol edemedim. yeterli akım gelmediğinde 0 olarak dönüyor. Sanırım bu daha çok parasitic mode da ihtiyaç duyuluyor.)
33h : Bu değer ise 8 byte lık Rom code okunması için verilen komuttur. Ben bir anahtar koyup bu anahtara enerji vermeden bastığımda bu kodun okunması için alt program ekledim.
ECh : Bu kod ise ALARM durumu bitini okumamızı sağlıyor. Ben programda byte olarak okuduğum için byte değerini ekrana yazdım. İsterseniz sizler bit değerini de okuyabilirsiniz.
CCh : Skip ROM bu kod ile rom kodu olmadan tek sensörü kontrol edebilirsiniz.
55h :  MATCH ROM. Bu komutla master cihaz rom kodunu slave cihazlara yollar ve hangisi uyuşmuşsa o devreye girer diğerleri susar ve reset palsinin gelmesini bekler.
F0h : Search ROM. Bu hattaki bütün sensörleri belirlemek için bir algoritma kullanır ve Rom kodlarını öğrenerek master tarafından komut yollanabilmesini sağlar. Sistem açıldığında hattı kontrol eder. Fakat bu işlem sensör ne kadar çok ise o kadar uzun sürer. Yine de aşağıdaki yazıda belirtildiği gibi saniyede 75 farklı sensörü belirleyebiliyormuş. Örnek programlarda bunu daha iyi anlayabileceksiniz. 

SEARCH ROM ALGORİTMASI Türkçe açıklaması.

Not: Bunun yerine sensör sayısı az ise kendiniz rom kodlarını öğrenip sıcaklık limitlerini eeprom’a kayıt ederek kolaylıkla kullanabilirsiniz. Fakat hatta çok fazla sensör ya da one wire kullanan cihaz varsa bu komutu kullanmanız fayda sağlayacaktır. Çünkü bunu yaparken rom kodun içerisindeki family kod kısmına bakarak hangi cihazların hatta bulunduğunu da kontrol edebilirsiniz. 

Şemalar: 

 

 

 

 

TÜM PROGRAMLARA BURADAN ULAŞABİLİRSİNİZ.

DS18B20 sensörünün detaylı anlatım video :

 

DS18B20 Sensörünün Arduino ile çoklu kullanımını anlatan video :

8 Comments

  1. ya hocam ben bir türlü ds18b20 sensörünü ccs c compilerde derleyemiyorum sensörü görmüyor hata gösteriyor driver kısmına ekleme attım ama yine görmüyor hazır eklenti dosyası varsa paylaşabilirmisiniz size zahmet

  2. hocam merhaba 18b20 preteusta calıştıramıyorum kullandığınız kütüphaneyi paylaşırmısınız

  3. 18b20 proteus 7.10 dan beri var. fakat bu komponenti kullanmadan önce videoda göreceğin gibi bir kimlik bulunuyor. ROM serial number. bu numaraya göre bilgileri alabilirsin. ben örnek programda değiştirmiş olabilirim kontrol edebilirsin ya da search rom için bir program hazırlamıştım yine videoda çalışması var diye hatırlıyorum bununla kullandığın rom kodunu alabilirsin. kütüphane ise bu yazıda belirtilmiş. benim kullandığım kütüphane linki bu.
    https://drive.google.com/open?id=1gH8sHBfoIAGHjGsaf5sIvfry2aXDk72E
    ayrıca orjinal kütüphane yerinin adresi de yazıda mevcut.
    kolay gelsin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.