Rehberler · 14 dk okuma

Arduino Sıcaklık Sensörü Çeşitleri: 8 Sensör Karşılaştırması

Arduino sıcaklık sensörü çeşitleri: DHT11, DHT22, DS18B20, LM35, NTC, BME280, MAX6675 ve MLX90614 karşılaştırması; doğruluk, aralık, kablo, fiyat tablosu.

Arduino sıcaklık sensörü çeşitleri arasında doğru seçimi yapmak, ilk bakışta sanıldığından çok daha önemlidir: aynı odada duran bir DHT11 ile bir DS18B20 arasında 2 °C fark görmek de, 300 °C'lik bir fırını yanlış sensörle ölçmeye çalışıp sensörü eritmek de mümkündür. Hobi elektroniğinde en çok kullanılan sekiz sıcaklık sensörü vardır: DHT11, DHT22, DS18B20, LM35, NTC termistör, BME280, MAX6675 (K tipi termokupl) ve MLX90614 (temassız kızılötesi). Her biri farklı bir ölçüm aralığı, doğruluk, bağlantı şekli ve fiyatla gelir. Hangisinin doğru olduğu ise ne ölçeceğine bağlıdır: oda havası mı, su mu, fırın mı, yoksa dokunamadığın, dönen bir motor mu?

Bu rehberde sekiz sensörü iki büyük tabloda yan yana koyuyoruz: ölçüm aralığı, doğruluk, çözünürlük, okuma hızı, arayüz, besleme gerilimi, kablo uzunluğu ve göreceli fiyat. Ardından her birinin nasıl çalıştığını, güçlü ve zayıf yanlarını, Arduino Uno, ESP32 ve Raspberry Pi Pico bağlantılarını, NTC, MAX6675 ve MLX90614 için örnek kodları, üç sensörü aynı anda yarıştıran bir test düzeneğini ve hangi projede hangisini seçmen gerektiğini bulacaksın. Sensörlerin çoğu için ayrıntılı kullanım yazılarımız da var; bağlantılarını ilgili bölümlere ekledik.

DHT11 sıcaklık ve nem sensörü modülü
DHT11 sıcaklık ve nem sensörü modülü
DHT22 (AM2302) sıcaklık ve nem sensörü modülü
DHT22 (AM2302) sıcaklık ve nem sensörü modülü
Su geçirmez DS18B20 sıcaklık probu
Su geçirmez DS18B20 sıcaklık probu
BME280 sıcaklık, nem ve basınç sensörü modülü
BME280 sıcaklık, nem ve basınç sensörü modülü
NTC termistör
NTC termistör

Sıcaklık sensörü seçerken neye bakmalısın?

Sensörleri karşılaştırmadan önce veri sayfalarındaki terimleri doğru okumak gerekir. En sık karıştırılan ikili doğruluk ile çözünürlüktür. Doğruluk, okuduğun değerin gerçek sıcaklığa ne kadar yakın olduğunu söyler; çözünürlük ise sensörün ayırt edebildiği en küçük adımdır. BME280 sıcaklığı 0,01 °C'lik adımlarla verir ama doğruluğu ±1 °C civarındadır; yani ekranda gördüğün 23,47 °C'nin son iki hanesi küçük değişimleri izlemek için işe yarar, gerçek sıcaklığı o hassasiyette söylemez. Seçim yaparken şu yedi ölçüte bak:

  • Ölçüm aralığı: Sensör ölçmek istediğin en düşük ve en yüksek sıcaklığı rahatça kapsamalı. DHT11 sıfırın altını göremez; buzdolabı için DS18B20, fırın için termokupl gerekir.
  • Doğruluk: Oda termometresi için ±2 °C kabul edilebilir, akvaryum ya da kuluçka makinesi için ise ±0,5 °C gerekir.
  • Arayüz: Analog sensörler bir ADC pini, dijital sensörler bir ya da birkaç dijital pin ve çoğu zaman bir kütüphane ister. Kartında kaç pinin boşta olduğu, kaç sensör bağlayabileceğini belirler.
  • Kablo uzunluğu: Sensör karttan 5 metre uzakta, bahçede ya da su deposunun dibinde olacaksa analog ve I2C sensörler zorlanır; 1-Wire ve DHT'nin tek hatlı protokolü uzun mesafeye çok daha iyi dayanır.
  • Tepki süresi: Çelik kılıflı bir prob ya da plastik gövdeli bir DHT, ani bir sıcaklık değişimini ancak saniyeler, hatta dakikalar içinde yakalar; çıplak, küçük bir NTC ise çok daha hızlıdır.
  • Ek ölçümler: Nem de lazımsa DHT22 ya da BME280, basınç ve irtifa da lazımsa BME280 tek modülde işini görür.
  • Besleme gerilimi: 3,3 V ile çalışan ESP32 ve Pico'da, LM35 gibi en az 4 V isteyen sensörlere ve ADC girişine 3,3 V'tan yüksek gerilim gelmemesine dikkat etmelisin.

8 sıcaklık sensörü karşılaştırma tablosu

İlk tablo ölçüm performansını, ikincisi bağlantı ve maliyet tarafını özetler. Değerler veri sayfalarından alınmıştır; doğruluk, aksi belirtilmedikçe oda sıcaklığı civarı içindir ve aralığın uçlarına doğru büyür.

