Code:
@ DEVICE PIC16F877A,HS_OSC
DEFINE debug_mode 0 ' Debug sending True serial data
DEFINE debug_reg portc ' Debug Port = PortC
DEFINE debug_bit 6 ' Debug.bit = PortC.6
DEFINE debug_baud 9600 ' Default baud rate = 9600
DEFINE osc 8 ' We're using a X MHz oscillator
DEFINE ADC_BITS 8 ' Set A/D for 8-bit operation
DEFINE ADC_CLOCK 3 ' Set A/D clock r/c
DEFINE ADC_SAMPLEUS 50 ' Set A/D sampling time @ 50 uS
Define LCD_DREG PORTD ' Define LCD pins
Define LCD_DBIT 4 'use upper 4 bits d4-d7
Define LCD_RSREG PORTD
Define LCD_RSBIT 2
Define LCD_EREG PORTD
Define LCD_EBIT 3
DEFINE LCD_LINES 2
Define LCD_COMMANDUS 2000 ' Command Delay (uS)
Define LCD_DATAUS 50 ' Data Delay (uS)
Fan VAR PortC.2
Idle Var PortC.3
Save Var portc.1
Incr VAR portc.4 ' Increment button
Decr VAR portc.5 ' Decrement button
Season VAR PORTB.1 ' 1=summer 0=winter
AtticSamples VAR WORD ' Multiple A/D sample accumulator
AtticSample VAR BYTE ' Holds number of samples to take
GarageSamples VAR WORD ' Multiple A/D sample accumulator
GarageSample VAR BYTE ' Holds number of samples to take
AtticTemp VAR BYTE ' Attic Temperature storage
GarageTemp VAR Byte ' Garage Temperature Storage
Hysterisis VAR BYTE ' Hysterisis
SetPoint VAR BYTE ' Temperature Setpoint
SetPoint = 70
AtticSamples = 0 ' Clear samples accumulator on power-up
GarageSamples = 0 ' Clear samples accumulator on power-up
Hysterisis = 2
TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %00000011 ' Set PORTA.0,1,2,5 = A/D, PortA.3 = +Vref
TRISC.2 = 0
intcon = %10010000 ' enable rbo interrupt
PAUSE 500 ' Wait .5 second
powerup:
on interrupt goto SetSetPoint
pause 500
DEBUG "P",10,13
LCDOUT $fe, 1, "Heat Circulator"
LCDOUT $fe, $C0, "By Sonic"
DEBUG "PowerUp",10,13
loop:
toggle Idle
FOR Atticsample = 1 TO 20 ' Take 20 samples
ADCIN 0, AtticTemp ' Read channel 0 into AtticTemp variable
Atticsamples = Atticsamples + Attictemp ' Accumulate 20 samples
PAUSE 250 ' Wait approximately 1/4 seconds per loop
Toggle Idle
NEXT Atticsample
Attictemp = Atticsamples/20
Toggle Idle
FOR Garagesample = 1 TO 20 ' Take 20 samples
ADCIN 1, Garagetemp ' Read channel 1 into GarageTemp variable
Garagesamples = Garagesamples + Garagetemp ' Accumulate 20 samples
PAUSE 250 ' Wait approximately 1/4 seconds per loop
Toggle Idle
NEXT Garagesample
Garagetemp = Garagesamples/20
Toggle Idle
Pause 100 ' Do it about 10 times a second
; If Garagetemp >= 70 then GOSUB TempOK
If Season=0 THEN goSUB Winter
If SEASON=1 THEN goSUb Summer
TempOK:
'*****************************************************************************
'** If temperature in garage is greater than or equal to SetPoint turn off ***
'** circulator fan ***
'*****************************************************************************
LCDOUT $fe, 1, "CirculatorOff ", #AtticTemp,"F" ' Send to LCD Line 1
Lcdout $fe, $C0, "GarageTemp >= ",#SetPoint, #GarageTemp,"F" 'Send to LCD Line 2
Fan = 0
DEBUG "OK,",#SetPoint,"'","G",#GarageTemp,".","A",#AtticTemp,10,13
Atticsamples = 0 ' Clear old sample accumulator
Garagesamples = 0 ' Clear old sample accumulator
pause 500
goto loop
Winter:
' if attic temp is greater than garage temp turn on ciculator fan
If GarageTemp >= SetPoint then
goto TempOK
ENDIF
If AtticTemp > GarageTemp + Hysterisis Then
Fan = 1
Else
Fan = 0 'Turn OFF Fan Output
endif
GOTO Messages ' Do it forever
Summer:
' if attic temp is less than garage temp turn on circulator fan
If GarageTemp > SetPoint then
goto TempOK
ENDIF
If AtticTemp + Hysterisis < GarageTemp Then
Fan = 1
Else
Fan = 0
endif
GOTO Messages ' Do it forever
SetSetPoint:
DISABLE
LCDOut $FE,1, "Setpoint at", #SetPoint, "F"
if Incr = 1 then 'change the setpoint
pause 500
SetPoint=SetPoint+1
if Setpoint>80 then SetPoint=60 'Allow setpoint from 60 to 80
goto SetSetPoint 'refresh LCD with new setpoiont
endif
If Save = 0 then goto SetSetPoint
LCDOut $FE,$C0, "Saved Setpoint", #SetPoint, "F"
Resume
ENABLE
goto loop
Messages:
LCDOUT $fe, 1, "Attic=", #AtticTemp,"F", " ",#Season ' Send to LCD Line 1
Lcdout $fe, $C0, "Garage=", #GarageTemp,"F", " ",#Fan 'Send to LCD Line 2
DEBUG DEC AtticTemp,",", DEC GarageTemp,",",#fan,",",#Season,10,13
Atticsamples = 0 ' Clear old sample accumulator
Garagesamples = 0 ' Clear old sample accumulator
GOTO Loop
END
Bookmarks