DHT11 Sıcaklık ve Nem Sensörü Kullanımı
Kısa cevap DHT11 sensörü nasıl kullanılır?
DHT11'in VCC pini 3,3 – 5 V'a, GND pini toprağa, DATA pini 10 kΩ pull-up direnciyle bir dijital pine bağlanır. Arduino'da DHT kütüphanesi kurulur ve readTemperature() ile sıcaklık, readHumidity() ile nem okunur. Sensör en fazla saniyede bir okunmalıdır; ölçüm aralığı 0 – 50 °C ve %20 – 90 nemdir.
DHT11, tek bir veri hattı üzerinden hem sıcaklık hem nem bilgisi veren, ucuz ve kolay kullanılan bir sensördür; ev otomasyonu, sera ve öğrenci projelerinde çok yaygındır. Bu rehberde DHT11'in özelliklerini ve sınırlarını, Arduino ve ESP32 ile bağlantısını, örnek kodu, sık yapılan hataları ve DHT21 (AM2301), AHT10 ve DS18B20 gibi alternatiflerle karşılaştırmasını anlatıyoruz.
DHT11'in özellikleri
| Özellik | DHT11 | DHT21 (AM2301) |
|---|---|---|
| Sıcaklık aralığı / doğruluk | 0 – 50 °C, ±2 °C | −40 – 80 °C, ±0,5 °C |
| Nem aralığı / doğruluk | %20 – 90 RH, ±%5 | %0 – 100 RH, ±%3 |
| Çözünürlük | 1 °C, %1 | 0,1 °C, %0,1 |
| Okuma aralığı | En az 1 saniye | En az 2 saniye |
| Besleme | 3,3 – 5,5 V | 3,3 – 5,5 V |
DHT11 oda koşullarını izlemek için yeterlidir; hassas ölçüm, eksi sıcaklıklar veya dış ortam için DHT21/22 ya da I²C'li AHT10/SHT serisi tercih edilmelidir. Yalnızca sıcaklık gerekiyorsa su geçirmez kılıflı DS18B20 daha doğrudur.
Bağlantı
Çıplak DHT11'in 4 bacağı vardır: VCC, DATA, boş, GND. Modül versiyonlarında 3 pin bulunur ve DATA hattındaki 10 kΩ pull-up direnci kartın üzerinde hazırdır. Çıplak sensör kullanıyorsanız DATA ile VCC arasına 4,7 – 10 kΩ direnç ekleyin. Kablo 1 – 2 metreyi geçiyorsa pull-up değerini düşürmek (4,7 kΩ) ve sensörün yanına 100 nF kondansatör koymak iletişimi güvenilir kılar.
// Kütüphane: "DHT sensor library" (Adafruit) — Kütüphane Yöneticisi'nden kurun
#include <DHT.h>
#define DHTPIN 2 // DATA pini
#define DHTTYPE DHT11 // DHT21 için: DHT21
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
delay(2000); // DHT11 en fazla saniyede bir okunur
float nem = dht.readHumidity();
float sic = dht.readTemperature(); // °C
if (isnan(nem) || isnan(sic)) {
Serial.println("Okuma hatası: bağlantıyı kontrol edin");
return;
}
Serial.print("Sıcaklık: "); Serial.print(sic); Serial.print(" °C Nem: %");
Serial.println(nem);
}ESP32'de aynı kod çalışır; DATA için herhangi bir GPIO seçilebilir ve sensör 3,3 V ile beslenebilir.
Doğru ölçüm için ipuçları
- Sensörü regülatör, mikrodenetleyici veya LED gibi ısınan parçalardan uzak tutun; kart üzerindeki ısı sıcaklığı birkaç derece yüksek gösterir.
- Kutunun içinde kullanıyorsanız hava delikleri açın; nem sensörü havayla temas etmelidir.
- Doğrudan güneş ışığı ve yoğuşma (su damlası) ölçümü bozar ve sensöre zarar verir.
- Sensörü birkaç dakikada bir okumak çoğu uygulama için yeterlidir; sık okuma sensörü hafifçe ısıtır.
Bu yazıda kullanılan ürünler
Sensör karşılaştırması
| Sensör | Sıcaklık | Nem | Arayüz | Okuma aralığı |
|---|---|---|---|---|
| DHT11 | 0 – 50 °C, ±2 °C | %20 – 90, ±%5 | Tek hat | ≥ 1 s |
| DHT22 / AM2302 | −40 – 80 °C, ±0,5 °C | %0 – 100, ±%2 – 5 | Tek hat | ≥ 2 s |
| AHT10 / AHT20 | −40 – 85 °C, ±0,3 °C | %0 – 100, ±%2 | I²C | hızlı |
| SHT31 | −40 – 125 °C, ±0,2 °C | %0 – 100, ±%2 | I²C | hızlı |
| DS18B20 (yalnız sıcaklık) | −55 – 125 °C, ±0,5 °C | — | 1-Wire | ≈ 750 ms |
Değerler üretici veri sayfalarındaki tipik değerlerdir; gerçek doğruluk kalibrasyon ve ortama bağlıdır.
Çiğlenme noktası hesabı
Nem ve sıcaklıktan çiğlenme noktasını (havanın yoğuşmaya başladığı sıcaklık) Magnus formülüyle hesaplayabilirsiniz: γ = ln(RH/100) + a·T/(b + T), Td = b·γ / (a − γ); a = 17,62, b = 243,12 °C. 25 °C ve %60 nemde çiğlenme noktası 16,7 °C'dir; yüzey sıcaklığı bunun altına düşerse yoğuşma oluşur. Arduino'da şöyle kodlanır:
float ciglenme(float t, float rh) {
const float a = 17.62, b = 243.12;
float g = log(rh / 100.0) + (a * t) / (b + t);
return (b * g) / (a - g);
}Gürültüyü azaltmak: ortalama alma
DHT11'in tam sayı çözünürlüğü olduğundan değerler 1 °C adımlarla zıplar. Birkaç ölçümün ortalamasını almak zıplamayı yumuşatır:
float ortSicaklik(DHT &dht, int n) {
float toplam = 0; int gecerli = 0;
for (int i = 0; i < n; i++) {
float s = dht.readTemperature();
if (!isnan(s)) { toplam += s; gecerli++; }
delay(1100); // DHT11 en az 1 saniye aralık ister
}
return gecerli ? toplam / gecerli : NAN;
}Sorun giderme tablosu
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Sürekli NaN | DATA pini yanlış veya pull-up eksik | Pin numarasını ve 4,7 – 10 kΩ pull-up direncini kontrol edin |
| Bazen NaN | Okuma aralığı çok kısa | Okumalar arasında en az 1 – 2 saniye bekleyin |
| Değerler hep aynı | Sensör ısıtılmıyor veya kütüphane eski | Kütüphaneyi güncelleyin; sensörün hava akışını sağlayın |
| Sıcaklık yüksek çıkıyor | Sensör Arduino veya regülatör yanında | Sensörü ısı kaynaklarından uzak yerleştirin |
| ESP32 ile çalışmıyor | Besleme veya pull-up 3,3 V ile uyumsuz | Sensörü 3,3 V hattına bağlayın; pull-up direncini de 3,3 V hattına çekin |
Sıkça sorulan sorular
DHT11 sürekli "nan" veya okuma hatası veriyor, neden?
En sık nedenler: pull-up direncinin olmaması, yanlış pin tanımı, DHT11/DHT22 türünün kodda yanlış seçilmesi ve sensörün saniyede birden sık okunmasıdır. Uzun kablolarda pull-up değerini düşürün.
DHT11 ile DHT22 arasındaki fark nedir?
DHT22 (AM2302) ve benzeri DHT21, daha geniş ölçüm aralığı ve 0,1'lik çözünürlükle daha doğru ölçer. Aynı kütüphaneyle, yalnızca tür tanımını değiştirerek kullanılabilir.
Birden fazla DHT11'i tek pine bağlayabilir miyim?
Hayır; her DHT sensörü ayrı bir veri pini ister. Tek hatta çok sensör gerekiyorsa adreslenebilir DS18B20 veya I²C sensörler kullanın.
DHT11 kablo uzunluğu ne kadar olabilir?
Tek hatlı protokol uzun kabloda zayıf kalır. Kısa mesafede (1 – 2 m) sorunsuzdur; daha uzun mesafede pull-up değerini düşürmek (4,7 kΩ), bükümlü çift kablo kullanmak veya I²C sensör yerine RS-485 gibi bir hat tercih etmek gerekebilir.
Direnç, kondansatör ve diğer komponentler için ürünlerimize göz atın.
Sensör Modülleri