Merhaba arkadaşlar.Bu yazımızda arduino ile lcd göstergeli termostat yapımından bahsedeceğiz. Termostat nedir ve nasıl çalışır gibi bilgiler daha önce sitede yayınlandığı için biz direk imalata geçebiliriz. 🙂 Öncelikle bu devrede kullanmamız gereken malzemeler:
1 adet Arduino Diecimila
3 adet 100K, 1 adet 33K,1 adet 270 1 adet 1K, ve 1 adet 100 ohm direnç
1 adet 33 K thermistor beta = 4090
1 adet 5-mm kırmızı led
1 adet 1N4004 diyot
1 adet BC548 transistör
1 adet 5V röle
1 adet HD44780 lcd gösterge
1 adet rotary encoder (dönel ölçüm yapan cihaz)
1 adet breadboard
Evet. Malzemelerimiz hazır olduğuna göre devreyi kurabiliriz.

Adsız

Devrede görüldüğü üzere 5 voltluk bir kaynaka lcd yi , enkoderi ,termistörü ve birbirine paralel olan diyot ve röleyi beslemektedir. Devrede bu voltaj arduino dan alınmıştır. Fakat harici bir güç kaynağı da kullanılabilir.

Adsız

Burada görüldüğü gibi ortam sıcaklığı 14 derece olarak okunuyor ve termostatın 20 dereceye ayarlandığı görülüyor. Yani sıcaklık 20 derece olduğunda termostat röleye akım gönderecek ve röle sistemi kapatacaktır. Termostatın kaç derecede sitemi kapatacağı ise enkoder dediğimiz parça ile, 0.25 derecelik hassasiyetle ayarlanabilir.

Adsız

Bu grafik bize sitemin hangi değerler arasında on-off olduğunu gösterir.

Şimdi son aolarak arduino kodunu sizinle paylaşacağım.

 

 

 

#include <LiquidCrystal.h>
#define beta 4090 // from your thermistor's datasheet
#define resistance 33
// LiquidCrystal display with:
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4-7 on pins 5-2
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int ledPin = 15;
int relayPin = 16;
int aPin = 8;
int bPin = 7;
int buttonPin = 6;
int analogPin = 0;
float setTemp = 20.0;
float measuredTemp;
char mode = 'C'; // can be changed to F

boolean override = false;
float hysteresis = 0.25;
void setup()
{
lcd.begin(2, 20);
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(aPin, INPUT);
pinMode(bPin, INPUT);
pinMode(buttonPin, INPUT);
lcd.clear();
}
void loop()
{
static int count = 0;
measuredTemp = readTemp();
if (digitalRead(buttonPin))
{
override = ! override;
updateDisplay();
delay(500); // debounce
}
int change = getEncoderTurn();
setTemp = setTemp + change * 0.1;
if (count == 1000)
{
updateDisplay();
updateOutputs();
count = 0;
}
count ++;
}
int getEncoderTurn()
{
// return -1, 0, or +1
static int oldA = LOW;
static int oldB = LOW;
int result = 0;
int newA = digitalRead(aPin);
int newB = digitalRead(bPin);
if (newA != oldA || newB != oldB)
{
// something has changed
if (oldA == LOW && newA == HIGH)

{
result = -(oldB * 2 - 1);
}
}
oldA = newA;
oldB = newB;
return result;
}
float readTemp()
{
long a = analogRead(analogPin);
float temp = beta / (log(((1025.0 * resistance / a) - 33.0) / 33.0) +
(beta / 298.0)) - 273.0;
return temp;
}
void updateOutputs()
{
if (override || measuredTemp < setTemp - hysteresis)
{
digitalWrite(ledPin, HIGH);
digitalWrite(relayPin, HIGH);
}
else if (!override && measuredTemp > setTemp + hysteresis)
{
digitalWrite(ledPin, LOW);
digitalWrite(relayPin, LOW);
}
}
void updateDisplay()
{
lcd.setCursor(0,0);
lcd.print("Actual: ");
lcd.print(adjustUnits(measuredTemp));
lcd.print(" o");
lcd.print(mode);
lcd.print(" ");
lcd.setCursor(0,1);
if (override)
{
lcd.print(" OVERRIDE ON ");
}
else

{
lcd.print("Set: ");
lcd.print(adjustUnits(setTemp));
lcd.print(" o");
lcd.print(mode);
lcd.print(" ");
}
}
float adjustUnits(float temp)
{
if (mode == 'C')
{
return temp;
}
else
{
return (temp * 9) / 5 + 32;
}
}

 

 

Bütün arkadaşlara teşekkürlerimi sunuyorum. İyi çalışmalar.

Source : 30 Arduino™

Projects for
the Evil Genius™
Simon Monk
New York Chicago San Francisco Lisbon London Madrid
Mexico City Milan New Delhi San Juan Seoul
Singapore Sydney

2 YORUMLAR

  1. öncelikle çok güzel bi paylaşım bende yapmayı düşünüyorum ama bi sorum olacak arduino uno var elimde bu kodlar uno da sorunsuz çalışır değilmi ve devrenin pcb baskı şenasını paylaşırmısımız