SensörÖlçüm aralığıDoğrulukÇözünürlükOkuma hızı
DHT110 … +50 °C±2 °C1 °CSaniyede 1
DHT22 (AM2302)−40 … +80 °C±0,5 °C0,1 °C2 saniyede 1
DS18B20−55 … +125 °C±0,5 °C (−10 … +85 °C arası)0,0625 °C (12 bit)750 ms (12 bit), 94 ms (9 bit)
LM35DZ0 … +100 °C (LM35: −55 … +150 °C)Tipik ±0,6 °C, garanti ±1,5 °CUno'da 0,49 °C (5 V ref.), 0,11 °C (1,1 V ref.)Anlık (ADC hızında)
NTC 10 kΩ, B 3950−40 … +125 °C (cam kılıflılar ≈ 300 °C)25 °C'de ±0,25 °C (%1'lik) … ±1 °C (%5'lik)Uno'da oda sıcaklığında ≈ 0,1 °CAnlık (ADC hızında)
BME280−40 … +85 °C±0,5 °C (25 °C), ±1 °C (0 … 65 °C)0,01 °CSaniyede onlarca
MAX6675 + K tipi termokupl0 … +1023,75 °CBirkaç °C (dönüştürücü ≈ ±2 °C, soğuk uç ±3 °C'ye kadar)0,25 °CSaniyede ≈ 4 (0,22 s dönüşüm)
MLX90614Nesne −70 … +380 °C, ortam −40 … +125 °C±0,5 °C (oda sıcaklığı civarı)0,02 °CSaniyede birkaç kez
SensörArayüzBeslemeKablo uzunluğuEk ölçümGöreceli fiyat
DHT11Tek hatlı dijital, 1 pin3–5,5 V20 m'ye kadarNemÇok düşük
DHT22Tek hatlı dijital, 1 pin3,3–6 V20 m'ye kadarNemOrta
DS18B201-Wire, 1 pinde çok sensör3,0–5,5 VOnlarca metreYokDüşük
LM35Analog, 1 ADC pini4–30 VKısa, ≈ 1 m (uzunda önlem gerekir)YokDüşük
NTCAnalog, bölücüyle 1 ADC piniBölücüden 3,3 ya da 5 VBirkaç metreYokEn düşük
BME280I2C (2 pin) ya da SPIYonga 1,71–3,6 V; regülatörlü modül 5 VKısa, 50 cm altıNem ve basınçOrta
MAX6675SPI, 3 pin (yalnız okuma)3,0–5,5 VTermokupl teli metrelerce uzatılabilirYokOrta
MLX90614I2C (SMBus), 2 pin3 V ya da 5 V sürümü (modülde regülatör olabilir)Kısa (I2C); ölçüm temassızOrtam sıcaklığıYüksek
Kabaca fiyat sıralaması şöyledir: en ucuzu NTC, ardından DHT11, LM35 ve DS18B20 gelir; DHT22 ve BME280 orta sınıftadır, MAX6675 modülü termokupl probuyla birlikte biraz daha pahalıdır, MLX90614 ise listenin en pahalısıdır. Ucuz sensörlerin kopyaları çok yaygındır; özellikle DS18B20, LM35 ve BME280'de kopya parçalar veri sayfasındaki doğruluğu tutturamayabilir. İki sensörü aynı yerde bekletip okumalarını karşılaştırmak, sensörünün güvenilir olup olmadığını anlamanın en basit yoludur.

DHT11 ve DHT22: sıcaklık ve nemi birlikte ölçenler

DHT sensörlerinin plastik kafesinin içinde bir nem algılayıcı (DHT11'de dirençli, DHT22'de kapasitif), bir termistör ve ölçümleri dijitale çeviren küçük bir denetleyici bulunur. Sensör sonucu tek bir veri hattından 40 bitlik bir paket olarak gönderir: 16 bit nem, 16 bit sıcaklık ve 8 bit sağlama toplamı. Bu protokol 1-Wire değildir, üreticinin kendine özgü tek hatlı protokolüdür; bu yüzden her DHT ayrı bir pin ister. DHT11 ucuzdur ve oda sıcaklığı için yeterlidir, ama 0–50 °C aralığı ve ±2 °C hatası onu dış mekân ve hassas işler için zayıf bırakır. DHT22 (AM2302) aynı bağlantıyla −40 ile +80 °C arasını ±0,5 °C doğrulukla ölçer ve nemi %0–100 aralığında verir; karşılığında iki saniyede yalnızca bir ölçüm yapabilir. İkisinin de ortak zayıflığı yavaşlıktır: kafesin içindeki hava ortamla dengeye gelene kadar değişimi geç gösterirler. Bağlantı, kütüphane kurulumu ve kodlar için DHT11 Sıcaklık ve Nem Sensörü yazısına bak; aynı kod DHT22 için tek kelime değiştirilerek çalışır.

Çıplak, 4 bacaklı bir DHT kullanıyorsan veri hattı ile VCC arasına 10 kΩ pull-up direnci takmalısın; 3 pinli modüllerde bu direnç kartın üzerindedir. DHT'leri iki saniyeden sık okumak yeni bir ölçüm getirmez: kütüphane ya eski değeri döndürür ya da nan verir.

DS18B20: su geçirmez, dayanıklı ve tek pine çok sensör

Su geçirmez DS18B20 sıcaklık probu
Su geçirmez DS18B20 probu: paslanmaz çelik kılıfın içinde dijital sensör ve üç telli kablo (kırmızı VDD, siyah GND, sarı veri).

DS18B20, sıcaklığı yonganın içinde ölçüp 9–12 bit arası seçilebilir çözünürlükte dijital bir sayı olarak gönderen bir sensördür. −55 ile +125 °C arasını ölçer, −10 ile +85 °C arasında ±0,5 °C doğruluk sunar ve 1-Wire protokolü sayesinde tek bir veri pinine onlarca sensör bağlanabilir; her birinin fabrikada yazılmış 64 bitlik benzersiz bir adresi vardır. Paslanmaz çelik kılıflı su geçirmez prob sürümü akvaryum, su deposu, kombi tesisatı, toprak ve dondurucu ölçümlerinde rakipsizdir. Tek gereksinimi, veri hattı ile besleme arasına takılan 4,7 kΩ'luk pull-up direncidir; bu direnç yoksa kütüphane −127 °C döndürür. 12 bit modunda bir ölçüm 750 ms sürdüğü için hızlı değişen bir sıcaklığı izlerken çözünürlüğü düşürmek gerekebilir. Çoklu sensör kodu ve ESP32'de programı bekletmeden okuma yöntemi DS18B20 Sıcaklık Sensörü yazısında.

LM35: kütüphanesiz, en basit analog sensör

LM35 sıcaklığı doğrudan gerilime çevirir: çıkışı her derece için 10 mV artar, 25 °C'de 250 mV verir. Kütüphane gerekmez; sıcaklık = analogRead × 5,0 / 1024 × 100 formülüyle sonucu bulursun. Bu basitlik onu ADC'yi öğrenmek için mükemmel bir başlangıç yapar. Zayıf yanları da buradan gelir: Arduino Uno'nun 10 bitlik ADC'si 5 V referansla yalnızca yaklaşık 0,49 °C'lik adımlar verir, USB'den gelen 5 V'taki her sapma doğrudan sıcaklığa yansır ve kablo uzadıkça çıkış parazit toplar. Piyasadaki LM35'lerin çoğu LM35DZ'dir ve yalnızca 0–100 °C için garanti edilir. Ayrıca en az 4 V besleme istediği için ESP32 ve Pico'da 5 V pininden beslenmelidir. 3,3 V'luk kartlarda daha pratik bir analog seçenek TMP36'dır: 2,7–5,5 V ile çalışır, −40 ile +125 °C arasını ölçer ve çıkışı yine 10 mV/°C'dir; ancak 0 °C'de 500 mV verdiği için formül sıcaklık = (V − 0,5) × 100 olur. Tipik doğruluğu 25 °C'de ±1 °C, tüm aralıkta ±2 °C'dir. 1,1 V dahili referansla adımı 0,11 °C'ye indirmeyi LM35 Sıcaklık Sensörü yazısında adım adım anlattık; ADC'nin mantığını ise analog-dijital dönüşüm yazısında bulabilirsin.

LM35 ile DS18B20 aynı siyah TO-92 kılıfta gelir ve neredeyse aynı görünür, ama besleme bacakları terstir. Yanlış sırayla bağlanan sensör birkaç saniyede elle tutulamayacak kadar ısınır. İlk açılışta sensöre parmağınla dokun; ısınıyorsa gücü hemen kes ve üzerindeki yazıyı oku.

NTC termistör: en ucuz ve en hızlı sensör

NTC (Negative Temperature Coefficient) termistör, sıcaklık arttıkça direnci azalan bir dirençtir. Hobi projelerinde en yaygın olanı 25 °C'de 10 kΩ olan ve B katsayısı 3950 K olan modeldir. Arduino direnci doğrudan ölçemediği için NTC, sabit bir dirençle birlikte bir gerilim bölücü kurularak bağlanır ve orta noktadaki gerilim analog pinden okunur. Bu devrenin güzel bir yanı vardır: bölücü, ADC'nin referansıyla aynı 5 V'tan beslendiğinde ölçüm oranlıdır; besleme gerilimi 4,8 ya da 5,1 V olsa bile sonuç değişmez. Bölücüdeki gerilimleri gerilim bölücü aracıyla kolayca hesaplayabilirsin.

NTC'nin direnci sıcaklıkla doğrusal değil, üstel olarak değişir; bu yüzden LM35'teki gibi tek bir çarpanla sonuç bulunmaz. Pratikte Beta denklemi kullanılır: 1/T = 1/T0 + (1/B) × ln(R/R0). Burada T Kelvin cinsinden sıcaklık, T0 = 298,15 K (25 °C), R0 = 10 kΩ ve B = 3950'dir. Oda sıcaklığında duyarlılık çok yüksektir: B/T² formülüne göre her derecede direnç yaklaşık %4,4 değişir. Bu yüzden %1 toleranslı bir NTC 25 °C'de yalnızca ±0,25 °C civarında hata yapar; aralığın uçlarına doğru ise B katsayısının toleransı da devreye girer ve hata büyür. Geniş aralıkta daha doğru sonuç için üç noktalı Steinhart-Hart denklemi kullanılır; ayrıntılar NTC termistör yazısında.

C++ (Arduino IDE)
1const int NTC_PIN = A1;          // bölücünün orta noktası / divider midpoint
2const float R_FIXED = 10000.0;   // 5V ile A1 arasındaki direnç / resistor between 5V and A1
3const float R0 = 10000.0;        // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float BETA = 3950.0;       // B katsayısı (veri sayfası) / B coefficient (datasheet)
5const float T0 = 298.15;         // 25 °C Kelvin cinsinden / 25 °C in kelvin
6const int SAMPLES = 16;          // ortalama için ölçüm sayısı / samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;
19
20  if (adc < 1.0 || adc > 1022.0) {                    // kopuk ya da kısa devre / open or shorted
21    Serial.println(F("NTC baglantisini kontrol et / Check the NTC wiring"));
22    delay(1000);
23    return;
24  }
25
26  float r = R_FIXED * adc / (1023.0 - adc);           // NTC direnci (ohm) / NTC resistance (ohm)
27  float invT = 1.0 / T0 + log(r / R0) / BETA;         // Beta denklemi / Beta equation
28  float tempC = 1.0 / invT - 273.15;                  // Kelvin -> °C
29
30  Serial.print(F("R: "));
31  Serial.print(r, 0);
32  Serial.print(F(" ohm  Sicaklik / Temp: "));
33  Serial.print(tempC, 1);
34  Serial.println(F(" C"));
35  delay(1000);
36}

Bu devrede 10 kΩ'luk sabit direnç 5V ile A1 arasında, NTC ise A1 ile GND arasında durur. Sıcaklık arttıkça NTC'nin direnci, dolayısıyla A1'deki gerilim düşer. Kod ham değerden önce NTC'nin direncini, sonra Beta denklemiyle Kelvin cinsinden sıcaklığı bulur ve santigrata çevirir; 16 ölçümün ortalaması ADC gürültüsünü dörtte birine indirir. Oda sıcaklığında Uno'nun bir ADC adımı yaklaşık 0,09 °C'ye karşılık gelir, yani çözünürlük LM35'in 5 V referanslı okumasından beş kat iyidir. Hazır NTC modüllerinde (örneğin KY-013) sabit direncin hangi tarafta olduğu karttan karta değişir; sıcak bir nesneye dokundurduğunda okunan sıcaklık düşüyorsa direnç formülünü ters çevir: r = R_FIXED × (1023 − adc) / adc.

BME280: sıcaklık, nem ve basınç tek modülde

Bosch'un BME280'i, yalnızca 2,5 × 2,5 mm'lik bir yongada sıcaklık, bağıl nem ve hava basıncını ölçer; I2C (0x76 ya da 0x77 adresi) ya da SPI ile haberleşir. Sıcaklıkta 0,01 °C çözünürlük, 25 °C'de ±0,5 °C ve 0–65 °C arasında ±1 °C doğruluk sunar, saniyede onlarca ölçüm yapabilir ve uykuda 1 µA'in çok altında akım çeker. Bu özellikleriyle pille çalışan hava istasyonları için idealdir. Yonganın kendisi 3,6 V'un üstünü kaldırmaz: 6 pinli mor modüller çoğunlukla yalnızca 3,3 V içindir, 4 pinli regülatörlü modüller ise 5 V'a bağlanabilir. Sürekli ölçüm yaptığında yonga biraz ısınır ve sıcaklığı birkaç onda bir derece yüksek gösterebilir; hava ölçümü için zorlamalı (forced) modda, dakikada birkaç ölçüm yeterlidir. I2C hattının nasıl çalıştığını I2C nedir yazısında anlattık.

Piyasada BME280 diye satılan modüllerin bir kısmı aslında nem ölçmeyen BMP280'dir. İkisi neredeyse aynı görünür; kesin ayırt etmenin yolu yonganın kimlik (chip ID) register'ını okumaktır: BME280'de 0x60, BMP280'de 0x58 döner. Bu durumda Adafruit BME280 kütüphanesinin örnek kodu "Could not find a valid BME280 sensor" mesajı verir. Kimlik okuma kodu ve çözümü BME280 ve BMP280 yazısında.

MAX6675 ve K tipi termokupl: 1000 °C'ye kadar

Termokupl, uçları birbirine kaynatılmış iki farklı metal telden oluşur. Kaynak noktası (sıcak uç) ile tellerin cihaza bağlandığı nokta (soğuk uç) arasındaki sıcaklık farkı, tellerde çok küçük bir gerilim oluşturur; K tipi termokuplda bu, derece başına yaklaşık 41 µV'tur. Bu kadar küçük bir gerilimi Arduino'nun ADC'si okuyamaz, üstelik soğuk ucun sıcaklığını da bilmek gerekir. MAX6675 bu iki işi birden yapar: termokupl gerilimini yükseltir, kendi sıcaklığını ölçerek soğuk uç kompanzasyonu uygular ve sonucu 12 bit, 0,25 °C çözünürlükte SPI üzerinden verir. Ölçüm aralığı 0 ile +1023,75 °C arasıdır; lehim havyası, pizza fırını, mangal, seramik fırını ve egzoz gibi diğer sensörlerin dayanamayacağı yerler için tek seçenektir.

MAX6675'in sınırlarını da bilmelisin: 0 °C'nin altını ölçemez; dönüştürücünün kendi hatası 0–700 °C arasında yaklaşık ±2 °C'dir ve buna soğuk uç kompanzasyonunun ±3 °C'ye varan hatası ile termokupl telinin toleransı eklenir. Yani toplamda birkaç derecelik bir doğruluk beklemelisin; 800 °C'lik bir fırında bu fark önemsizdir. Bir dönüşüm 0,17–0,22 saniye sürdüğü için iki okuma arasında en az 250 ms beklemek gerekir. Eksi sıcaklıklar da gerekiyorsa daha yeni olan MAX31855 (−200 ile +1350 °C, 14 bit) tercih edilir. SPI hattının mantığını SPI nedir yazısında bulabilirsin. Arduino IDE'de Kütüphane Yöneticisi'nden Adafruit'in MAX6675 library kütüphanesini kurduktan sonra aşağıdaki kodu yükle:

C++ (Arduino IDE)
1#include "max6675.h"
2
3const int thermoDO  = 4;    // SO: veri çıkışı / data out
4const int thermoCS  = 5;    // CS: çip seçimi / chip select
5const int thermoCLK = 6;    // SCK: saat / clock
6
7MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
8
9void setup() {
10  Serial.begin(9600);
11  delay(500);                                   // ilk ölçümü bekle / wait for the first conversion
12}
13
14void loop() {
15  float c = thermocouple.readCelsius();
16  if (isnan(c)) {                               // D2 biti: termokupl açık / bit D2: thermocouple open
17    Serial.println(F("Termokupl takili degil / Thermocouple not connected"));
18  } else {
19    Serial.print(F("Sicaklik / Temp: "));
20    Serial.print(c, 2);
21    Serial.println(F(" C"));
22  }
23  delay(500);                                   // en az 250 ms bekle / wait at least 250 ms
24}
Termokupl uçları kutupludur: + ve − işaretli uçları modüldeki aynı işaretli vidalara bağla; ters bağlarsan prob ısındıkça okunan sıcaklık düşer. Modülü ısınan cihazın yanına koyma: MAX6675 soğuk ucu kendi sıcaklığıyla düzelttiği için kartın ısınması doğrudan ölçüme yansır. Prob takılı değilse ya da tel kopmuşsa kütüphane nan döndürür.

MLX90614: dokunmadan sıcaklık ölçmek

MLX90614, nesnelerin yaydığı kızılötesi ışınımı bir termopil ile algılayan temassız bir sıcaklık sensörüdür. Aynı anda iki değer verir: kendi gövdesinin sıcaklığı olan ortam sıcaklığı (−40 ile +125 °C) ve baktığı yüzeyin sıcaklığı olan nesne sıcaklığı (−70 ile +380 °C). Oda sıcaklığı civarında ±0,5 °C doğruluk ve 0,02 °C çözünürlük sunar; fabrikada kalibre edilmiştir ve I2C (SMBus) üzerinden 0x5A adresiyle haberleşir, hat hızı en fazla 100 kHz olmalıdır. Dönen bir motoru, rulmanı, devre kartında ısınan bir entegreyi ya da ocaktaki tavayı dokunmadan ölçmek için idealdir.

Temassız ölçümün iki püf noktası vardır. Birincisi görüş alanıdır: sensör, görüş konisine giren her şeyin ortalamasını ölçer. En yaygın sürüm olan MLX90614ESF-BAA'nın görüş açısı 90°'dir; bu, 5 cm uzaklıkta yaklaşık 10 cm çaplı bir alanın ortalaması demektir. Küçük bir nesneyi ölçmek için sensörü yaklaştırmalı ya da 35° (BCC) veya 5° (BCI) gibi dar açılı sürümleri seçmelisin. İkincisi emisivitedir (yayınım katsayısı): sensör fabrikada 1,0'a ayarlıdır. Mat boya, plastik, ahşap, deri ve su için bu katsayı 0,9–0,98 arasında olduğundan sonuç doğruya yakındır; parlak metal yüzeyler ise çok az ışınım yaydığı için olduğundan çok daha soğuk görünür. Üzerine mat siyah bant yapıştırmak basit ve etkili bir çözümdür. Kütüphane Yöneticisi'nden Adafruit MLX90614 kütüphanesini kurup şu kodu dene:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MLX90614.h>
3
4Adafruit_MLX90614 mlx = Adafruit_MLX90614();
5
6void setup() {
7  Serial.begin(9600);
8  if (!mlx.begin()) {                           // varsayılan adres 0x5A / default address 0x5A
9    Serial.println(F("MLX90614 bulunamadi / not found"));
10    while (true) delay(10);
11  }
12  Serial.print(F("Emisivite / Emissivity: "));
13  Serial.println(mlx.readEmissivity(), 2);      // fabrika ayarı 1.00 / factory default 1.00
14}
15
16void loop() {
17  Serial.print(F("Ortam / Ambient: "));
18  Serial.print(mlx.readAmbientTempC(), 2);      // sensör gövdesi / sensor body
19  Serial.print(F(" C   Nesne / Object: "));
20  Serial.print(mlx.readObjectTempC(), 2);       // baktığı yüzey / surface in view
21  Serial.println(F(" C"));
22  delay(500);
23}
MLX90614 camın arkasını göremez: sensörün optik filtresi 5,5–14 µm dalga boylarını geçirir ve cam bu aralıkta neredeyse opaktır. Sensörü pencereden dışarı doğrultursan dışarıyı değil, camın sıcaklığını ölçersin. Ayrıca sensör soğuk bir odadan sıcak bir odaya taşındığında gövdesi dengeye gelene kadar birkaç dakika hatalı okuyabilir.

Bağlantı özeti: Arduino Uno, ESP32 ve Raspberry Pi Pico

Sensör ve pinArduino UnoESP32Raspberry Pi Pico
DHT11 / DHT22: DATAD2GPIO 27GP15
DS18B20: DQ (+ 4,7 kΩ pull-up)D3GPIO 4GP22
LM35: Vout (besleme 5 V)A0GPIO 34 (ADC1)GP26 (ADC0)
NTC: bölücünün orta noktasıA1 (bölücü 5V'tan)GPIO 35 (ADC1, bölücü 3V3'ten)GP27 (ADC1, bölücü 3V3'ten)
BME280: SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
MLX90614: SDA / SCLA4 / A5 (aynı I2C hattı)GPIO 21 / 22GP4 / GP5
MAX6675: SO / CS / SCKD4 / D5 / D6GPIO 19 / 23 / 18GP16 / GP17 / GP18
Besleme (VCC)5V (6 pinli BME280 için 3.3V)3V3 (LM35 için 5V/VIN)3V3(OUT) (LM35 için VBUS)

ESP32 ve Pico 3,3 V ile çalışır; NTC bölücüsünü 3V3'ten beslersen ADC girişine güvenli olmayan bir gerilim gelmez. ESP32'de analog sensörleri yalnızca ADC1 pinlerine (GPIO 32–39) bağla, çünkü ADC2 pinleri Wi-Fi açıkken çalışmaz; DHT ve DS18B20 gibi çift yönlü veri hatları için ise GPIO 34–39'u kullanma, bu pinler yalnızca giriştir. BME280 (0x76) ve MLX90614 (0x5A) farklı adresleri olduğu için aynı iki I2C kablosunu sorunsuz paylaşır. Kartının tüm pinlerini Pinout aracında, pull-up dirençlerinin renk kodlarını da direnç renk kodu aracında bulabilirsin.

ESP32 ile karşılaştırma testi: üç sensör aynı ortamda

Sensörler arasındaki farkı en iyi kendi gözünle görürsün. Aşağıdaki ESP32 kodu DS18B20, DHT22 ve BME280'i aynı anda okur ve sonuçları Arduino IDE'nin Seri Çizici'sinde (Serial Plotter) üç ayrı çizgi olarak gösterir. Sensörleri breadboard üzerinde yan yana, ESP32'den en az 10 cm uzağa yerleştir; ESP32 çalışırken ısınır ve yakınındaki sensörü etkiler. Kod için OneWire, DallasTemperature, DHT sensor library ve Adafruit BME280 kütüphaneleri gerekir.

C++ (Arduino IDE)
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <DHT.h>
4#include <Wire.h>
5#include <Adafruit_Sensor.h>
6#include <Adafruit_BME280.h>
7
8const int ONE_WIRE_PIN = 4;     // DS18B20 DQ (4,7 kΩ pull-up -> 3V3)
9const int DHT_PIN = 27;         // DHT22 DATA
10
11OneWire oneWire(ONE_WIRE_PIN);
12DallasTemperature ds(&oneWire);
13DHT dht(DHT_PIN, DHT22);
14Adafruit_BME280 bme;            // I2C: SDA GPIO 21, SCL GPIO 22
15bool bmeOk = false;
16
17void setup() {
18  Serial.begin(115200);
19  ds.begin();
20  dht.begin();
21  bmeOk = bme.begin(0x76) || bme.begin(0x77);   // iki adresi de dene / try both addresses
22  if (!bmeOk) Serial.println("BME280 bulunamadi / not found");
23}
24
25void loop() {
26  ds.requestTemperatures();                     // 12 bitte ~750 ms sürer / takes ~750 ms at 12-bit
27  float tDs  = ds.getTempCByIndex(0);           // sensör yoksa -127 / -127 if missing
28  float tDht = dht.readTemperature();           // hata olursa NAN / NAN on error
29  float tBme = bmeOk ? bme.readTemperature() : NAN;
30
31  // Seri Çizici için etiket:değer biçimi / label:value format for the Serial Plotter
32  Serial.printf("DS18B20:%.2f,DHT22:%.1f,BME280:%.2f\n", tDs, tDht, tBme);
33  delay(2000);                                  // DHT22 en fazla 2 sn'de bir / DHT22 at most every 2 s
34}

Önce birkaç dakika bekle ve çizgilerin birbirinden ne kadar ayrı durduğuna bak: 0,5–1 °C'lik farklar bu sensörlerin doğruluk sınırları içindedir. Sonra yanlarına bir bardak ılık su koy ya da üçüne birden hafifçe üfle. DS18B20 ve BME280 birkaç saniye içinde tepki verir, DHT22'nin çizgisi ise plastik kafesi yüzünden belirgin biçimde geride kalır. BME280 diğerlerinden sürekli birkaç onda bir derece yüksek kalıyorsa bu, yonganın kendi kendini ısıtmasıdır. Bu küçük deney, veri sayfasında yazmayan farkları görmeni sağlar. Ölçümleri uzun süre kaydetmek istersen bir SD kart modülü kullanabilir ya da verileri Google Sheets'e gönderebilirsin.

Raspberry Pi Pico ve MicroPython ile sıcaklık ölçümü

Pico'nun MicroPython yazılımında dht, onewire ve ds18x20 modülleri hazır gelir; DHT ve DS18B20 için Pico'ya ek dosya kopyalaman gerekmez. Ayrıca RP2040 yongasının içinde, ADC'nin 4. kanalına bağlı dahili bir sıcaklık sensörü vardır. Aşağıdaki kod üçünü birlikte okur:

MicroPython
1from machine import Pin, ADC
2import dht, onewire, ds18x20, time
3
4dht22 = dht.DHT22(Pin(15))                          # DHT22 DATA -> GP15
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22)))      # DS18B20 DQ -> GP22 (4,7 kΩ pull-up)
6roms = ds.scan()                                    # hattaki sensörler / sensors on the bus
7cpu = ADC(4)                                        # RP2040 dahili sensörü / internal sensor
8
9def cpu_temp():
10    v = cpu.read_u16() * 3.3 / 65535                # ham değer -> volt / raw value -> volts
11    return 27 - (v - 0.706) / 0.001721              # RP2040 veri sayfası formülü / datasheet formula
12
13while True:
14    t_ds = None
15    if roms:
16        ds.convert_temp()                           # ölçümü başlat / start conversion
17        time.sleep_ms(750)                          # 12 bit dönüşüm süresi / 12-bit conversion time
18        t_ds = round(ds.read_temp(roms[0]), 2)
19    try:
20        dht22.measure()
21        t_dht, nem = dht22.temperature(), dht22.humidity()
22    except OSError:                                 # okuma hatası / read error
23        t_dht = nem = None
24    print("DS18B20:", t_ds, "DHT22:", t_dht, "Nem / RH:", nem,
25          "Pico:", round(cpu_temp(), 1))
26    time.sleep(2)

