Otomatik Ortam Sıcaklığı Kontrol Sistemi
Proje Hakkında
Sistem, insan müdahalesi olmadan belirli bir alanın sıcaklığını izleme ve kontrol etme yeteneğine sahiptir. Birincil amacı, sistem ayarlarını bir kullanıcının belirlediği değerlere göre belirli bir alanın sıcaklığını düzenlemektir.
Proje, bir alanın sıcaklığını otomatik olarak kontrol etmek için bir mikrodenetleyici (PIC18F46K22) kullanmaktadır. Bu alan, kontrollü bir sıcaklık gerektiren küçük bir bitki, bir ev veya herhangi bir cihaz olabilir.
İstenilen sıcaklık ayarı bir keypad kullanılarak girilmektedir. Alanın sıcaklığı, analog bir sıcaklık sensörü (LM35) kullanılarak ölçülmektedir. Mikrodenetleyici sürekli olarak sıcaklığı okur ve istenen değerle karşılaştırır. İstenilen değer, ölçülen değerden yüksekse, ısıtıcı alanı ısıtmak için açılır. İstenilen sıcaklığa ulaşıldığında ısıtıcı kapatılır. Öte yandan, ölçülen değer istenen değerden yüksekse, istenen sıcaklığa ulaşılana kadar alanı soğutmak için fan devreye girer. Sıcaklık 40°C veya daha yüksek bir kritik değere ulaşırsa, sesli uyarı sürekli olarak çalacak ve sıcaklık 40°C’nin altına düşene kadar bir LED yanıp sönecektir. LCD ekran sürekli olarak ölçülen sıcaklığı gösterecektir.
Cihaz çalışmaya başladığında, PIC dahili EEPROM’dan referans sıcaklığını okuyacak ve kayıtlı bir değer yoksa kullanıcıdan yeni bir referans sıcaklığı girmesini isteyecektir. PIC bu değeri dahili EEPROM’a kaydettiği için sistem tekrar başladığında önceki girilen referans sıcaklığı aynı kalacaktır. Yeni bir referans sıcaklığı ayarlamak istendiğinde, kurulum menüsüne tekrar erişmek için ‘*’ tuşuna 3 saniye basılı tutulması gerekmektedir. Tamam için ise ‘#’ tuşuna basılması gerekir.
Proteus simülasyon kaynak dosyasını buradan edinebilirsiniz.
Simülasyon
Gerekli Kodlar
Kodlarda fazlasıyla yorum göreceksiniz. Anlaşılır olacaktır.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// keypad bağlantı portu tanımı
char keypadport at portc;
// lcd pinleri için bit tanımlamaları
sbit lcd_rs at rb4_bit;
sbit lcd_en at rb5_bit;
sbit lcd_d7 at rb3_bit;
sbit lcd_d6 at rb2_bit;
sbit lcd_d5 at rb1_bit;
sbit lcd_d4 at rb0_bit;
// lcd pinlerinin yönlendirilmesi
sbit lcd_rs_direction at trisb4_bit;
sbit lcd_en_direction at trisb5_bit;
sbit lcd_d7_direction at trisb3_bit;
sbit lcd_d6_direction at trisb2_bit;
sbit lcd_d5_direction at trisb1_bit;
sbit lcd_d4_direction at trisb0_bit;
// tanımlamalar
#define heater portd.rd0
#define fan portd.rd1
#define led portd.rd3
#define enter 15
#define clear 13
#define on 1
#define off 0
void main() {
unsigned short kp,txt[14]; // keypad'den okunan değeri saklayacak değişken
unsigned int temp_ref; // kullanıcının ayarladığı referans sıcaklık değeri
unsigned char intemp; // lcd ekranında gösterilecek sıcaklık değeri
unsigned int temp; // adc'den okunan ham sıcaklık değeri
float mv, actualtemp; // mv cinsinden gerçek sıcaklık değeri
osccon=0x76; // osilatör frekansını 8mhz olarak ayarlar
anselb=0; // portb pinlerini dijital giriş/çıkış olarak ayarlar
anselc=0; // portc pinlerini dijital giriş/çıkış olarak ayarlar
anseld=0; // portd pinlerini dijital giriş/çıkış olarak ayarlar
trisa=0x01; // porta'nın ra0 pinini analog giriş olarak ayarlar
trisb=0; // portb pinlerini çıkış olarak ayarlar (lcd için)
trisd0_bit=0; // portd'nin rd0 pinini çıkış olarak ayarlar (heater için)
trisd1_bit=0; // portd'nin rd1 pinini çıkış olarak ayarlar (fan için)
trisd3_bit=0; // portd'nin rd3 pinini çıkış olarak ayarlar (led için)
trisd3_bit=0; // portd'nin rd3 pinini çıkış olarak ayarlar (kullanılmıyor)
latc.b3=0; // rc3 pinini düşük seviyeye çeker
keypad_init(); // keypad modülünü başlatır
lcd_init(); // lcd modülünü başlatır
sound_init(&portd,2); // ses modülünü rd2 pininde başlatır
lcd_cmd(_lcd_clear); // lcd ekranını temizler
lcd_cmd(_lcd_cursor_off); // lcd imlecini gizler
lcd_out(1,4,"automatic"); // lcd'nin 1. satırına "automatic" yazar
lcd_out(2,2,"temp control"); // lcd'nin 2. satırına "temp control" yazar
lcd_out(3,1,"mesleki"); // lcd'nin 3. satırına "mesleki" yazar
lcd_out(4,1,"uygulama1"); // lcd'nin 4. satırına "uygulama1" yazar
delay_ms(2000); // 2 saniye bekler
heater=off; // isıtıcıyı kapalı duruma getirir
fan=off; // fanı kapalı duruma getirir
temp_ref=eeprom_read(0x2); // eeprom'un 2. adresinden referans sıcaklığını okur
if((temp_ref>0)&(temp_ref<100)){ // referans sıcaklık 0'dan büyük ve 100'den küçükse
goto start_program; // start_program etiketine atlar
}
else{
start:
lcd_cmd(_lcd_clear); // lcd ekranını temizler
lcd_out(1,1,"enter temp ref"); // lcd'ye kullanıcıdan referans sıcaklık girmesini ister
temp_ref=0; // referans sıcaklık değerini sıfırlar
lcd_out(2,1,"temp ref: "); // lcd'nin 2. satırına "temp ref: " yazar
while(1){ // kullanıcıdan giriş alınana kadar döngüye devam eder
// yeni referans sıcaklığı değeri
do
kp=keypad_key_click(); // keypad'den tuş değeri okur
while(!kp); // bir tuşa basılana kadar döngü devam eder
if (kp==enter)break; // enter tuşuna basıldıysa döngüyü kırar
if (kp>3 && kp<8) kp=kp-1;
if (kp>8 && kp<12) kp=kp-2;
if (kp==14) kp=0;
if (kp==clear) goto start; // clear tuşuna basıldıysa start etiketine gider
lcd_chr_cp(kp+'0'); // girilen rakamı lcd ekranında gösterir
temp_ref=(10*temp_ref)+kp; // girilen yeni rakamı referans sıcaklık değerine ekler
}
}
lcd_cmd(_lcd_clear); // lcd ekranını temizler
lcd_out(1,1,"temp ref: "); // lcd'nin 1. satırına "temp ref: " yazar
inttostr(temp_ref,txt); // temp_ref değerini string'e çevirir
intemp=ltrim(txt); // sol boşlukları temizler
lcd_out_cp(intemp); // temizlenmiş string'i lcd'de gösterir
eeprom_write(0x02,temp_ref); // girilen referans sıcaklığı eeprom'un 2. adresine yazar
lcd_out(2,1,"press # to cont."); // kullanıcıya devam etmek için # tuşuna basmasını söyler
// # tuşuna basılana kadar bekle
kp =0;
while(kp!=enter){
do
kp=keypad_key_click(); // keypad'den tuş değeri okur
while(!kp); // bir tuşa basılana kadar döngü devam eder
}
start_program:
lcd_cmd(_lcd_clear); // lcd ekranını temizler
lcd_out(1,1,"temp ref: "); // lcd'nin 1. satırına "temp ref: " yazar
lcd_chr(1,15,223); // lcd'ye derece simgesi yazar
lcd_chr(1,16,'c'); // lcd'ye 'c' (celsius) harfini yazar
// program döngüsü
while(1) {
// referans sıcaklığı ve gerçek sıcaklığı görüntüleme
temp=adc_read(0); // an0'dan sıcaklığı oku
mv=temp*5000.0/1023.0; // mv'a dönüştür
actualtemp=mv/10.0; // dereceyi celsius'a dönüştür
inttostr(temp_ref,txt); // referans sıcaklık değerini stringe çevir
intemp=ltrim(txt); // stringin solundaki boşlukları temizle
lcd_out(1,1,"temp ref: "); // lcd'nin 1. satırına 'temp ref: ' yaz
lcd_out(1,11,intemp); // lcd'nin 1. satırına referans sıcaklık değerini yaz
floattostr(actualtemp,txt); // gerçek sıcaklık değerini stringe çevir
txt[4]=0; // stringin 4. karakterini null yap (belki bir temizlik amaçlı)
lcd_out(2,7,txt); // lcd'nin 2. satırına gerçek sıcaklık değerini yaz
lcd_out(2,12," "); // lcd'nin 2. satırına boşluk bırak
// referans sıcaklık ile gerçek sıcaklığın karşılaştırılması
if(temp_ref>actualtemp){
heater=on; // referans sıcaklık gerçek sıcaklıktan yüksekse ısıtıcıyı aç
fan=off; // fanı kapat
}
if(temp_ref<actualtemp){
heater=off; // referans sıcaklık gerçek sıcaklıktan düşükse ısıtıcıyı kapat
fan=on; // fanı aç
}
if(temp_ref==actualtemp){
heater = off; // referans sıcaklık gerçek sıcaklıkla aynıysa ısıtıcıyı kapat
fan = off; // fanı kapat
}
// * tuşuna basılıp basılmadığına kontrol et
kp=keypad_key_press(); // keypad'den tuş değeri oku
if(kp==clear){
delay_ms(3000); // 3 saniye bekle
kp=keypad_key_press(); // keypad'den tuş değeri tekrar oku
if(kp==clear){
goto start; // clear tuşuna basıldıysa start'a git
}}
// buzzer kontrolü
if (actualtemp>=40){
sound_play(880,300); // sıcaklık 40°c veya üzerindeyse ses çal
led=~led; // led'i yanıp söndür
delay_ms(200); // 200 ms bekle
}
else{
led = off; // değilse led'i kapat
}
}
}