STM32F103 ve DS18B20 SICAKLIK SENSÖRÜ

DS18B20 gömülü sistemler ile kullanılan en popüler sıcaklık sensörlerinden birisi. BU sadece sıcaklık ölçüyor, aynı zamanda nem de ölçebilen DHT11 ve DHT22 ile bunların üzerine bir de basınç ölçen BM280 diğer seçenekleri oluşturuyor.

Bu yayında DS18B20 bin STM32F103 ile kullanılışını anlatacağım. İnternette bu konuda istemediğiniz kadar örnek uygulama var, başvurulacak kaynak seçenekleri bol. Benim vereceğim bilgiler ve kodlar da eşi benzeri görülmemiş şeyler değil.

DS18B20 sensörünü 0.5 ila 1.75 USD fiyatlarla internetten bulup sipariş etmek mümkün. Ben üç farklı kılıkta bulup aldım ve kullandım.

Bunlardan birincisi tek başına sensörün kendisi. Bunu alırsanız eliniz havya alıp birkaç lehim yapmanız, bunu istediğiniz yere yerleştirip sabitlemeniz için biraz çaba harcamanız gerekecek.







Bir diğer seçenek minik bir plaket üzerine monte edilmiş olarak almak. Bu durumda lehimleme ve lehimleyeceğiniz bir plaket bulmak gibi sorunlardan kurtuluyorsunuz. Data hattı üzerindeki pull up direnci de hazır durumda geliyor.




Bu yayını hazırlarken kullandığım sensör ise su geçirmez bir kılıf ve kuyruk kablosu olan tipte.




Bunun bağlantılarını yaparken soldaki renk kodlarını dikkate almak gerekiyor. Zaten + ve – besleme uçları dışında tek bir sinyal kablosu var. Hatta “parazit besleme”modu denilen modda kullanılırsa “+” beslemeye de gerek kalmıyor, beslemesini sinyal hattından çalarak alıyor. Biz buradaki uygulamamızda normal besleme modunda çalıştıracağız.

1 WIRE – TEK TEL PROTOKOLU

DS18B20 tek bir sinyal teli üzerinden “1 wire” olarak adlandırılan protokol ile veri alış verişi yapıyor. Kullanılan protokol basit ama zamanlama açısından iyi tanımlanmış bir yolu sızlamak gerekiyor. Aşağıdaki iki diyagramda belirtilen sinyalleşme sürelerine dikkatle uyulduğunda sorun çıkmadan çalışılabiliyor. Diyagramlar Maxim data sheet’inden.

Protokolu burada daha ayrıntılı açıklamayı bu aşamada geçiyorum, çünkü vereceğim kodlarda yeterince açıklama yazdığımı düşünüyorum.

TEK SENSÖR VE ÇOKLU SENSÖR KULLANIMI

Birden fazla DS18B20 paralel bağlanarak her birinden ayrı ayrı sıcaklık olması yapmak mümkün. Bunun için her bir DS18B20 nin içindeki ROM’a üretim sırasında kaydedilmiş bir kimlik kodundan yararlanılıyor. Master durumdaki mikrodenetleyicimiz istediği 18B20 yi aktifleştirerek okuma yapabiliyor. Ya da bu seçeceği kullanmayıp, adresleme yapmadan doğrudan tek bir sensör ile haberleşebiliyor.

Bu yayında tek sensörlü çalışmayı ele alacağım. Bu durumda sinyalleşmenin başında “0xCC” yani “skip ROM” komutu göndererek adresleme adımını devre dışı bıraktığımızı bildiriyoruz.

Bu yayını elim değip de güncellediğimde çoklu sensör kullanımını da ekleyeceğim.

KODLAR

ALT PROGRAMLAR

GECİKME FONKSİYONU – delay()

