Maxim/Dallas firması tarafından üretilen DS18B20 sıcaklık algılayıcısı en fazla 0.5 derecelik hata ile -55 ile +125 dereceler arası ölçüm yapabilmekte ve sıcaklık bilgisini sayısal olarak vermektedir. DS18B20 gibi sayısal çıkış veren sıcaklık algılayıcılarının kullanımı ile analog/sayısal dönüştürücü kullanımına gerek kalmamaktadır.
Ayrıca parazit besleme özelliği sayesinde harici besleme kaynağına gerek almadan sıcaklık bilgisi okunabilmektedir. Sensörün Pic’e bağlantısı apılırken yapılacak tek şey DQ data hattına 4.7 k’lık bir pull up direnciyle +5 volta bağlanması olacaktır. Aşağıda verilen sürücü programı devrede sadece bir Ds18B20 varken çalışacaktır. Ayrıca buradan kablosuz sıcaklık ölçümünün nasıl yapılacağına dair bilgi edinebileceğiniz dökümana ulaşabilirsiniz.
class="prettyprint"> | |
align="justify">//Bu kodu ds18b20.c olarak kaydediniz | |
align="justify">// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org | |
#define ONE_WIRE_PIN PIN_C7 | |
void onewire_reset() | |
{ | |
output_low(ONE_WIRE_PIN); | |
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir | |
output_float(ONE_WIRE_PIN); //1-wire bir yapılır | |
delay_us( 500 ); // sensörün hazırlanması için beklenir. | |
output_float(ONE_WIRE_PIN); | |
} | |
void onewire_write(int data) | |
{ | |
int count; | |
for (count=0; count<8; ++count) | |
{ | |
output_low(ONE_WIRE_PIN); | |
delay_us( 2 ); // Sensöre yazma işlemine başlamak için 1-wire sıfıra çekilir. | |
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da | |
delay_us( 60 ); // Yazma işlemi zamanı doldurulur. | |
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır, | |
delay_us( 2 ); // 1us'den fazla beklenir. | |
} | |
} | |
int onewire_read() | |
{ | |
int count, data; | |
for (count=0; count<8; ++count) | |
{ | |
output_low(ONE_WIRE_PIN); | |
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir. | |
output_float(ONE_WIRE_PIN); //1-wire bir yapılır, | |
delay_us( 8 ); // Sensörün kendine gelmesi beklenir, | |
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır. | |
delay_us( 120 ); //Okuma işlemi zamanı doldurulur. | |
} | |
return( data ); | |
} | |
float ds1820_read() | |
{ | |
int8 busy=0, temp1, temp2; | |
signed int16 temp3; | |
float result; | |
onewire_reset(); | |
onewire_write(0xCC); | |
onewire_write(0x44); | |
while (busy == 0) | |
busy = onewire_read(); | |
onewire_reset(); | |
onewire_write(0xCC); | |
onewire_write(0xBE); | |
temp1 = onewire_read(); | |
temp2 = onewire_read(); | |
temp3 = make16(temp2, temp1); | |
result = (float) temp3 / 2.0; | |
delay_ms(200); | |
return(result); | |
} | |
Örnek uygulama Progamı: | |
class="prettyprint"> | |
#include <16F877A.h> | |
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT | |
#use delay(clock=4000000) | |
#include | |
#include | |
void main() | |
{ | |
float temperature; | |
setup_adc_ports(NO_ANALOGS); | |
setup_adc(ADC_OFF); | |
setup_psp(PSP_DISABLED); | |
setup_spi(FALSE); | |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); | |
setup_timer_1(T1_DISABLED); | |
setup_timer_2(T2_DISABLED,0,1); | |
setup_comparator(NC_NC_NC_NC); | |
lcd_init(); | |
lcd_putc(”\f”); | |
while (1) | |
{ | |
temperature = ds1820_read(); | |
printf(lcd_putc,”Sicaklik:\n %3.1f derece”, temperature); | |
delay_ms(250;) | |
} | |
} |
Hiç yorum yok:
Yorum Gönder