Yazılardaki ürünleri komponentci.net'te inceleyebilir, hemen sipariş verebilirsiniz.komponentci.net →
KomponentciBlog Mağaza
Blog  ›  Projeler

Arduino ile Termostat Yapımı: DS18B20, Röle ve LCD

Arduino ile Termostat Yapımı: DS18B20, Röle ve LCD
Kısa cevap

Arduino ile termostat yapmak için DS18B20 sıcaklık sensörü, bir röle modülü ve tuşlu 16x2 LCD ekran yeterlidir. Arduino sıcaklığı saniyede bir okur, sıcaklık hedefin histerezis kadar altına inince 12V ısıtıcıyı açar, hedefe ulaşınca kapatır. Hedef sıcaklık ve histerezis tuşlarla ayarlanır ve EEPROM'a kaydedilir.

Hazır dijital termostatlar işinizi görür, ama kendi termostatınızı yazdığınızda ekranı, ayar adımlarını ve güvenlik kurallarını istediğiniz gibi belirlersiniz. Bu yazıda Arduino ile termostat yapımını adım adım anlatıyoruz: DS18B20 sensörü sıcaklığı ölçer, röle 12V bir ısıtıcıyı açıp kapatır, tuşlu LCD ekrandan hedef sıcaklık ve histerezis ayarlanır, ayarlar EEPROM'da saklanır. Proje; kuluçka, yoğurt ve fermantasyon gibi ısıtma işlerine temel olur.

Arduino termostat nedir?

Arduino termostat, bir sıcaklık sensöründen okuduğu değeri kullanıcının girdiği hedefle karşılaştırıp bir röle üzerinden ısıtıcıyı açan ya da kapatan, Arduino ile programlanmış bir sıcaklık kontrol devresidir. Bu yazıdaki devre ısıtma modunda çalışır; yani ortam soğuyunca ısıtıcıyı açar.

Termostatların genel çalışma mantığı ve çeşitleri için termostat nedir ve çeşitleri yazısına bakabilirsiniz. Fanı sıcaklığa göre hızlandıran PWM devresini ise sıcaklığa göre çalışan fan yazısında anlattık; buradaki proje ondan farklı olarak aç-kapa çalışan bir ısıtma termostatıdır.

Hangi malzemeler gerekir?

Bir Arduino Uno, LCD Keypad Shield, su geçirmez DS18B20, 5V röle modülü, 4,7 kΩ direnç, 12V adaptör ve 12V bir ısıtıcı yeterlidir. LCD Keypad Shield, 16x2 ekranı ve beş tuşu tek kartta topladığı için ayrıca buton bağlamanız gerekmez.

Malzeme listesi

MalzemeAdetGörevi
Arduino Uno R3 (CH340, USB kablolu)1Ölçer, karar verir, röleyi sürer
16x2 LCD Keypad Shield1Sıcaklığı gösterir; 5 tuş A0'dan okunur
DS18B20 su geçirmez sıcaklık sensörü (1 m)1Sıcaklığı 0,125 °C adımla ölçer
5V 2 kanal röle kartı1Isıtıcıyı açıp kapatır (bir kanal yeterli)
12V 3A adaptör1Arduino'yu ve ısıtıcıyı besler
12/24V şerit ısıtıcı 350x20 mm1Isı kaynağı (başka bir 12V ısıtıcı da olur)
4,7 kΩ 1/4W direnç1DS18B20 veri hattı için pull-up

Şerit ısıtıcının ürün sayfasında güç değeri yazmaz. Bağlamadan önce iki ucu arasındaki direnci multimetreyle ölçün: 12V'ta akım I = 12 / R olur. 3A adaptörde Arduino ve röle için de pay bırakmak üzere ısıtıcı akımı en çok 2,5A olmalıdır; yani direnç en az 4,8 Ω çıkmalıdır.

Histerezis nedir, neden gerekir?

