DS18B20 Sensörünün Alarm Özelliğini Kullanma

DS18B20 sensörü sıcaklık ölçümü yanında alarm özelliğine de sahiptir. Alarm özelliği kullanılarak termostat olarak kullanılabilir.

Alarm sınır değerleri EEPROM’a yazılarak elektrik kesintilerinden etkilenmesi önlenebilir.

Bu uygulamamızda LCD displayde sıcaklık değerini görüntüleyip alarm durumunu kontrol edeceğiz. Alarm durumunda alarm ledini yakacağız.

Bu uygulamada insan vücut ısını ölçmek için kullanılan DS18B20 sensörünün alarm sınırlarını Max değer (TH) 37 derece üstü, Vucut ısısının min değeri (TL) 35 derecenin altına indiğinde olarak belirliyeceğiz.

Uygulamanın algoritması söyle;

Program başladığında EEPROM okunarak TH ve TL değerleri kayıtlı olup olmadığına bakılacak. Eğer yazılmadıysa  alarm değerleri yazılacak ve Dahili hafızasına kopyalanacak. Yazılmışsa okuyarak dahili hafızaya transfer edecek.

Sensör alarm değerlerini otomatik olarak kontrol etmektedir. Sınırlar dışına çıkıldığında alarm bayrağı sıfırlanmaktadır (“0”). Program alarm bayrağını okuyup ona göre LED’in durumunu belirlemektedir. Alarm oluşmuşsa led yanmakta oluşmamışsa sönük durumdadır.

 Alarm Kurulumu

DS18B20 sıcaklık ölçüp, dönüşümü tamamladıktan sonra sıcaklık değeri TH ve TL kaydedicisindeki değerler ile karşılaştırılır. TH ve TL kaydedicisinin yapısı aşağıdaki gibidir.

ds18b20sicaklikTHTL

Şekil 1: TH ve TL kaydedicileri yapısı

7 bitlik sayısal bir değer ve sıcaklığın işareti içinde bir bit ayrılmıştır. S olarak gösterilen 7.bit eğer 1 ise sıcaklık negatif, 0 ise sıcaklık pozitif anlamına gelir. TH ve TL kaydedicisi kalıcı EEPROM bellek olduğundan enerji kesildiğinde silinmezler. Ölçülen sıcaklık değeri TH kaydedicisindeki sıcaklık değerine eşit ya da yüksek veya TL kaydedicisindeki değere eşit ya da yüksek ise DS18B20 içerisindeki alarm bayrağı set edilir. Alarm bayrağı her sıcaklık ölçümünden sonra güncellenir. Eğer set edilen bir bayraktan sonra tekrar sıcaklık değeri ölçüldüğünde sıcaklık değeri alarm seviyesinin üzerinde değilse bayrak yeniden 0 yapılır.

Alarmı kurmak için Write Scratchpad[4Eh] komutu kullanılır. Bu komuttan sonra TH, TL ve konfigürasyon byte’ları sırası ile yollanır. Bu yollanan veriler sırasıyla DS18B20’nin TH, TL ve konfigürasyon kaydedicilerine kaydedilir.


 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0x4E); // alarm yaz
 Ow_Write(&PORTB,7,0x25); // alarm TH
 Ow_Write(&PORTB,7,0x23); // alarm TL
 Ow_Write(&PORTB,7,0x7F); // config byte yaz 12-bit

Kurulan alarm sensörün hafızasına alınmıştır ancak EEPROM’a kaydedilmemiştir. Elektrik kesintisinde kaybolacaktır. EEPROM’a yazmak için COPY SCRATCHPAD [48h] komutu kullanılır.


 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0x48); // TH ve TL 'yi ve konfigurasyonu  EEPROM'a yaz

Sensöre elektrik verildiğinde otomatik olarak EEPROM hafızadaki TH, TL ve Konfig değerleri dahili hafızaya kopyalanır. Ayrıca alarmı EEPROM’dan dahili hafıya copyalamak için de RECALL E2 [B8h] komutu kullanılır.


Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
Ow_Write(&PORTB,7,0xB8); // TH ve TL 'yi ve konfigurasyonu  EEPROM'dan  dahili hafızaya yaz

Alarm durumu Alarm Search [ECh] komutu ile kontrol edilir.


 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xEC); // alarm oku komutu gönder
 alarm = Ow_Read(&PORTB,7); // alarm bilgisini al

Alarm bayrağı alarm değişkeninin 0.bitidir. Bu bit eğer “1” ise alarm yok, “0” ise alarm var demektir.

Proje devre şeması aşağıdadır.

LcdTermometre_Termostat

mikroC program kodları aşağıdadır.

