
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.
//Bu kodu ds18b20.c olarak kaydediniz
// (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ı:
#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;) } }

Erhan Kas 11, 2008
Merhaba ben aynı uygulamayı yaptım. Yalnız şöyle bir problem var
Simulasyonda çalışıyor ama derece olarak 187 derece gibi gösteriyor. Sebebi ne olabilir.
oguz Ara 17, 2008
bekleme zamani ds18b20 icin yetereli degil kataloguna bakarsaniz 8 bit cozunurluk icin en az 750 ms bekleme suresi gerektigini gorursunuz. bence 187 gostermesnin sebebi budur.
Ali Oca 5, 2009
örnek programda hatalar var include satırı boş bırakılmış
#include
#include
şeklinde olmalı
ayrıca keslemer karakter hatası veriyor ” ÅŸeklinde deÄŸiÅŸtirin
en sondaki bekleme satırınıda noktalı virgülü parantez den sonra koyup derleyebilirsiniz
alttaki satırıda görüldüğü şekilde düzeltin 187 yi 18.7 göreceksiniz
temperature = ds1820_read()/10,0; yapınız
osman Åžub 23, 2009
iki tane DS18B20 den değer alacaksak program nasıl olmalıdır..
admin Åžub 23, 2009
http://www.ccsinfo.com/forum/viewtopic.php?t=37746&postdays=0&postorder=asc&highlight=ds18b20&start=0
birden fazla kullanacaksan aynı hat üstünden sensörün içindeki numaraya göre bilgi göndermen gerekecektir bu da işleri oldukça karıştırmakta.
Eğer sadece iki tane kullanacaksan ve hafıza prolemin yoksa aynı fonksiyonları isimlerini değiştirerek kopyala ve sensöre farklı bir pin ata bence daha kolay olur
Nur Nis 7, 2009
Merhaba benim anlamadığım DS18B20′yi hangi pine baÄŸlayarak iletiÅŸim saÄŸladığımız. (pic16f877 için)
admin Nis 7, 2009
programda ilk başta aşağıdaki satır yer almakta
#define ONE_WIRE_PIN PIN_C7
burada pin_c7 yerine istediÄŸinizi kullanabilirsiniz
Nur Nis 7, 2009
Bende 0.5 göstermesinin sebebi ne olabilir acaba?
admin Nis 7, 2009
sonuçmu 0.5 derece gözüküyor?
aşağıdaki örneği inceleyiniz
http://ccspic.com/projeler/ds18b20-ve-ds1302-ile-lcd-termometre-saat.html
Ali Gökşin Haz 14, 2009
ds18b20.c sürücü programında yapılan hata:
sensorun kataloğu incelendiğinde, temp1 yazmacının LSB tarafındaki 4 bitinin sıcaklık değerinin ondalık kısmına karşılık geldiği görülür. Ancak, temp1 ve temp2 int8 olarak tanımlandığından;
temp3=make16(temp2,temp1); satırında temp1′in LSB 4biti tam sayı deÄŸermiÅŸ gibi temp3′e aktarılır. Bu da temp3′ün olması gereken deÄŸerden 16 kat fazla olduÄŸu anlamına gelir(yani 2′nin 4. kuvveti kadar). Bu problemin düzeltilmesi için sürücü kodunda
result = (float) temp3 / 2.0; satırının yerine
result = (float) temp3 / 16.0; yazılmalı ve
uygulama programındaki
temperature = ds1820_read(); satırında herhangi bir manipülasyon yapılmamalıdır.
Aksi takdirde, 16 ya bölünmesi gereken deÄŸerin sürücüde 2′ye bölünüp uygulama programında tekrar 10′a bölünerek, toplam 20′ye bölünmesi ile sıcaklık deÄŸeri olması gerekenden eksik okunacaktır.
Ali Gökşin
Elektronik Müh.