Dahili sensör ortamın değil yonganın sıcaklığını ölçer; ADC referansındaki küçük sapmalar da sonucu birkaç derece kaydırabilir. Bu yüzden ortam ölçümü için değil, kartın aşırı ısınıp ısınmadığını izlemek için uygundur. DS18B20'nin veri hattına 4,7 kΩ pull-up takmayı unutma; Pico'nun dahili pull-up dirençleri 1-Wire için zayıf kalır. Pico ile yeni tanışıyorsan Raspberry Pi Pico nedir yazısıyla başlayabilirsin.

Hangi proje için hangi sıcaklık sensörü?

Proje ya da ihtiyaçÖnerilen sensörNeden?
İlk proje, oda termometresiDHT11En ucuzu, nemi de verir; oda için ±2 °C yeterli
İç ve dış mekân hava istasyonuBME280 ya da DHT22−40 °C'ye iner, nemi verir; BME280 basınç ve irtifa da ölçer
Akvaryum, su deposu, kombi suyuDS18B20 su geçirmez probPaslanmaz kılıf, ±0,5 °C, uzun kablo
Buzdolabı ve dondurucuDS18B20−55 °C'ye kadar ölçer; DHT11 sıfırın altını göremez
Birçok noktada ölçüm (odalar, sera, tesisat)DS18B20Tek pine onlarca sensör, her biri kendi adresiyle
Kuluçka makinesiDHT22 ya da BME28037,5 °C civarında ±0,5 °C ve nem kontrolü birlikte
Fırın, mangal, lehim havyasıMAX6675 + K tipi termokupl1000 °C'ye kadar dayanır
3D yazıcı nozulu, pil paketiNTC termistörKüçük, ucuz ve hızlı; 3D yazıcılarda 100 kΩ cam kılıflı NTC kullanılır
Motor, rulman, devre kartı, hareketli parçaMLX90614Dokunmadan ölçer
ADC ve analog ölçümü öğrenmekLM35 ya da NTCKütüphane gerekmez, formülle çalışır

