Sıcaklık Okuma ! (Elektronik Termostat) V2


Elektonik Termostat Serial Port Reading and Grafic

Yaklaşık olarak 2 ay önce öğretmenler odasındaki çay makinasının termostatın kararsızlığı (ayarsızlığı) üzerine hazırlamış olduğum projemin, gerek RS-232 gerekse C# üzerine çalışmak/öğremek için pilot proje haline gelmiş halidir.


Programımı Easypic6 board’u kullandığım için microC ile hazırladım(Tembellik! Hazır kütüphaneler çok rahat 🙂 )
C# programı kısmında ise programcı bir akradaşımdan bazı noktalarda destek aldım. Çok teşekkurler.

Programın Çalışması(PIC Kısmı);
DS1820 üzerinden sıcaklık değeri okunarak RS-232 üzerinden PC’ye aktarılıyor. bu sırada PIC gene de 2×16 LCD üzerinden sıcaklık derecesini gösteriyor ve belirlenen sıcaklığa göre kıyaslama yapıp “SICAK” veya “SOĞUK” yorumunu yapıyor.
SOĞUK durumu söz konusu ise; RA0 bitini 1 yapıyor.
SICAK durumu söz konusu ise; RA1 bitini 1 yapıyor.
Ben board üzerindeki LED leri takip ettim ama kontrol için çıkışlara elbetteki röle bağlamalıyız.

Programın Çalışması(PC Kısmı);
Programı açtığımız da Port Ayarları menüsünden “Seri Port” konfügre ederek işe başlıyoruz. COM(1,2,3,4…..) ve Baud Rate değerini bildiriyoruz.
RS-232 üzerinden gelen bilgiyi artık “Sıcaklık Okuma” menüsü ile okuyabiliriz. Her saniye okunan değer ile zamana bağlı sıcaklık grafiğini oluşturmak mümkün. Ayrıca kıyaslama modülü ile de PIC’un yaptığı kendi üzerinde yaptığı işlemi bilgisayarda da yapmak mümkün…..

Project

Port Configation

Elektonik Termostat Serial Port Reading and Grafic

Öncelikle üzgünüm kod biraz kirli(!) gereksiz satırlar olabilir. Temizlemek için vakit ayıramadım. (Tembellik)

/* Proje By Erkan ÇİL      */
/* ELEKTRONİK TERMOSTAT V2 */
/*      08/2011            */
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0";
unsigned temp, temp2;

char txt1[] = "KOZAN";
char txt2[] = "TEKNiK  ENDUSTRi";
char txt3[] = "MESLEK LiSESi";
char txt4[] = "ELEKTRONİK TERMOSTAT";
char txt5[] = "PROJESi V1";
char txt6[] = "BY ERKAN CiL";
char txt7[] = "iYi GUNLER";
char i;

void OpenScreen() {
     Lcd_Init();
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1,6,txt1);
     Delay_ms(1500);

     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,1,txt2);
     Lcd_Out(2,3,txt3);
     Delay_ms(1500);

     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,4,txt4);
     Lcd_Out(2,4,txt5);
     Delay_ms(1500);

     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Out(1,3,txt6);
     Lcd_Out(2,4,txt7);
     Delay_ms(3500);
     Lcd_Cmd(_LCD_CLEAR);
  }
/*-----------------------------------------------------------------------*/
void Display_Temperature(unsigned int temp2write) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  char temp_whole;
  unsigned int temp_fraction;

    Ow_Reset(&PORTE, 2);
    Ow_Write(&PORTE, 2, 0xCC);
    Ow_Write(&PORTE, 2, 0x44);
    Delay_us(120);

    Ow_Reset(&PORTE, 2);
    Ow_Write(&PORTE, 2, 0xCC);
    Ow_Write(&PORTE, 2, 0xBE);                

    temp =  Ow_Read(&PORTE, 2);
    temp = (Ow_Read(&PORTE, 2) << 8 ) + temp;

  if (temp2write & 0x8000)
  {
     text[0] = '-';
     temp2write = ~temp2write + 1;
     }

  temp_whole = temp2write >> RES_SHIFT ;      

  if (temp_whole/100)
  text[0] = temp_whole/100  + 48;
  else
  text[0] = ' ';
  text[1] = (temp_whole/10)%10 + 48;
  text[2] =  temp_whole%10     + 48;          

  temp_fraction  = temp2write << (4-RES_SHIFT);
  temp_fraction &= 0x000F;
  temp_fraction *= 625;

  text[4] =  temp_fraction/1000    + 48;    

  Lcd_Out(1,1,"SU DURUMU=");
  Lcd_Out(2,1,"SICAKLIK");
  Lcd_Out(2,10,text);
  Lcd_Chr(2,15,223);
  Lcd_Chr(2,16,'C');
  temp2 = temp / 2 ;
  }
/*-----------------------------------------------------------------------*/
void kiyaslama(){
int ayar =30;
ayar = 16*ayar;
ayar= ayar/10;
if ( temp < 52 )
    {Lcd_Out(1,12,"SOGUK"); RA0_bit=1; RA1_bit=0;
      }
else
       {Lcd_Out(1,12,"SiCAK"); RA0_bit=0; RA1_bit=1;
      }
}
/*-----------------------------------------------------------------------*/
void okuma(){
  if(UART1_Data_Ready()==1)
  {
  UART1_Read_Text(PORTA=0x04,"ra4",10);
  PORTA=0x04 ;
  RA4_bit = 1;
}
}
/*-----------------------------------------------------------------------*/
  void main(){

  ANSEL  = 0;
  ANSELH = 0;
  C1ON_bit = 0;
  C2ON_bit = 0;
  TRISA = 0x00;
  UART1_Init(9600);
  UART1_Write(10);
  UART1_Write(13);

  //OpenScreen();
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Chr(2,15,223);
  Lcd_Chr(2,16,'C');
/*-----------------------------------------------------------------------*/
do
{
  Display_Temperature(temp);
  Delay_ms(500);
  /*Display_Temperature(temp); */
  kiyaslama();
  UART1_Write(temp);
 // okuma();
  //UART1_Write_Text("erkan");

}while(1);
}
/*-----------------------------------------------------------------------*/
  1. #1 by ufuk on 06 Ocak 2014 - 21:51

    merhaba bu ısı okuma programının bastarafı yokmu port durumu include dosyası cristal frekansı
    iyi çalışmalar

    • #2 by Erkan ÇİL on 12 Ocak 2014 - 17:11

      hatırladığım kadarı ile menüden ayarlanabiliyor olmalıydı.
      iyi çalışmalar…

(yayınlanmayacak)