</pre>
#define LED PORTA.B4
// Lcd pinout settings
sbit LCD_RS at RA6_bit;
sbit LCD_EN at RA7_bit;
sbit LCD_D7 at RA3_bit;
sbit LCD_D6 at RA2_bit;
sbit LCD_D5 at RA1_bit;
sbit LCD_D4 at RA0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISA6_bit;
sbit LCD_EN_Direction at TRISA7_bit;
sbit LCD_D7_Direction at TRISA3_bit;
sbit LCD_D6_Direction at TRISA2_bit;
sbit LCD_D5_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISA0_bit;
//--------------------
bit isaret;
unsigned char isiTam=0,derece[11],txt[6],alarm,alarm_TH=0,alarm_TL=0;
short isi_TH=0,isi_TL;
unsigned int isi=0,isiOndalik;
//-----------------------
void alarmYaz()
{
 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0x4E); // alarm yaz
 Ow_Write(&PORTB,7,0x25); // alarm TH
 Ow_Write(&PORTB,7,0x23); // alarm TL
 Ow_Write(&PORTB,7,0x7F); // config byte yaz 12-bit
 Delay_us(120); // 120usaniye bekle
 //-------------------------------
 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0x48); // TH, TL ve config'i EEPROM'a yaz
}
//-----------------------------------------------------------
void isiOku()
{
 char lsb, msb;
 //---------------------
 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0x44); // CONVERT_T, Sıcaklık dönüşümü başlat
 Delay_us(120); // 120usaniye bekle
 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xCC); // SKIP_ROM , ROM bilgisini atla
 Ow_Write(&PORTB,7,0xBE); // READ_SCRATCHPAD, ısı hafızayı oku
 lsb = Ow_Read(&PORTB,7); // LSB yi al
 msb = Ow_Read(&PORTB,7); // MSB'yi al
 alarm_TH=Ow_Read(&PORTB,7); // TH'yi al
 alarm_TL=Ow_Read(&PORTB,7); // TL'yi al
 //---------------------------
 Ow_Reset(&PORTB,7); // Onewire reset sinyali gönder
 Ow_Write(&PORTB,7,0xEC); // alarm oku
 alarm = Ow_Read(&PORTB,7); // alarm durumunu al
 //---------------------------
 isi=(msb<<8)+lsb; // int tipi isi ham verisi
 if(isi&0x8000)
 {
 isaret=1; // sıcaklık negatif
 isi=~isi+1;
 }
 else isaret=0;
 isiTam=(isi&0x0FFF)>>4; // isinin tam kısmı
 isiOndalik=(isi&0x000F)*625;// ısının ondalık kısmı
}
//-----------------------------------------------------------------
void isiYaz()
{
 if(isiTam>=100) derece[0]= isiTam/100 + 48;
 else if (isaret) derece[0]='-';
 else derece[0]=' ';
 if(isitam>=10) derece[1]= (isiTam/10)%10 + 48;
 else derece[1]=' ';
 derece[2]= isiTam%10 + 48;
 derece[3]='.';
 derece[4]= isiOndalik/1000 + 48;
 derece[5]= (isiOndalik/100)%10 + 48;
 derece[6]= (isiOndalik/10)%10 + 48;
 derece[7]= isiOndalik%10 + 48;
 derece[8]= 223;
 derece[9]= 'C';
 Lcd_Out(2,1,derece);
}
//---------------------------------------------------------
void main()
{
 CMCON=7;
 TRISA=0;
 TRISB=0;
 OPTION_REG.B7=0;
 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,3,"Termostat");
 Lcd_Out(2,1,"elektrokod");
 isiOku();
 if(alarm_TH!=37&&alarm_TL!=35) alarmYaz(); // alarm değerleri yoksa yaz
 Delay_ms(2000);
 do
 {
 isiOku();
 LED=alarm.B0;
 isiYaz();
 Delay_ms(1000);
 }while(1);
}
<pre>

Projenin animasyon videosu aşağıdadır.

Reklamlar

7 thoughts on “DS18B20 Sensörünün Alarm Özelliğini Kullanma

  1. Hocam çok teşekkürler.Allah razı olsun.Sensörün tam özelliklerini artık kullanabiliyorum.Hocam son birşey soracağım.Menülü tasarlasaydı programı kullanıcı kendisi girseydi üst ve alt seviye bilgilerini ? artırma azaltma butonları ile.Kaydedilen bilgileri MCU Eepromuna kaydetseydik ? Son sorumdur teşekkürler =)

  2. Ek:Bunu sormamın amacı PIC’te display olsun,Lcd olsun menü algoritma mantığını çözememdir.

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