Sıcaklık sensörleriyle proje fikirleri

  • Akıllı sera: Havanın sıcaklığını ve nemini DHT22 ile, toprağın sıcaklığını DS18B20 probuyla ölç; fanı ve sulamayı bir röle modülüyle yönet. Projenin tamamı için akıllı sera projesi yazısına bak.
  • Termostatlı akvaryum ısıtıcısı: Su geçirmez DS18B20 ile suyu 25–26 °C arasında tut; rölenin her küçük değişimde açılıp kapanmaması için 0,5 °C'lik histerezis kullan.
  • Pille çalışan hava istasyonu: BME280'i ESP32'nin deep sleep moduyla birleştirip on dakikada bir ölç; sistem aylarca pille çalışsın.
  • Pizza fırını ya da mangal termometresi: MAX6675 ve K tipi probla fırın sıcaklığını OLED ekranda büyük rakamlarla göster.
  • Temassız motor sıcaklık alarmı: MLX90614 ile bir motorun ya da 3D yazıcı tablasının yüzey sıcaklığını izle, eşik aşılınca buzzer çalsın.
  • Ev otomasyonu: Her odadaki sıcaklığı ESP32 ile MQTT üzerinden Home Assistant'a gönder ve kombiyi buna göre yönet.
  • Dondurucu bekçisi: DS18B20 ile dondurucunun içi −12 °C'nin üzerine çıkarsa sesli uyarı ver ve değeri I2C LCD ekranda göster.

