Arduino ile termostat yapımı

bolubeyi

Profesyonel Üye
Katılım
27 Eyl 2008
Mesajlar
1,681
Puanları
421
Yaş
54
Konum
Trabzon
Bu dersimizde arduino ile termostat (ısı kontrol) devresi yapmayı öğreneceğiz.

Yapacağımız termostatın özellikleri şu şekilde:

Ortam sıcaklığı Lcd ekranda okunacak
Ortam sıcaklığı 0 ila 40 derece arasında arzu edilen bir seviyeye düştüğünde bir ısıtıcının 0 ila 30 dakika arasında arzu edilen süre kadar çalışması sağlanacak.
Isıtıcının devreye gireceği sıcaklık derecesi ve ısıtıcının devreden çıkacağı süre programda her hangi bir değişiklik yapmadan birer potansiyometre ile ayarlanabilir olacak
Ayarlanan sıcaklık ve süre değerleri lcd ekrandan okunacak.


Kullanma talimatı:

Butona basılı tutularak ekranda ayarlanan sıcaklık ve ayarlanan süre değerleri gözlenir.
Arzu edilen sıcaklık derecesi ve ısıtıcının devrede kalacağı süre potansiyometreler ayarlanarak belirlenir. Ayarlanan değerler ekrandan okunur.[/li]
Buton bırakıldığında ayarlama işlemi tamamlanmış olur ve sistem çalışmaya başlar.











Gerekli malzemeler:




Devre şeması:



Baskı devresi:



Arduino kodları:
Kod:
#include "DHT.h"  // ısı ve nem sensörü kütüphanesi eklendi
#define DHTPIN 2     // ısı ve nem sensörü 2 nolu pine bağlandı
#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define isitici 3 // 3. pine isitici adı verildi
int buton=4; // 4 nolu pine buton adı verildi
DHT dht(DHTPIN, DHTTYPE);

int potansiyometrePin = A2;  // Isı ayar potansiyometresi A2 pinine bağlanacak 
int sensorValue = 0; // sensorValue isminde değişken oluşturuldu
int ayarlanan_sicaklik = 0; // ayarlanan_sicaklik isminde değişken oluşturuldu

int dakikaPin = A0;  // dakika potu A0 pinine bağlanacak 
int dakikaValue = 0; // dakikaValue isminde değişken oluşturuldu
int dakika = 0; // zaman isminde değişken oluşturuldu

#include <LCD5110_Basic.h> // LCD kütüphanesi eklendi
extern uint8_t SmallFont[]; // küçük yazı
extern uint8_t MediumNumbers[]; // orta boy numara
extern uint8_t BigNumbers[]; // orta boy numara
LCD5110 myGLCD(8,9,10,11,12); // CD pinlerinin hangi Arduino pinlerine bağlı olduğunu belirtiyoruz
extern uint8_t termometre[]; // Eklemek istediğimiz resimi belirttik
extern uint8_t saat[]; // Eklemek istediğimiz resimi belirttik

void setup() 
{
  pinMode(isitici, OUTPUT); // 3 nolu pin isitici için çıkış yapıldı
  pinMode(buton, INPUT); // 1 nolu pin buton için giriş yapıldı
  pinMode(7, OUTPUT); // 7 nolu pin aydınlatma için giriş yapıldı
  Serial.begin(9600); // seri haberleşme
  dht.begin();
  myGLCD.InitLCD(); // Ekranı başlatıldı
  myGLCD.setContrast(70); //0 ila 127 arası bir değer verilebilir
  digitalWrite(7, HIGH);   // Ekran aydınlatıldı
}

