/*
 * Diplomová práce:     Meteostanice 2013 - Teploměr UART
 * Autor práce:         Pavel Beneděla
 * Vedoucí práce:       Ing. Marie Havlíková, Ph.D.
 * Mikroprocesor:       PIC16F648 (využito 35% ROM paměti, 30% RAM paměti)
 * Pracovní kmitočet:   4.000 MHz
 * Compiler:            CCS PCH V4.128
 * Poslední úprava:     09/03/2013


 *Použité funkce:
 
  void shtx();                                                   //Funkce měří teplotu a relativní vlhkost vzduchu

  
 */
 
#include<16F648A.H>       //naincludování použitého procesoru

#fuses HS,NOWDT,NOPROTECT,NOLVP,NOMCLR                                     //pojistky
#use delay(clock=4000000)                                                  //Definice frekvence mikrokontroléru pro funkci delay
#use rs232(baud=1200,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8, stream=PC)    //Nastavení sériové linky

#include <knihovny/sht11.c>    //knihovna pro SHT10

//-----------------------definice použitých funkcí-----------------------
void shtx ();

//-------------------------Globální proměnné-----------------------------
char ch;
int8 buffer[4];
int8 i=0;

unsigned long long Rh_res;
signed long long rh_true;
int16 moje;
char Rh[7] = "000.00";    //pole s naměřenou hodnotou relativní vlhkosti pro odeslání
char Ta[8] = "000.00";    //pole s naměřenou hodnotou teploty pro odeslání

//------------obsluha přerušení od sériové linky-------------------------

#int_RDA 
void  serial_prijato(void) 
{ 
   ch = getch(PC); 
   if(ch=='A'){i=1;}
   else{  printf("%c",ch); }
}

//--------------------hlavní program-------------------------------------
void main()
{
 //povolení přerušeních
 enable_interrupts(INT_RDA);    
 enable_interrupts(GLOBAL) ; 

   while(true)
   {
   if(i==1)
      { i=0;
         shtx ();
         printf("%s",Ta);
         printf("%s",Ta);
         delay_ms(100);
         printf("%s",Rh);
         printf("%s",Rh);
      }
   }
}

//----------------------------F U N K C E---------------------------------------
void shtx ()
{
 unsigned long long SOrh;
 unsigned long long temp1;
  
 moje = measuretemp();
 moje = moje - 50;
 
 if(moje > 4010)                     // pokud je teplota nad nulou
    { 
      moje = moje * 1 - 4010; Ta[1] = ' ';
    }   
else  {                             // teplota pod nulou
       moje = 4010 - moje * 1; Ta[1] = '-';
      }
  
  //moje = moje - 50;        //korekce
  Ta[0] = 'Y';
  Ta[2] = moje % 10000 / 1000 + 48;           
  Ta[3] = moje % 1000 / 100 + 48; 
  Ta[4] ='.';
  Ta[5] = moje % 100 / 10 + 48;               
  Ta[6] = moje % 10 + 48; 
  Ta[7]='\0';
  
//-----------------------------------------------------------------------------------
  delay_us(100);
  
  SOrh = measurehumid();                         //vyčte vlhkost ze sensoru
  temp1 = SOrh * SOrh * 28 / 100000;             // počítá vlhkost
  Rh_res = SOrh * 405 / 100 - temp1 - 400;       // počítá vlhkost
  rh_true=moje;  
  rh_true=rh_true-2500;
  rh_true=(rh_true*(1000+(8*SOrh)))/100000;
  rh_true= rh_true+Rh_res;
  
  Rh[0] = 'Z';
  Rh[1] = Rh_true % 10000 / 1000 + 48;           
  Rh[2] = Rh_true % 1000 / 100 + 48;             
  Rh[4] = Rh_true % 100 / 10 + 48;               
  Rh[5] = Rh_true % 10 + 48;  
  Rh[6]='\0';
    
}