Yukarıdaki zaman çizelgelerinden de görüleceği gibi sinyalleşme süreci içinde 1µs den 480µs ye kadar değişen bekleme aralıklarımız var. Bunun için 1 µs atımlı bir gecikme fonksiyonu oluşturacağız. Bu amaçla TIMER4 zamanlayıcısını, sayacı her 1 µs de bir artacak şekilde ayarlıyoruz. Sistem saat ve Timer ayarları aşağıdaki gibi :

TIM4 APB1 üzerinde çalışıyor, bu ayarlarla 52 MHz ile sürülecek demektir.

Bize 1 µs de bir atan bir sayaç gerektiğine göre 52 MHz saatini 52 ye bölen bir prescalere ihtiyacımız var. Böylece sayacımız 1 MHz de çalışarak istediğimiz gecikmeyi verecektir.

Her zaman olduğu gibi prescaler değerini cube IDE yapılandırıcısına hedeflediğimiz değerin 1 eksiği olarak, yani 51 olarak veriyoruz. Yapılandırıcı bu 1 arttırarak değerlendirmeye alacaktır.

Aşağıda TIM4 ü kullanarak 1 µs lik adımlarla sayan gecikme fonksiyonumuzu görüyorsunuz. Burada 18B20 sensör alt fonksiyonlarını içeren DHT11_DHT22_18B20.c dosyasının başlık kısmını da görebiliyorsunuz.

18B20 SENSÖR ALT FONKSİYONLARI

Üç adet temel fonksiyonumuz var. Bunların üçü de DHT11_DHT22_18B20.c adlı dosya içinde yer alıyor. Bu fonksiyonların çalışması içlerine yazdığım açıklamalara ve yukarıda verdiğim zaman diyagramları ile birlikte değerlendirilerek anlaşılabilir.

Start Fonksiyonu :

Read Fonksiyonu :

Write fonksiyonu :

ANA PROGRAM

Main.c dosyasının başında kullanacağımız değişkenleri bildiriyoruz. Buradaki nem ile ilgili Rh.. şeklindekileri gözardı ediniz, onları DHT sensörlerle kullanıyoruz.

Bu uygulamada tek bir 18B20 sensörümüz olmakla birlikte, 8 adede kadar sensörle çalışma ihtimaline karşılık, bunların bağlanacağı port ve pinleri içeren iki adet dizi tanımlıyoruz.

Şimdilik sadece 1 sensörümüz var, dizilerimize onun port ve pinlerini yükleyelim. Sensörümüz yukarılardaki konfigüratör ayarlarında görüldüğü gibi PA1 e bağlı.

1 µs lik sayacımızı çalıştırabilmek için TIM4 ü de başlatıyoruz.

Ana fonksiyonumuz aşağıdaki gibi. 18B20 ye bir start komutu ile başlayıp ardından her seferinde ROM daki adresin kullanılmayacağını belirten 0xCC komutları gönderiyor.

Sonunda iki byte sıcaklık bilgisini okuyarak Temperature değişkenine yerleştiriyor.

“Temperature” değerini aşağıdaki fonksiyon ile UART1 üzerinden dışarıya gönderiyoruz.

PROJE KURULUMU

STm32F103C8 tabanlı “Pico” modülü kullanıyorum. Bunun takıldığı adaptör kartı sayesinde TFT ekrana SPI1 üzerinden erişim sağlanıyor. DS18B20 sensörün +5V, 0V ve Sinyal (PA1) tellerini de görebiliyorsunuz.

SONUÇ

DS18B20 için verdiğim bu örnek pakette aslında DHT11 ve DHT22 ye ait alt programlar da var, onlarla nem de ölçülebiliyor. 18B20 ile gayet stabil sonuçlar alabiliyorum. Erimekte olan buzlu suya sokarak ve kaynayan su ile kontrol ettim; buzlu suda +0.2, kaynayan suda da 95C veriyor. Küçük bir kalibrasyon ile tam sonuç almak mümkün görünüyor.

Bu yayının sonu – Selçuk Özbayraktar Ekim 2020