Skip to Content
SensörlerDS18B20 Sıcaklık Sensörü

DS18B20 Sıcaklık Sensörü

DS18B20, 1-Wire protokolüyle çalışan dijital bir sıcaklık sensörüdür. En büyük avantajı, tek bir veri kablosu üzerinden birden fazla sensörün bağlanabilmesidir. Her sensörün fabrikada yazılmış benzersiz bir 64 bitlik adresi vardır ve Arduino hangi sensörle konuştuğunu bu adresle bilir.

Su geçirmez paslanmaz çelik problu versiyonu; akvaryum, kazan, toprak ve sıvı sıcaklığı ölçümlerinin standart çözümüdür.

Teknik Özellikler

ÖzellikDeğer
Ölçüm aralığı−55 °C – +125 °C
Doğruluk±0,5 °C (−10 – +85 °C aralığında)
Çözünürlük9 – 12 bit (ayarlanabilir)
Besleme gerilimi3,0 – 5,5 V
Protokol1-Wire
Dönüşüm süresi12 bit için ~750 ms

DS18B20 mu, DHT22 mi?

DS18B20DHT22
Sıcaklık doğruluğu±0,5 °C±0,5 °C
Nem ölçer mi
Aralık−55 – +125 °C−40 – +80 °C
Tek hatta çoklu sensör
Su geçirmez versiyon
Okuma hızı~750 ms2 saniye

Sadece sıcaklık ölçecekseniz DS18B20 her açıdan üstündür. Nem de gerekiyorsa DHT22 veya BME280 kullanın.

Bağlantı

Sensörün düz yüzü size bakarken pinler soldan sağa: GND – DATA – VDD.

DS18B20Arduino
GND (siyah kablo)GND
DATA (sarı kablo)D2 (herhangi bir dijital pin)
VDD (kırmızı kablo)5V

DATA ile VDD arasına 4,7 kΩ pull-up direnci bağlanması zorunludur.

Su geçirmez problu tiplerde kablo renkleri değişebilir. Bazı üreticilerde mavi kablo DATA, bazılarında GND olabilir. Enerji vermeden önce üreticinin belgesine bakın; ters bağlanan sensör hızla ısınır.

4,7 kΩ pull-up neden zorunlu?

1-Wire hattı açık kolektör yapıdadır: cihazlar hattı yalnızca aşağı (LOW) çekebilir, yukarı çekemezler. Hattı HIGH seviyeye döndüren şey pull-up direncidir.

Direnç olmadan hat hiçbir zaman HIGH olmaz ve haberleşme kurulamaz. Kütüphane sensörü hiç bulamaz.

Kütüphane Kurulumu

Araçlar → Kütüphaneleri Yönet menüsünden iki kütüphane yükleyin:

KütüphaneGörevi
OneWire (Paul Stoffregen)1-Wire protokolünü uygular
DallasTemperature (Miles Burton)DS18B20’ye özel yüksek seviye fonksiyonlar

Temel Kod

#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_PIN 2 OneWire oneWire(ONE_WIRE_PIN); DallasTemperature sensorler(&oneWire); void setup() { Serial.begin(9600); sensorler.begin(); Serial.print("Bulunan sensor sayisi: "); Serial.println(sensorler.getDeviceCount()); } void loop() { sensorler.requestTemperatures(); // olcum iste float sicaklik = sensorler.getTempCByIndex(0); if (sicaklik == DEVICE_DISCONNECTED_C) { Serial.println("Sensor bulunamadi!"); } else { Serial.print("Sicaklik: "); Serial.print(sicaklik, 2); Serial.println(" C"); } delay(1000); }

requestTemperatures() tüm sensörlere aynı anda “ölçüm yap” komutu gönderir, ardından getTempCByIndex() sonucu okur.

Birden Fazla Sensör — Asıl Güçlü Yanı

DS18B20’nin en değerli özelliği budur: aynı üç kabloya onlarca sensör paralel bağlanabilir. Tek bir 4,7 kΩ pull-up direnci hepsi için yeterlidir.

Sensör adreslerini bulma

Her sensörün 8 baytlık benzersiz bir adresi vardır. Önce bu adresleri öğrenmeniz gerekir:

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(2); DallasTemperature sensorler(&oneWire); void setup() { Serial.begin(9600); sensorler.begin(); int adet = sensorler.getDeviceCount(); Serial.print("Sensor sayisi: "); Serial.println(adet); DeviceAddress adres; for (int i = 0; i < adet; i++) { if (sensorler.getAddress(adres, i)) { Serial.print("Sensor "); Serial.print(i); Serial.print(" adresi: { "); for (uint8_t j = 0; j < 8; j++) { Serial.print("0x"); if (adres[j] < 16) Serial.print("0"); Serial.print(adres[j], HEX); if (j < 7) Serial.print(", "); } Serial.println(" }"); } } } void loop() { }

Çıktıda gördüğünüz adresleri kopyalayıp kodunuza yapıştırın.

Adresle okuma

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(2); DallasTemperature sensorler(&oneWire); DeviceAddress icMekan = { 0x28, 0xFF, 0x64, 0x1E, 0x0C, 0x2A, 0x11, 0x3C }; DeviceAddress disMekan = { 0x28, 0xFF, 0x64, 0x1E, 0x0F, 0x9B, 0x8A, 0x21 }; void setup() { Serial.begin(9600); sensorler.begin(); } void loop() { sensorler.requestTemperatures(); Serial.print("Ic mekan: "); Serial.print(sensorler.getTempC(icMekan), 2); Serial.print(" C Dis mekan: "); Serial.print(sensorler.getTempC(disMekan), 2); Serial.println(" C"); delay(2000); }

