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
| Malzeme | Adet | Görevi |
|---|---|---|
| Arduino Uno R3 (CH340, USB kablolu) | 1 | Ölçer, karar verir, röleyi sürer |
| 16x2 LCD Keypad Shield | 1 | Sıcaklığı gösterir; 5 tuş A0'dan okunur |
| DS18B20 su geçirmez sıcaklık sensörü (1 m) | 1 | Sıcaklığı 0,125 °C adımla ölçer |
| 5V 2 kanal röle kartı | 1 | Isıtıcıyı açıp kapatır (bir kanal yeterli) |
| 12V 3A adaptör | 1 | Arduino'yu ve ısıtıcıyı besler |
| 12/24V şerit ısıtıcı 350x20 mm | 1 | Isı kaynağı (başka bir 12V ısıtıcı da olur) |
| 4,7 kΩ 1/4W direnç | 1 | DS18B20 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ı.
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.
- 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.
- 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.
- 4,7 kΩ direnci veri hattı (D2) ile 5V arasına takın. Bu direnç olmadan sensör okunmaz.
- Röle modülünü bağlayın: VCC → 5V, GND → GND, IN1 → D3.
- 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.
- Arduino IDE'de Kütüphane Yöneticisi'nden "OneWire" ve "DallasTemperature" kütüphanelerini kurun, aşağıdaki kodu yükleyin.
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.putdeğ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_AKTIFsabitinifalseyapı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.