void loop() 
{
  if(digitalRead(buton) == HIGH)
  {
    delay(2000); // Başlangıçta 2 saniye bekliyoruz
    sensorValue = analogRead(potansiyometrePin);  // Isı ayar potundaki voltaj okundu
    ayarlanan_sicaklik= map(sensorValue, 0, 1023, 0, 40); // Okunan voltaj 0 - 40 arası dereceye dönüştürüldü
    dakikaValue = analogRead(dakikaPin);  // dakika ayar potundaki voltaj okundu
    dakika= map(dakikaValue, 0, 1023, 0, 30); // Okunan voltaj 0 - 30 arası milisaniyeye dönüştürüldü
    myGLCD.clrScr(); //Ekranı temizliyoruz.
    myGLCD.setFont(SmallFont);  // Küçük boy yazı
    myGLCD.print("AYAR SICAKLIK:", CENTER, 0);  // Ekrana sayar sıcaklık kelimesi yazıldı
    myGLCD.printNumI(ayarlanan_sicaklik,30,8); // ekrana okunan sıcaklık değeri yazıldı
    myGLCD.setFont(SmallFont);  // Küçük boy yazı
    myGLCD.print("DERECE", RIGHT, 8);  // Ekrana sayar sıcaklık kelimesi yazıldı
   
    myGLCD.print("AYAR SURE:", CENTER, 24);  // Ekrana ayar süre kelimesi yazıldı
    myGLCD.printNumI(dakika,30,32); // ekrana okunan süre değeri yazıldı    
    myGLCD.setFont(SmallFont);  // Küçük boy yazı
    myGLCD.print("DAKIKA", RIGHT, 32);  // Ekrana sayar sıcaklık kelimesi yazıldı
  }
    if(digitalRead(buton) == LOW)
  {
  sensorValue = analogRead(potansiyometrePin);  // Isı ayar potundaki voltaj okundu
  ayarlanan_sicaklik= map(sensorValue, 0, 1023, 0, 40); // Okunan voltaj 0 - 40 arası dereceye dönüştürüldü
  delay(2000); // Başlangıçta 2 saniye bekliyoruz
  float t = dht.readTemperature();  // sıcaklığı oku
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("SICAKLIK:", RIGHT, 0);  // Ekrana sıcaklık kelimesi yazıldı
  myGLCD.print("*C", RIGHT, 16); // Ekrana *C yazıldı
  myGLCD.drawBitmap(0, 0, termometre, 24, 48); //termometreresimi çizildi.
  myGLCD.setFont(BigNumbers); // Büyük boy numara
  myGLCD.printNumI(t,40,16); // ekrana okunan sıcaklık değeri yazıldı
  delay(2000); //2 saniye bekliyoruz
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("AYARLANAN", RIGHT, 0);  // Ekrana sıcaklık kelimesi yazıldı
  myGLCD.print("SICAKLIK:", RIGHT, 8);  // Ekrana sıcaklık kelimesi yazıldı
  myGLCD.print("*C", RIGHT, 16); // Ekrana *C yazıldı
  myGLCD.drawBitmap(0, 0, termometre, 24, 48); //termometreresimi çizildi.
  myGLCD.setFont(BigNumbers); // Büyük boy numara
  myGLCD.printNumI(ayarlanan_sicaklik,40,16); // ekrana okunan sıcaklık değeri yazıldı
  delay(2000); //2 saniye bekliyoruz
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("AYARLANAN", RIGHT, 0);  // Ekrana ayarlanan kelimesi yazıldı
  myGLCD.print("SURE:", RIGHT, 8);  // Ekrana süre kelimesi yazıldı
  myGLCD.print("DAKIKA", RIGHT, 40);  // Ekrana süre kelimesi yazıldı
  myGLCD.setFont(BigNumbers); // Büyük boy numara
  myGLCD.printNumI(dakika,50,16); // ekrana okunan sıcaklık değeri yazıldı
  myGLCD.drawBitmap(0, 0, saat, 40, 40); //saat resimi çizildi.

  // ısı ayarlanan seviyenin altındaysa şunları yap burada başladı
  if( t < ayarlanan_sicaklik && digitalRead(buton) == LOW)
  {
  digitalWrite(isitici, HIGH);   // ısıtıcıyı çalıştır
  dakikaValue = analogRead(dakikaPin);  // dakika ayar potundaki voltaj okundu
  dakika= map(dakikaValue, 0, 1023, 0, 30); // Okunan voltaj 0 - 30 arası milisaniyeye dönüştürüldü
  Serial.print("Sure: "); // seri port ekranına süre yazıldı
  Serial.print(dakika);  // seri port ekranına hesaplanan dakika yazıldı
  Serial.println(" dakika "); // seri port ekranına dakika yazıldı
    sensorValue = analogRead(potansiyometrePin);  // Isı ayar potundaki voltaj okundu
  ayarlanan_sicaklik= map(sensorValue, 0, 1023, 0, 40); // Okunan voltaj 0 - 40 arası dereceye dönüştürüldü
  delay(2000); // Başlangıçta 2 saniye bekliyoruz
  float t = dht.readTemperature();  // sıcaklığı oku
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("SICAKLIK:", RIGHT, 0);  // Ekrana sıcaklık kelimesi yazıldı
  myGLCD.print("*C", RIGHT, 16); // Ekrana *C yazıldı
  myGLCD.drawBitmap(0, 0, termometre, 24, 48); //termometreresimi çizildi.
  myGLCD.setFont(BigNumbers); // Büyük boy numara
  myGLCD.printNumI(t,40,16); // ekrana okunan sıcaklık değeri yazıldı
  delay(2000); //2 saniye bekliyoruz
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("AYARLANAN", RIGHT, 0);  // Ekrana ayarlanan kelimesi yazıldı
  myGLCD.print("SICAKLIK:", RIGHT, 8);  // Ekrana sıcaklık kelimesi yazıldı
  myGLCD.print("*C", RIGHT, 16); // Ekrana *C yazıldı
  myGLCD.drawBitmap(0, 0, termometre, 24, 48); //termometreresimi çizildi.
  myGLCD.setFont(BigNumbers); // Büyük boy numara
  myGLCD.printNumI(ayarlanan_sicaklik,40,16); // ekrana okunan sıcaklık değeri yazıldı
  delay(2000); //2 saniye bekliyoruz
  myGLCD.clrScr(); //Ekranı temizliyoruz.
  myGLCD.setFont(SmallFont);  // Küçük boy yazı
  myGLCD.print("ISITICI", CENTER, 0);  // Ekrana ısıtıcı kelimesi yazıldı
  myGLCD.print("CALISIYOR", CENTER, 8);  // Ekrana calışıyor kelimesi yazıldı
  myGLCD.print("AYARLANAN", CENTER, 16);  // Ekrana calışıyor kelimesi yazıldı
  myGLCD.print("SURE SONUNDA", CENTER, 24);  // Ekrana calışıyor kelimesi yazıldı
  myGLCD.print("KAPANACAK", CENTER, 32);  // Ekrana calışıyor kelimesi yazıldı
  delay(2000); //2 saniye bekliyoruz
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  delay(dakika * 2000);
  } 
  // ısı ayarlanan seviyenin altındaysa şunları yap burada bitti 
   
  // ısı ayarlanan seviyenin üstündeyse şunları yap burada başladı
  else 
  {
  digitalWrite(isitici, LOW);   // ısıtıcıyı kapat
  }
  // ısı ayarlanan seviyenin üstündeyse şunları yap burada bitti

  Serial.print("Sicaklik: "); // seri port ekranına sıcaklık yazıldı
  Serial.print(t);  // seri port ekranına sıcaklık derecesi yazıldı
  Serial.println(" *C "); // seri port ekranına *C yazıldı

  Serial.print("Ayar: "); // seri port ekranına Ayar yazıldı
  Serial.print(ayarlanan_sicaklik); // seri port ekranına potansiyometre ile ayarlanan sıcaklık değeri yazıldı
  Serial.println(" *C "); // seri port ekranına *C yazıldı

  dakikaValue = analogRead(dakikaPin);  // dakika ayar potundaki voltaj okundu
  dakika= map(dakikaValue, 0, 1023, 0, 30); // Okunan voltaj 0 - 30 arası milisaniyeye dönüştürüldü
  Serial.print("Sure: "); // seri port ekranına süre yazıldı
  Serial.print(dakika);  // seri port ekranına hesaplanan dakika yazıldı
  Serial.println(" dakika "); // seri port ekranına dakika yazıldı
  }
  }