Histerezis, ısıtıcının açıldığı ve kapandığı sıcaklıklar arasındaki farktır ve rölenin sürekli açıp kapamasını önler. Histerezis olmasaydı sıcaklık hedefin etrafında 0,1 °C oynadıkça röle saniyede bir tıklar, kontakları kısa sürede yıpranırdı.

Termostat histerezis grafiği: hedef 30,0 °C ve histerezis 1,0 °C; ölçülen sıcaklık 28 °C'den yükselip 30,0 °C'ye ulaşınca ısıtıcı kapanıyor, kısa bir taşmadan sonra sıcaklık 29,0 °C'ye inince ısıtıcı yeniden açılıyor; 29 ile 30 °C arasındaki sarı ölü bantta röle önceki durumunu koruyor; altta ısıtıcının açık ve kapalı olduğu süreleri gösteren şerit
Isıtıcı 29,0 °C'de açılır, 30,0 °C'de kapanır; aradaki 1 °C'lik bantta röle durumunu korur ve sık tıklamaz.

Bu koddaki kural şöyledir: hedef 30,0 °C ve histerezis 1,0 °C ise ısıtıcı sıcaklık 29,0 °C'ye ya da altına inince açılır, 30,0 °C'ye ulaşınca kapanır. Aradaki bölgede röle önceki durumunu korur. Isıtıcı kapandıktan sonra sıcaklık bir süre daha yükselir; bu taşma büyükse ısıtıcı gücünü ya da sensörün yerini değiştirin.

Devre nasıl bağlanır?

LCD Keypad Shield Arduino Uno'nun üstüne takılır; DS18B20 veri ucu D2'ye, röle modülünün IN ucu D3'e bağlanır. 12V adaptör Arduino'nun DC girişine ve rölenin COM ucuna gider, ısıtıcı rölenin NO ucu ile 12V eksi arasına bağlanır.

  1. LCD Keypad Shield'ı Arduino Uno'ya takın. Shield; D4–D9 ve A0 pinlerini kullanır, D2 ve D3 boş kalır. Bu uçlara shield üzerindeki boş pin sırasından ulaşılır.
  2. DS18B20'yi bağlayın: kırmızı → 5V, siyah → GND, sarı (veri) → D2. Kablo renkleri üreticiye göre değişebilir; ürün etiketini kontrol edin.
  3. 4,7 kΩ direnci veri hattı (D2) ile 5V arasına takın. Bu direnç olmadan sensör okunmaz.
  4. Röle modülünü bağlayın: VCC → 5V, GND → GND, IN1 → D3.
  5. Yük tarafını kurun: adaptörün artısı rölenin COM ucuna, NO ucu ısıtıcının bir ucuna, ısıtıcının diğer ucu adaptörün eksisine gider. Aynı adaptörü 5,5x2,1 mm fişle Arduino'nun DC girişine takın.
  6. Arduino IDE'de Kütüphane Yöneticisi'nden "OneWire" ve "DallasTemperature" kütüphanelerini kurun, aşağıdaki kodu yükleyin.
Arduino termostat bağlantı şeması: LCD Keypad Shield takılı Arduino Uno; DS18B20 sensörünün siyah GND ucu GND pinine, kırmızı VCC ucu 5V pinine, sarı DATA ucu D2 pinine bağlı, DATA ile 5V arasında 4,7 kΩ pull-up direnci; röle modülünün IN1 ucu D3 pinine, VCC ve GND uçları 5V ve GND hattına bağlı; 12V 3A adaptör fişle Arduino DC girişine, artı ucu rölenin COM ucuna gidiyor; rölenin NO ucundan limit termostat ve 12V ısıtıcı üzerinden adaptörün GND ucuna dönülüyor; sağ üstte kontrol kuralı: sıcaklık hedef eksi histerezise inince ısıtıcı açık, hedefe ulaşınca kapalı, sensör hatasında kapalı
DS18B20 veri ucu D2'ye (4,7 kΩ ile 5V'a), röle IN1 ucu D3'e bağlanır; 12V adaptörün artısı COM'a, ısıtıcı NO ile GND arasına, seri limit termostatla bağlanır.

