// measures temp through ds1820, Shows 4 Temps
// PIC 16f690

// Preprocessor 
//============================================================================

#include "C:\Program Files\PICC\Devices\16F690.h"
#device *=16
#device adc=8
#device ICD=TRUE
#use delay(clock=8000000)
#use rs232(BAUD=9600,XMIT=PIN_A0, RCV=PIN_A1)         //for debug

#FUSES HS                        //AZ LCD kódból
#FUSES PUT                       //Power Up Timer AZ LCD kódból
//from Proba
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOCPD                    //No EE protection
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

//*****************    Hardware setup
#define LCD_TYPE 2            // 2lines * 16 char

// PIC PIN functions

//*****************    Hardware setup
// pickit ICSP PINs
//  P1 Vpp:      RA3   !!!!!!
//  P2 VDD
//  P3 GND
//  P4 DAT:      RA0, xmit
//  P5 Clock:    RA1, rcv
//  P6 T1G:      RA4, idle
 
// PIC PIN functions
//                      RA_0           XMIT
//                      RA_1           RCV

//   LCD PINs
#define LCD_ENABLE_PIN  PIN_C0        // PIC16-LCD PIN6 
#define LCD_RS_PIN      PIN_C1        // PIC15-LCD PIN4
#define LCD_RW_PIN      PIN_C2        // PIC14 - üres, (LCD PIN5:Ground - only write)
//                      PIN_C3           PIC 7 - empty
//   data1              PIN_C4           PIC 6 -LCD PIN11
//   data2              PIN_C5           PIC 5 -LCD PIN12
//   data3              PIN_C6           PIC 8 -LCD PIN13
//   data4              PIN_C7           PIC 9 -LCD PIN14

//    1wire PINs
//                  PIN_B4             //PIC 13 - DS1820 data pin AIR-INSIDE
//                  PIN_B5             //PIC 12 - DS1820 data pin AIR-OUTSIDE
//                  PIN_B6             //PIC 11 - DS1820 data pin TUBE-OUT
//                  PIN_B7             //PIC 10 - DS1820 data pin AIR-FLOW

//   RA4 kapcsoló
#define KAPCSOLO       PIN_A5          //PIC 2- Ki-be kapcsol, földre kötve!!
#define VENT_OUT       PIN_A4          //PIC 3 - A kapcsolt output
// Includes
#include<lcd_mod.c>   //from std LCD.c mod
#include<1wire01.c>
     
void vent_on()
{
output_high(VENT_OUT);      //Ventillátort bekapcsolja
}
void vent_off()
{
output_low(VENT_OUT);      //Ventillátort kikapcsolja
}
//===========================================================================

void main()                 
{
//******************************************************************************
//Declarations
float temperature[4]={0.0,0.0,0.0,0.0};
int8 one_wire_pins[4]={PIN_B4, PIN_B5, PIN_B6, PIN_B7};   //hőmérők PIn csatlakozásai
int ds_max=4;                                 //hőmérők száma
int i;
float heat_upper=26.0;                           //benti max hőmérséklet
float diff=5.0;                        // A cső és a benti minimum hőm. különbség
boolean summer=FALSE;                  // ki/be kapcs, pl. nyáron
unsigned int8 pin_id;                   //az akuális DS PIN-hez

//******************************************************************************
// INITIALIZATION
//    PIC INIT
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_oscillator( OSC_8MHZ );               // belső, 8M
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);         //debug időméréshez
setup_comparator(NC_NC_NC_NC);
setup_vref(VREF_LOW|-2);

//   PINs init
set_tris_b(0xF0);   // a 4 PINB input a hőmérőkhöz
set_tris_a(0x12);   // RA4 láb input a kapcsoló miatt, A1 RCV
//       set_tris_c az lcd_initben

//    LCD INIT
lcd_init();

// DS1820 INIT
    for (i=0;i<ds_max;++i)
       {
      pin_id=one_wire_pins[i];
      ds1820_init(pin_id);
       }
      
//******************************************************************************
// Leolvasás, kiírás, kapcsolás
// 

output_high(KAPCSOLO);      //ha a kapcsoló földre húzza, akkor kapcsol

vent_off();

while (TRUE) 
   {
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    for (i=0;i<ds_max;++i)
       {
         if (!input(KAPCSOLO)) summer=(!summer);   //ki-be kapcs
         pin_id=one_wire_pins[i];
         temperature[i] = ds1820_read(pin_id);
         switch (i) 
            {
            case 0:printf(lcd_putc,"BT:%4.1f ", temperature[i]);  break;
            case 1:printf(lcd_putc,"KT:%4.1f ", temperature[i]);  break;
            case 2:lcd_gotoxy(1,2);
                   printf(lcd_putc,"FL:%4.1f ", temperature[i]);  break;
            case 3:printf(lcd_putc,"LV:%4.1f ", temperature[i]);  break;
            }
       }   
      output_high(KAPCSOLO);
      delay_ms(2000);
      lcd_putc("\f");
      lcd_gotoxy(7,1);
//      ha nincs nyár és a szoba nem érte el a max hőmérsékletet és a fűtőcső melegebb, mint a szoba
      if (!summer &(temperature[0] < heat_upper)&&((temperature[2]-temperature[0])>diff))
         {
            vent_on();
            printf(lcd_putc,"ON"); 
         }
      else
         {
            vent_off();
            printf(lcd_putc,"OFF");
         };
      lcd_gotoxy(3,2);   
      if (summer) printf(lcd_putc,"Kikapcsolva"); else printf(lcd_putc,"Bekapcsolva");
      delay_ms(1000);
      lcd_putc("\f");

    }

}
//******************************************************************************

