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
| Özellik | Değer |
|---|---|
| Ölçüm aralığı | −55 °C – +125 °C |
| Doğruluk | ±0,5 °C (−10 – +85 °C aralığında) |
| Çözünürlük | 9 – 12 bit (ayarlanabilir) |
| Besleme gerilimi | 3,0 – 5,5 V |
| Protokol | 1-Wire |
| Dönüşüm süresi | 12 bit için ~750 ms |
DS18B20 mu, DHT22 mi?
| DS18B20 | DHT22 | |
|---|---|---|
| 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 ms | 2 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.
| DS18B20 | Arduino |
|---|---|
| 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üphane | Gö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ük | Dönüşüm süresi |
|---|---|---|
| 9 | 0,5 °C | 93,75 ms |
| 10 | 0,25 °C | 187,5 ms |
| 11 | 0,125 °C | 375 ms |
| 12 | 0,0625 °C | 750 ms |
sensorler.setResolution(11); // tum sensorler icin
sensorler.setResolution(icMekan, 12); // tek sensor icinHı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
| Belirti | Olası neden |
|---|---|
Sensor sayisi: 0 | Pull-up direnci yok, DATA yanlış pinde, kablo kopuk |
-127.00 °C okuyor | Sensör bağlantısı kesik (DEVICE_DISCONNECTED_C) |
85.00 °C okuyor | Sensö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ıyor | Uzun/blendajsız kablo, zayıf pull-up, parazit besleme |
| Sensör ısınıyor | Ters 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
-127ve85değerlerinin ne anlama geldiğini