Not 21: DS18B20 1-Wire Sıcaklık Sensörü

Yayınlandı: 27 Mayıs 2013 / Microchip PIC Programlama...
Etiketler:, , , , , , , , , , ,

1-wds18b20ire Dallas (Maxim) firmasının geliştirmiş olduğu datanın tek hat üzerinden gönderilip alındığı bir iletişim protokolüdür. Bu protokolde veri iletişimi sağlamak için tek kablo gerekmektedir.  DS18B20 sensörü  bu firmanın geliştirmiş olduğu tek hat üzerinden sıcaklık bilgisi gönderen bir sensördür. Bu sensörün datasheetine buradan ulaşabilirsiniz.

Tek hat iletişimin özelliklerinden birisi , tek hat üzerine birden fazla sensörün bağlanabilmesidir. Böylece birden fazla kabloya ve pine ihtiyaç duymadan bir çok sensörü okuyabiliriz. Bunu sağlamak için üretici firma her sensöre benzersiz 64 bitlik bir kimlik tanımlar. Biz ilk olarak okuyacağımız sensöre ait olan kimlik bilgisini gönderir ve diğer sensörlerin iletişime dahil olmasını engelleriz. Bir nevi telefon numarası çevirmeye benzeyen bir olaydır bu.

Biz bu uygulamamızda tek sensör kullanacağımız için  bu kimlik bilgisini kullanmayacağız.

Sensörümüzden sıcaklık bilgisini okumak istediğimizde ilk olarak bize ıswı bilgisinin yüksek değerlikli 8 bitini daha sonra sıcaklık bilgisinin düşük değerlikli 8 bitini göndermektedir.

Sensörümüzün kataloğunu  biraz karıştırırsak , sıcaklık bilgisinin 16 bitlik bir veri olduğunu görürüz. Bu 16 bitlik verinin 15,14,13,12 ve 11. bitleri işaret bilgisini içerir. Bu yüksek değerlikli 5 bit “0” ise sıcaklık pozitiftir. Eğer bu 5 bit “1” değerini almış ise sıcaklık bilgisi negatif demektir. Negatif sayılarla çalışmak bazen kafa karıştırıcı olabilir. Bizim burada yapmamız gereken şey sıcaklık bilgisini signed integer olarak tanımlamamız gerektiğidir. Bulduğumuz sıcaklık değerini 0.0625 değerine bölersek gerçek sıcaklık değerimiz ortaya çıkar. Yani formülümüz:

Isı= (MSB+LSB)*0.0625

Adsız

Burada anlatmak istediğim asıl konu 1 wire iletişim olduğu için ds18b20 sensörüne daha fazla değinmeyeceğim. Bu sensör ile ilgili detaylı bilgiyi buradan bulabilirsiniz.

Devre şemamıza bakacak olur isek gayet sade olduğunu görebiliriz.

Adsız

Büyütmek için tıklayın.

Kodlarımızı inceleyelim:

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

int tempmsb, templsb;
float isi;
char txt[15];

void main() {
cmcon=7;
trisb=0;
portb=0;
lcd_init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);

//--- Main loop
do {
//--- Perform temperature reading
Ow_Reset(&PORTA, 0);                         // Onewire reset signal
Ow_Write(&PORTA, 0, 0xCC);                   // SKIP_ROM Komutu
Ow_Write(&PORTA, 0, 0x44);                   // CONVERT_T Komutu

Delay_ms(750);   //Dönüşüm için bekleniyor.

Ow_Reset(&PORTA, 0);
Ow_Write(&PORTA, 0, 0xCC);                   // SKIP_ROM Komutu
Ow_Write(&PORTA, 0, 0xBE);                   // READ_SCRATCHPAD Komutu

templsb =  Ow_Read(&PORTA, 0); // lsb'yi oku
tempmsb =  Ow_Read(&PORTA, 0); //msb'yi oku

isi=((tempmsb<<8)+templsb)*0.0625;// sıcaklığı hesapla
floattostr(isi,txt); //isi değerini stringe dönüştür
lcd_cmd(_LCD_CLEAR); // lcd'yi temizle
lcd_out(1,1,"ISI=");
lcd_out(1,5,txt);
lcd_chr_cp(223); //derece işareti
lcd_chr_cp('C');
} while (1);
}

Bu proje ile ilgili bütün dosyalara buradan ulaşabilirsiniz.

Devamı gelecek..

yorum
  1. Fatih ASLAN dedi ki:

    Program için teşekkürler lakin ;
    Bu sensörde CRC ve Alarm kurulumu nasıl olmaktadır ? Datashetten baktım birşey anlamadım.
    Ayrıca bu sensörde diyelim ki kullanıcı bir sıcaklık set değeri girdiğinde bu sıcaklığa geldiğinde buzzer veya röle gibi işlemleri yaptırmak için soruyorum.işte if(sıcaklık=25 || sıcaklık=27) derece gibi değilde sensörün alarm özelliğinden nasıl yararlanabiliriz.

  2. sedat dedi ki:

    Hocam nerdesin öldün mü kaldın mı bir haber et 😀

    • mikrodunya dedi ki:

      Bu aralar hiçbir zaman olmadığım kadar yoğunum. Bu sebeple yazı yayınlayamıyorum. Kurban bayramından sonraki süreçte yeni yazılar yayınlayacağım.
      Saygılar.

  3. Murat dedi ki:

    Hocam elinize sağlık öncelikle. Acaba bu 1-wire ile i-button kullanımı hakkında bir örnek var mı elinizde? Benim elimde ds1990a modeli i-buttonlar var ama bir türlü içindeki kimlik bilgisini okuyamıyorum. Yardımcı olursanız sevinirim.

  4. gökçe dedi ki:

    tek hatta iki tane sıcaklık sensoru bağlarsak nasıl olcak acaba yardım ederseniz çok sevinirim:)

    • mikrodunya dedi ki:

      Datasheet sorduğunuz sorunun cevabını içeriyor. ROM sensörün kimlik bilgisini içeriyor. Bu bilgiyi okuyarak farklı sensörlere ulaşmanız mümkün.

  5. bekes adam dedi ki:

    Bu sıcaklı bilgisini RF modülü ile göndermek istersem ne yapmalıyım? Bildiğim kadarıyla modül ile karakter gönderiliyor o da 8 bit burda ise 16 bit gönderiliyor

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s