Sık yapılan hatalar ve çözümleri

BelirtiOlası sebepÇözüm
DHT: nan ya da "Failed to read from DHT sensor!"Kodda yanlış tip (DHT11/DHT22), pull-up yok ya da çok sık okumaTipi düzelt, 10 kΩ pull-up ekle, okumalar arasında 2 saniye bekle
DS18B20: −127 °CSensör bulunamadı: pull-up yok, kablo ya da pin hatalıDQ ile VCC arasına 4,7 kΩ tak, bağlantıları kontrol et
DS18B20: hep 85 °CÖlçüm bitmeden okundu ya da besleme yetersizDönüşüm süresini bekle, VDD'yi doğrudan besle
LM35: anormal yüksek değer, sensör ısınıyorBesleme bacakları ters bağlanmışGücü hemen kes, bacak sırasını düzelt
LM35 ya da NTC: değer sürekli zıplıyorADC gürültüsü, uzun kablo, dalgalanan USB beslemesiOrtalama al, 0,1 µF kondansatör ekle, kabloyu kısalt
NTC: ısındıkça sıcaklık düşüyorBölücünün yönü kodla uyuşmuyorDirenç formülünü ters çevir
BME280: "Could not find a valid BME280 sensor"Yanlış adres (0x76/0x77) ya da yonga aslında BMP280Adresi değiştir, chip ID'yi oku (0x60 / 0x58)
BME280 ya da DHT: 1–3 °C yüksekKendi kendini ısıtma, yakındaki ESP32 ya da regülatörSensörü karttan uzaklaştır, ölçüm sıklığını azalt, ofset uygula
MAX6675: nanTermokupl takılı değil ya da tel kopukVida bağlantılarını ve probu kontrol et
MAX6675: ısındıkça değer düşüyorTermokupl kutupları ters+ ve − uçlarının yerini değiştir
MLX90614: parlak metal çok soğuk görünüyorDüşük emisiviteMat siyah bant yapıştır ya da emisiviteyi ayarla
MLX90614: küçük nesne yanlış ölçülüyorGörüş alanı nesneden büyükSensörü yaklaştır ya da dar açılı sürüm kullan
Hangi sensörü seçersen seç, en büyük hata kaynağı çoğu zaman sensörün kendisi değil, yerleşimidir. Doğrudan güneş alan, voltaj regülatörünün ya da ESP32'nin hemen yanında duran ya da kapalı bir kutuya hapsedilmiş bir sensör, ortamın değil kendi çevresinin sıcaklığını ölçer. Sensörü karttan uzaklaştır, hava alan bir yere koy ve bir kez güvendiğin bir termometreyle karşılaştırıp aradaki sabit farkı kodda düzelt. Titreyen değerleri yumuşatmak için sensör verisini filtreleme yöntemlerine göz at.