Adaptör tek olduğu için Arduino'nun 5V regülatörü 12V'tan çalışır ve hafifçe ısınır; bu normaldir. Sensör hatasında ısıtıcının kapanması yazılımla sağlanır, ama ek güvenlik için ısıtıcıyla seri bir bimetal limit termostat da takın. Bu parçanın çalışmasını termik sigorta ve bimetal termostat yazısında anlattık.

Kod nasıl yazılır?

Kod; sensörü saniyede bir okur, histerezis kuralını uygular, ekranı günceller ve tuşları dinler. Ayarlar EEPROM'un 0. adresinde tutulur.

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // LCD Keypad Shield pinleri
OneWire ow(2);                         // DS18B20 veri ucu D2 (4,7 kOhm ile 5V'a)
DallasTemperature sensor(&ow);
const byte ROLE = 3;                   // role modulu IN ucu
const bool ROLE_LOW_AKTIF = true;      // cogu role modulu LOW ile ceker

struct Ayar { byte imza; float hedef; float hist; };
const byte IMZA = 0x5A;
Ayar ayar;

enum Tus { YOK, SAG, YUKARI, ASAGI, SOL, SEC };
float sicaklik = NAN;
bool isitici = false;
byte mod = 0;                          // 0 izleme, 1 hedef, 2 histerezis
unsigned long sonOlcum = 0, sonTus = 0;

Tus tusOku() {
  int v = analogRead(A0);
  if (v < 60)  return SAG;
  if (v < 200) return YUKARI;
  if (v < 400) return ASAGI;
  if (v < 600) return SOL;
  if (v < 800) return SEC;
  return YOK;
}

void roleYaz(bool ac) {
  isitici = ac;
  digitalWrite(ROLE, (ac ^ ROLE_LOW_AKTIF) ? HIGH : LOW);
}

void satir(byte r, const char *s) {
  lcd.setCursor(0, r);
  byte n = 0;
  while (s[n] && n < 16) lcd.print(s[n++]);
  while (n++ < 16) lcd.print(' ');
}

void ekran() {
  char t[8], h[8], d[8], s[17];
  if (isnan(sicaklik)) strcpy(t, " --.-"); else dtostrf(sicaklik, 5, 1, t);
  dtostrf(ayar.hedef, 4, 1, h);
  dtostrf(ayar.hist, 3, 1, d);
  snprintf(s, 17, "T%sC %s", t, isitici ? "ISITICI+" : "ISITICI-");
  satir(0, s);
  if (mod == 0) snprintf(s, 17, "Hdf %s His %s", h, d);
  if (mod == 1) snprintf(s, 17, "> Hedef: %s C", h);
  if (mod == 2) snprintf(s, 17, "> Hister: %s C", d);
  satir(1, s);
}

void kontrol() {
  if (isnan(sicaklik)) { roleYaz(false); return; }   // sensor yoksa kapat
  if (sicaklik <= ayar.hedef - ayar.hist) roleYaz(true);
  else if (sicaklik >= ayar.hedef) roleYaz(false);
}

void tuslar() {
  static Tus onceki = YOK;
  Tus k = tusOku();
  bool yeni = (k != onceki);
  onceki = k;
  if (k == YOK || (k == SEC && !yeni) || millis() - sonTus < 200) return;
  sonTus = millis();
  int yon = (k == YUKARI) ? 1 : (k == ASAGI) ? -1 : 0;
  if (k == SEC) {
    mod = (mod + 1) % 3;
    if (mod == 0) EEPROM.put(0, ayar);
  } else if (mod == 1 && yon) {
    ayar.hedef = constrain(ayar.hedef + yon * 0.5, 5.0, 60.0);
  } else if (mod == 2 && yon) {
    ayar.hist = constrain(ayar.hist + yon * 0.1, 0.2, 5.0);
  }
  ekran();
}