Saat resimine ait kodlar:
Kod:
#include <avr/pgmspace.h>
const unsigned char saat [] PROGMEM={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x60, 0x30, 0x10, 0x18, 0x08, 0x0C, 0x0C,
0x04, 0x04, 0xE6, 0xE6, 0x06, 0x06, 0x04, 0x04, 0x04, 0x0C, 0x0C, 0x08, 0x18, 0x10, 0x30, 0x60,
0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x1C, 0x07, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x38, 0xE0, 0x80, 0x00,
0x00, 0x7C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
0xC0, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0x00, 0x00, 0x00, 0x07, 0x1E, 0x70, 0xC0, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x38, 0x0F, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x0C, 0x0C, 0x18, 0x10, 0x30, 0x20, 0x60, 0x60,
0x40, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x40, 0x40, 0x60, 0x60, 0x20, 0x30, 0x10, 0x18, 0x0C,
0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
};

Termometre resimine ait kodlar:
Kod:
#include <avr/pgmspace.h>
const unsigned char termometre [] PROGMEM={
0x00, 0x00, 0x00, 0x20, 0x70, 0x20, 0x00, 0x00, 0xFC, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x06,
0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xCE, 0x84, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x39, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x60, 0x20, 0x10,
0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x20, 0x60, 0xC0, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xF8, 0xFC, 0xFE, 0xFF, 0xFE, 0xFC, 0xF8,
0x70, 0x00, 0x00, 0x00, 0x01, 0x8F, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0C, 0x18, 0x10, 0x20,
0x60, 0x40, 0x41, 0x43, 0x43, 0x43, 0x41, 0x60, 0x20, 0x20, 0x10, 0x18, 0x0E, 0x03, 0x00, 0x00
};
 

Ekli dosyalar

  • termostat.rar
    447.5 KB · Görüntüleme: 5
  • DHT-sensor-library-master.zip
    7 KB · Görüntüleme: 4
Emeğiniz için tebrikler
Paylasiminiz için teşekkürler


aydinDr
 
Paylaşım için teşekkürler, bende yakın zamanda kendime arduino set aldım, netteki programlardan gördüğüm kadarıyla kopyala yapıştır denemeler yapıyorum fakat, bazı konuları bulamıyorum. Mesela sizin mevcut konunuzdaki temometrenin negatif değerlerinin okunması gibi, elimde lm35, 100k ntc, 5k ptc var bu elemanlar veya başka eleman kullanarak arduinoya negatif sıcaklık nasıl okutabilirim? yapdımcı olur musunuz?
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…