Kısacası oda ve hava ölçümü için DHT22 ya da BME280, su ve soğuk ortamlar için DS18B20, analog ölçümü öğrenmek ve hızlı tepki için LM35 ya da NTC, yüksek sıcaklık için MAX6675, dokunamadığın yüzeyler için ise MLX90614 doğru başlangıç noktasıdır. Diğer sensör türlerini de tanımak istersen Arduino sensörleri rehberine göz atabilirsin. BlueGrays uygulamasında DHT11 ile sıcaklık ve nem ölçümü, NTC ve LCD ekranla termometre, ESP32 ve DHT22 ile LCD'li sıcaklık göstergesi, ESP32 sıcaklık kaydedici ve akıllı sulama projelerini adım adım devre şeması ve kodlarıyla bulabilirsin.

Sıkça sorulan sorular

Arduino için en doğru sıcaklık sensörü hangisi?

Hobi sensörleri arasında oda sıcaklığı civarında en doğru seçenekler ±0,5 °C ile DS18B20, DHT22, BME280 (25 °C'de) ve MLX90614'tür. Kablolu ve su geçirmez ölçüm için DS18B20, nemle birlikte ölçüm için DHT22 ya da BME280 öne çıkar. Sensörü bir kez güvenilir bir termometreyle karşılaştırıp kodda ofset düzeltmesi yapmak, hangisini seçersen seç doğruluğu belirgin biçimde artırır.

DHT11 mi DHT22 mi almalıyım?

Yalnızca oda sıcaklığını ve nemi kabaca izleyeceksen DHT11 yeterlidir. Dış mekân, sıfırın altı ya da ±0,5 °C doğruluk gerekiyorsa DHT22 al; −40 ile +80 °C arasını ölçer ve nemi de daha doğru verir. İkisi aynı kütüphane ve kodla çalışır, kodda yalnızca sensör tipini değiştirirsin.

Suyun sıcaklığını Arduino ile nasıl ölçerim?

Su için en uygun sensör, paslanmaz çelik kılıflı su geçirmez DS18B20 probudur. Probu suya daldırır, veri telini 4,7 kΩ pull-up direnciyle Arduino'nun bir dijital pinine bağlarsın. Kablo ve ek yerleri genellikle uzun süre sıcak su içinde kalmak için tasarlanmadığından yalnızca çelik ucu suya sok.

Arduino ile 500 °C gibi yüksek sıcaklıklar ölçülebilir mi?

Evet. K tipi termokupl ve MAX6675 modülüyle 0 ile yaklaşık 1024 °C arası ölçülebilir. Termokuplun ucu fırının içine girer, MAX6675 modülü ise ısıdan uzakta kalmalıdır. Satın aldığın probun kılıfının ve kablosunun hangi sıcaklığa kadar dayandığını da mutlaka kontrol et.

Arduino ile temassız ateş ölçer yapılabilir mi?

MLX90614 ile Arduino'ya bağlanan temassız bir kızılötesi termometre yapabilirsin; standart sürüm oda sıcaklığı civarında ±0,5 °C doğruluk sunar. Vücut sıcaklığı için tıbbi doğruluk sınıfındaki sürüm (±0,2 °C) ve doğru ölçüm mesafesi gerekir, yine de bu düzenek tıbbi bir cihazın yerini tutmaz. Ölçerken hedef yüzeyin sensörün görüş alanını tamamen doldurmasına dikkat et.

Sıcaklık sensörüm neden olduğundan yüksek gösteriyor?

En sık sebep sensörün yakınındaki ısı kaynaklarıdır: ESP32, voltaj regülatörü ya da güneş ışığı. BME280 gibi sensörler sürekli ölçüm yaptığında kendi kendini de biraz ısıtır. Sensörü karttan 10–15 cm uzaklaştır, ölçüm sıklığını azalt ve kalan sabit farkı güvendiğin bir termometreyle karşılaştırarak kodda düzelt.

Tüm projeleri gör
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

4.7(47)
73
NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü
#44Başlangıç
Premium

NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü

Ortamın sıcaklığını küçük bir boncuk gibi görünen sensörle ölç. NTC adlı bu parça ısındıkça elektriği daha kolay geçirir; Arduino bu değişimi okuyup bir formülle santigrat dereceye çevirir ve iki satı

4.5(33)
44
ESP32 DHT22 Sıcaklık ve Nem (LCD Ekranlı)
#117Orta

ESP32 DHT22 Sıcaklık ve Nem (LCD Ekranlı)

DHT22 sensörü ile ortam sıcaklığını ve nem oranını ölçüp 16x2 I2C LCD ekranda gerçek zamanlı olarak gösteren bir projedir. Adafruit DHT kütüphanesi kullanılarak tek kablo (one-wire) protokolü ile sensörden veri okunur. Bu proje, IoT hava istasyonu, akıllı ev otomasyonu veya seralarda ortam takip sistemlerinin temelini oluşturur. ESP32'nin GPIO 4 pini üzerinden DHT22 ile haberleşme sağlanır.

4.8(38)
56
ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
#144İleri
Premium

ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)