void setup() {
  roleYaz(false);  // role kapali baslar
  pinMode(ROLE, OUTPUT);
  lcd.begin(16, 2);
  sensor.begin();
  sensor.setResolution(11);            // 0,125 C adim, ~375 ms olcum
  sensor.setWaitForConversion(false);
  sensor.requestTemperatures();
  EEPROM.get(0, ayar);
  if (ayar.imza != IMZA || isnan(ayar.hedef) || isnan(ayar.hist)) {
    ayar = { IMZA, 30.0, 1.0 };
    EEPROM.put(0, ayar);
  }
  ekran();
}

void loop() {
  if (millis() - sonOlcum >= 1000) {
    sonOlcum = millis();
    float t = sensor.getTempCByIndex(0);
    sensor.requestTemperatures();
    sicaklik = (t == DEVICE_DISCONNECTED_C || t == 85.0) ? NAN : t;
    kontrol();
    ekran();
  }
  tuslar();
}

Kod nasıl çalışır?

SELECT tuşu izleme, hedef ayarı ve histerezis ayarı ekranları arasında geçiş yapar; UP ve DOWN tuşları değeri değiştirir. Üçüncü SELECT basışında ekran izleme moduna döner ve ayarlar EEPROM'a yazılır.

  • Tuş okuma: Shield'deki beş tuş farklı dirençlerle A0'a bağlıdır; her tuş farklı bir analog değer üretir. Tuşlar karışırsa analogRead(A0) değerlerine göre eşikleri değiştirin.
  • Ayar sınırları: Hedef 0,5 °C adımla 5–60 °C, histerezis 0,1 °C adımla 0,2–5,0 °C arasında kalır. UP ya da DOWN basılı tutulursa değer 200 ms'de bir değişir.
  • EEPROM: ATmega328P'nin EEPROM'u hücre başına yaklaşık 100.000 yazma için tasarlanmıştır. Kod her tuşta değil yalnızca ayar menüsünden çıkarken yazar; EEPROM.put değişmeyen baytları yeniden yazmaz. İmza baytı (0x5A) boş EEPROM'un kullanılmasını engeller.
  • Sensör hatası: Kablo koparsa kütüphane −127 °C döndürür; 85 °C ise sensörün açılış değeridir. İki durumda da ekranda "--.-" görünür ve ısıtıcı kapanır.
  • Röle seviyesi: Röleniz HIGH ile çekiyorsa ROLE_LOW_AKTIF sabitini false yapın. Açılışta çıkış önce kapalı seviyeye ayarlanır, böylece röle bir an bile çekmez.

Hangi güvenlik önlemleri alınmalı?

Bu proje 12V ile çalışır; ısıtıcıyı 220V'a bağlamanız gerekiyorsa röle modülünü değil, hazır kutulu bir termostatı kullanın ve bağlantıyı bir elektrikçiye yaptırın.

  • Isıtıcı ile seri bir limit termostat takın; hedefinizin 15–20 °C üstünde açan bir parça yazılım kilitlense bile ısıtıcıyı keser.
  • Şerit ısıtıcıyı yanıcı yüzeylere (karton, strafor, kumaş) doğrudan yapıştırmayın; arada alüminyum levha kullanın.
  • Sensörü ısıtıcıdan uzağa, ölçülen ortamın ortasına yerleştirin.
  • İlk çalıştırmada devreyi gözetim altında tutun, klemenslerin ısınmadığını kontrol edin.

Sık sorulan sorular

Ekranda sürekli "--.-" yazıyorsa sorun nedir?

Arduino DS18B20'yi göremiyordur. En sık neden 4,7 kΩ pull-up direncinin eksik ya da yanlış yere takılmasıdır; direnç veri ucu ile 5V arasında olmalıdır. Ardından kablo renklerini kontrol edin: bazı sensörlerde veri ucu beyaz ya da mavi olabilir.

Bu termostat soğutma için de kullanılabilir mi?