Neden getTempCByIndex() yerine adres kullanılmalı? Index sırası garanti değildir. Bir sensörü değiştirdiğinizde veya kabloyu yeniden bağladığınızda sıra değişebilir; “iç mekan” sandığınız sensör dış mekanınki olabilir. Adres ise sensöre kalıcı olarak bağlıdır.

Çözünürlük Ayarı

DS18B20’nin çözünürlüğü ayarlanabilir ve bu doğrudan ölçüm süresini etkiler.

BitÇözünürlükDönüşüm süresi
90,5 °C93,75 ms
100,25 °C187,5 ms
110,125 °C375 ms
120,0625 °C750 ms
sensorler.setResolution(11); // tum sensorler icin sensorler.setResolution(icMekan, 12); // tek sensor icin

Hızlı okuma gerekiyorsa 9 veya 10 bit yeterlidir. Oda sıcaklığı takibinde 12 bit gereksizdir; 0,0625 °C hassasiyet, sensörün ±0,5 °C doğruluğunun çok altındadır.

Bloke Etmeyen Okuma

Varsayılan olarak requestTemperatures() dönüşüm bitene kadar bekler — 12 bitte bu 750 ms demektir. Bu süre boyunca programınız donar.

Çözüm, bekleme modunu kapatıp süreyi kendiniz yönetmektir:

#include <OneWire.h> #include <DallasTemperature.h> OneWire oneWire(2); DallasTemperature sensorler(&oneWire); unsigned long sonIstek = 0; const unsigned long DONUSUM_SURESI = 750; bool olcumBekliyor = false; void setup() { Serial.begin(9600); sensorler.begin(); sensorler.setWaitForConversion(false); // bloke etme } void loop() { if (!olcumBekliyor) { sensorler.requestTemperatures(); sonIstek = millis(); olcumBekliyor = true; } if (olcumBekliyor && (millis() - sonIstek >= DONUSUM_SURESI)) { float sicaklik = sensorler.getTempCByIndex(0); Serial.print("Sicaklik: "); Serial.print(sicaklik, 2); Serial.println(" C"); olcumBekliyor = false; } // program burada baska islere devam edebilir }

Parazit Besleme (Parasite Power)

DS18B20 yalnızca iki kabloyla (DATA ve GND) da çalışabilir. Bu modda sensör, veri hattı HIGH iken içindeki kondansatörü şarj eder ve gücünü buradan alır.

  • VDD pini GND’ye bağlanır.
  • DATA hattındaki pull-up direnci daha güçlü olmalıdır (yaklaşık 2,2 kΩ) veya güçlü pull-up devresi gerekir.

Bu mod kablo tasarrufu sağlar ama kararsızdır: uzun kablolarda ve çok sayıda sensörde okuma hataları başlar. Mümkünse normal (üç kablolu) beslemeyi tercih edin.

Uzun Kablo Kullanımı

DS18B20 ile 10–30 metre kablo kullanmak mümkündür ama şu kurallara uyulmalıdır:

  • CAT5/CAT6 kablo kullanın. DATA ve GND’yi aynı bükümlü çiftte taşıyın.
  • Pull-up direncini düşürün: uzun hatlarda 4,7 kΩ yerine 2,2 kΩ veya 1 kΩ daha kararlıdır.
  • Yıldız (star) topolojisinden kaçının; sensörleri hat üzerinde zincir (daisy chain) şeklinde bağlayın.
  • Hattın sonuna 100 nF kondansatör eklemek gürültüyü azaltır.
  • Sensör sayısı arttıkça hat kapasitesi artar; 10’dan fazla sensörde ayrı bir 1-Wire sürücü entegresi (DS2482) düşünülmelidir.

Sık Karşılaşılan Sorunlar

BelirtiOlası neden
Sensor sayisi: 0Pull-up direnci yok, DATA yanlış pinde, kablo kopuk
-127.00 °C okuyorSensör bağlantısı kesik (DEVICE_DISCONNECTED_C)
85.00 °C okuyorSensör güç aldı ama hiç ölçüm yapmadı — bu fabrika varsayılan değeridir; besleme yetersiz veya requestTemperatures() çağrılmamış
Değerler rastgele zıplıyorUzun/blendajsız kablo, zayıf pull-up, parazit besleme
Sensör ısınıyorTers bağlantı — hemen enerjiyi kesin

85 °C değeri özellikle öğreticidir: sensör açıldığında kaydına 85 yazılır ve ilk başarılı ölçümle güncellenir. 85 görüyorsanız ölçüm hiç tamamlanmamış demektir.

Özet

DS18B20, 1-Wire protokolüyle çalışan hassas bir dijital sıcaklık sensörüdür. Tek veri hattı üzerinden çok sayıda sensör bağlanabilir ve her sensörün benzersiz bir adresi vardır.

Bu derste şunları öğrendik:

  • 4,7 kΩ pull-up direncinin neden zorunlu olduğunu
  • OneWire ve DallasTemperature kütüphanelerini
  • Sensör adreslerini bulmayı ve index yerine adresle okumayı
  • Çözünürlük ile dönüşüm süresi ilişkisini
  • setWaitForConversion(false) ile bloke etmeyen okumayı
  • Parazit beslemenin risklerini
  • -127 ve 85 değerlerinin ne anlama geldiğini