ESP32 ile zamanlı sıcaklık ve nem kayıt sistemi kur! Bu projede DHT22 sensörü ile dakikada bir sıcaklık/nem okuyup DS1307 RTC modülünden aldığın gerçek zaman etiketiyle microSD karta CSV formatında kaydediyoruz. OLED ekranda büyük font ile son sıcaklık değeri, nem yüzdesi, timestamp ve toplam kayıt sayısı canlı gösterilir. SD kart üzerindeki /temp_log.csv dosyası Excel/Google Sheets/Python pandas ile açılıp analiz edilebilir — sera monitörü, ev/oda sıcaklık takibi, laboratuvar veri toplama,

4.7(7)
12
Dot Matrix Saat, Takvim ve Hava İstasyonu (MAX7219, DS1307)
#85Orta
Premium

Dot Matrix Saat, Takvim ve Hava İstasyonu (MAX7219, DS1307)

Masada ya da duvarda durup saati, tarihi ve odanın havasını sırayla gösteren kayan yazılı bir pano. 8x32 LED ekranda önce sıcaklık hem Celsius hem Fahrenheit olarak, sonra nem, ardından iki noktası he

5.0(50)
66
Akıllı Sulama İstasyonu
#83İleri
Premium

Akıllı Sulama İstasyonu

Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

5.0(42)
57
I2C İle LCD Ekran Kullanımı
#32Başlangıç
Premium

I2C İle LCD Ekran Kullanımı

Arduino'ya kendi ekranını kazandır ve ilk mesajını yazdır. İki satırlık LCD ekran yalnızca birkaç kabloyla bağlanır; önce üst satıra bir selam, ardından alt satıra ikinci bir yazı gelir, ekran temizle

4.8(53)
70