Evet, karşılaştırmayı ters çevirerek soğutma termostatı yapabilirsiniz. Fan ya da Peltier için kural "sıcaklık hedefi aşınca aç, hedefin histerezis kadar altına inince kapat" olur. kontrol() fonksiyonundaki iki koşulu buna göre değiştirmeniz yeterlidir.

Histerezisi kaç derece seçmeliyim?

Çoğu ısıtma işi için 0,5–1,0 °C iyi bir başlangıçtır. Su gibi ısıl kütlesi büyük ortamlarda sıcaklık yavaş değiştiği için 0,3 °C bile yeterlidir. Küçük, havası çabuk ısınan kutularda röle sık tıklıyorsa histerezisi 1,5–2 °C'ye çıkarın. Kendi sisteminizde rölenin saatte kaç kez çektiğini sayarak karar verin.

Elektrik kesilince ayarlar silinir mi?

Hayır, ayarlar EEPROM'da kalır. Arduino yeniden açıldığında EEPROM.get son kaydedilen hedef ve histerezisi okur ve termostat kaldığı yerden çalışır. Yalnızca ayar menüsündeyken elektrik kesilirse o anda değiştirdiğiniz ama henüz kaydedilmemiş değer kaybolur.

Özet

  • Arduino termostat; DS18B20, röle modülü ve LCD Keypad Shield ile lehim gerektirmeden kurulur.
  • DS18B20 veri ucu D2'ye (4,7 kΩ ile 5V'a), röle IN ucu D3'e bağlanır; shield D4–D9 ve A0'ı kullanır.
  • Isıtıcı, sıcaklık "hedef − histerezis" değerine inince açılır, hedefe ulaşınca kapanır.
  • Ayarlar yalnızca menüden çıkarken EEPROM'a yazılır; elektrik kesintisinde korunur.
  • Sensör hatasında ısıtıcı kapanır; ek güvenlik için seri bimetal limit termostat önerilir.

Bu yazıdaki ürünler

Diğer yazılar

12 Kasım 20268 dk okuma

AMG8833 Termal Kamera Sensörü: 8x8 Isı Haritası Rehberi

AMG8833, Panasonic Grid-EYE ailesinden 8x8 = 64 pikselli bir termopil kızılötesi dizi sensörüdür. 0-80 °C aralığındaki yüzeylerin sıcaklığın...

Devamını oku →
12 Kasım 20268 dk okuma

MT6701 Manyetik Encoder: 14 Bit Açı Sensörü Rehberi

MT6701, MagnTek'in ürettiği, dönen bir mıknatısın açısını Hall algılayıcılarla temassız ölçen 14 bitlik manyetik açı sensörüdür. Açıyı I2C y...

Devamını oku →
12 Kasım 20267 dk okuma

MG90S ve SG90 Servo Farkı: Tork, Dişli ve Seçim Rehberi

MG90S ile SG90 arasındaki temel fark dişlilerdir: MG90S metal, SG90 plastik dişli kullanır. İkisi de aynı boyda mikro servodur ve 4,8 V'ta y...

Devamını oku →
12 Kasım 20267 dk okuma

C5198 ve A1941 Transistör: Değerler, Bacaklar ve Muadil

C5198 (2SC5198), Toshiba'nın ses amplifikatörü çıkış katı için ürettiği 140 V, 10 A ve 100 W değerli NPN güç transistörüdür; PNP eşi A1941'd...

Devamını oku →
12 Kasım 20267 dk okuma

ZB2L3 Pil Kapasite Test Cihazı: Bağlantı ve Kullanım

ZB2L3 pil kapasite test cihazı, pili harici bir yük direnci üzerinden ayarladığınız sonlandırma gerilimine kadar boşaltıp gerçek kapasiteyi...

Devamını oku →
12 Kasım 20266 dk okuma

TC4427 MOSFET Sürücü: Pinout, Bağlantı ve TC4426 Farkı

TC4427, Microchip'in iki kanallı, evirmeyen (non-inverting) ve 1,5 A tepe akımlı MOSFET sürücü entegresidir. 4,5-18 V ile beslenir ve Arduin...

Devamını oku →