LOL - same time as I did mine - so you have no excuses
I've messed around with the version where I was trying to get a single line for the data from each vivarium that's it's all over the place. So I've posted the previous version which displays the data for all four vivariums, 1 per line of the LCD
Then this is the subroutine which displays the data on the LCDCode:;----------------------------------------------------------------------------- ; ***** MAIN PROGRAMMING LOOP ***** ;----------------------------------------------------------------------------- Main: SetPoint1 = normtemp1 SetPoint2 = normtemp2 SetPoint3 = normtemp3 SetPoint4 = normtemp4 gosub FlushBuffer: If SetButton=0 then ; jump to programming Gosub SetButtonRelease goto mainmenu endif If DecButton=0 then Gosub SetButtonRelease goto lightoveride ; manual overide of light endif If IncButton=0 then Gosub SetButtonRelease goto cancelalarm ; manual overide of alarm endif gosub read_dht ; Go and read the AM2302 sensor for humidity FOR pid_Channel = 0 TO 3 ; cycle thru all sensors GOSUB SelectSensor GIE = 0 ; disable interrupts before 1-wire @ DS1820_Convert ; start a temperature conversion GIE = 1 ; enable interrupts after 1-wire NEXT pid_Channel FOR TempWD = 0 TO 1000 IF RCIF=1 THEN GOSUB coms ; Check to see id PC application connected PAUSE 1 NEXT TempWD FOR pid_Channel = 0 TO 3 ; cycle thru all sensors GOSUB SelectSensor DS1820_Error = 0 ; clear any previous errors DS1820_Flags = 0 ; clear status flags GIE = 0 ; disable interrupts before 1-wire @ DS1820_Stat ; check the sensors status GIE = 1 ; enable interrupts after 1-wire PAUSEUS 20 IF !DS1820_Done THEN SensorError ; if it's not done by now, error GIE = 0 ; disable interrupts before 1-wire @ DS1820_Read ; get the temperature result GIE = 1 ; enable interrupts after 1-wire GOSUB Check4Zeros DS1820_Flags = 0 GIE = 0 ; disable interrupts before 1-wire @ DS1820_Stat GIE = 1 ; enable interrupts after 1-wire IF (DS1820_Error = 0) AND DS1820_Done THEN ; if there were no errors Temperatures(pid_Channel) = TempC pid_Error = SetPoints(pid_Channel) - TempC GOSUB PID IF pid_Out.15 THEN pid_Out = 0 ; only keep positive values IF ChannelPWR(pid_Channel) THEN HeaterDrives(pid_Channel) = pid_Out ELSE HeaterDrives(pid_Channel) = 0 ENDIF IF Temperatures(pid_Channel) > alarmhigh(pid_Channel) and Alarm = 1 then AlarmPin = 1 IF Temperatures(pid_Channel) > alarmhigh(pid_Channel) and Alarm = 0 then AlarmPin = 0 IF Temperatures(pid_Channel) <= alarmhigh(pid_Channel) then AlarmPin = 0 IF Temperatures(pid_Channel) <= alarmlow(pid_Channel) then AlarmPin = 0 if Temperatures(pid_Channel) < alarmlow(pid_Channel) and Alarm = 1 then AlarmPin = 1 if Temperatures(pid_Channel) < alarmlow(pid_Channel) and Alarm = 0 then AlarmPin = 0 GOSUB ShowLCD ; display info on LCD ELSE SensorError: HeaterDrives(pid_Channel) = 0 ; turn off heater if sensor's bad SensorActive(pid_Channel) = 0 GOSUB ShowError ; display error message ENDIF NEXT pid_Channel ; --------------------------------------------------------------------------- ; check lighting periods and turn lights on or off accordingly ; --------------------------------------------------------------------------- fn = 0 ; select the first Lights if lightover = 0 then GOSUB CheckTimes ; if manual override set to off then go compare the programed period if lightover = 1 then progON=1 ; if manual override flag set to on then lights on flag set to 1 IF ProgON THEN ; If in the program period IF Lights1 = 0 THEN Lights1 = 1 ELSE IF Lights1 = 1 THEN Lights1 = 0 ENDIF fn = 1 ; select the second Lights if lightover = 0 then GOSUB CheckTimes ; compare the programed period IF ProgON THEN IF Lights2 = 0 THEN Lights2 = 1 ELSE IF Lights2 = 1 THEN Lights2 = 0 ENDIF ; --------------------------------------------------------------------------- ; Check for night time drops - if condition matched, drop temp ; --------------------------------------------------------------------------- fn = 0 ; select the first setting GOSUB CheckTimes2 ; compare the programed period IF ProgON2 THEN SetPoints[0]=Droptemp[0] ; change the corresponding set point to the drop temperature ELSE SetPoints[0]= normtemp[0] ; change the corresponding drop temperature to set point ENDIF fn = 1 ; select the second setting GOSUB CheckTimes2 ; compare the programed period IF ProgON2 THEN SetPoints[1]=Droptemp[1] ; change the corresponding set point to the drop temperature ELSE SetPoints[1]= normtemp[1] ; change the corresponding drop temperature to set point ENDIF fn = 2 ; select the third setting GOSUB CheckTimes2 ; compare the programed period IF ProgON2 THEN SetPoints[2]=Droptemp[2] ; change the corresponding set point to the drop temperature ELSE SetPoints[2]= normtemp[2] ; change the corresponding drop temperature to set point ENDIF fn = 3 ; select the fouth setting GOSUB CheckTimes2 ; compare the programed period IF ProgON2 THEN SetPoints[3]=Droptemp[3] ; change the corresponding set point to the drop temperature ELSE Setpoints[3]= normtemp[3] ; change the corresponding drop temperature to set point ENDIF for x = 0 to 3 LOOKUP x,[5,9,13,17],Bvar ; Find location [$80,$C0,$89,$C9] LCDOUT $fe,$80,"Set" LCDOUT $fe,$80+Bvar,#setpoints(x)dig 2,#setpoints(x)dig 1 ; print to LCD LCDOUT $DF next x ;----------------------------------------------------------------------------- ; ***** MAIN PROGRAMMING LOOP END ***** ;----------------------------------------------------------------------------- GOTO Main ;------------------------------------------------------------------------------
The two subroutines that deal with displaying the non presence of a 18B20 and read the AM2302Code:;----[Display temperatures, time and set points on LCD]------------------------ ShowLCD: LCDOUT $FE,$C0,"Hot" LCDOUT $FE,$C0+5 ; print to LCD TempWD = TempC : GOSUB TempToLCD ; display TempC LCDOUT $DF ; deg symbol I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCYear,RTCCtrl] ; read DS1307 chip If RTCHour.6=1 then CounterA=(RTCHour>>4)&$01 ' Work-Out 12 or 24 hour Display for Hours else CounterA=(RTCHour>>4)&$03 endif CounterA=CounterA*10+(RTCHour&$0F) ' Display Hours appropriately for 12 or 24 hour Mode '********* to display time on LCD ***************** Commented out as there is no room on the LCD 'If RTCHour.6=1 then 'LCDOut $FE,$C0+9,"Time ",#CounterA 'else 'LCDOut $FE,$C0+9,"Time ",#CounterA Dig 1,#CounterA Dig 0 'endif 'LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F '*************************************************** timeH=(RTCHour>>4) 'convert the BCD format of the hours register and store in variable timeH timeH=(timeH &$03)*10 timeH=timeH+(RTCHour&$0F) timeM=(RTCMin>>4) timeM=(timeM &$07)*10 timeM=timeM+(RTCMin&$0F) 'convert the BCD format of the mins register and store in variable timeM ;----[ Time matching - Nighttime temp drop routine ]----- CheckTimes2: TimeCmpFlags = 0 ; clear flags first ; if the Start and Stop times are the same, then Always OFF if (StartHour[fn]=StopHour[fn]) AND _ (StartMin[fn]=StopMin[fn]) then AlwaysOFF2 ; is it past the Start time? if (timeH>StartHour[fn]) OR _ (timeH=StartHour[fn] AND timeM >= StartMin[fn])then PastStart2=1 ; is it past the Stop time? if (timeH>StopHour[fn]) OR _ (timeH=StopHour[fn] AND timeM >= StopMin[fn])then PastStop2=1 ; does the period end the following day? if (StopHour[fn]< StartHour[fn]) OR _ (StopHour[fn]=StartHour[fn] AND StopMin[fn] < StartMin[fn]) then NextDay2=1 if !NextDay2 then ; same day, use AND if PastStart2 AND !PastStop2 then ProgON2 = 1 else ; next day, use OR IF PastStart2 OR !PastStop2 then ProgON2 = 1 endif AlwaysOFF2: return CheckTimes: TimeCmpFlags = 0 ; clear flags first ; if the Start and Stop times are the same, then Always OFF if (lightsetHR[fn]=lightoffHR[fn]) AND _ (lightsetMN[fn]=lightoffMN[fn]) then AlwaysOFF ; is it past the Start time? if (timeH>lightsetHR[fn]) OR _ (timeH=lightsetHR[fn] AND timeM >= lightsetMN[fn])then PastStart=1 ; is it past the Stop time? if (timeH>lightoffHR[fn]) OR _ (timeH=lightoffHR[fn] AND timeM >= lightoffMN[fn])then PastStop=1 ; does the period end the following day? if (lightoffHR[fn]< lightsetHR[fn]) OR _ (lightoffHR[fn]=lightsetHR[fn] AND lightoffMN[fn] < lightsetMN[fn]) then NextDay=1 if !NextDay then ; same day, use AND if PastStart AND !PastStop then ProgON = 1 else ; next day, use OR IF PastStart OR !PastStop then ProgON = 1 endif AlwaysOFF: RETURN
I hope that's enough for you to be going on with. ?Code:;----[Display Sensor Error]------------------------------------------------- ShowError: LOOKUP pid_Channel,[5,9,13,17],Bvar ; Find location;LOOKUP pid_Channel,[$83,$C3,$8B,$CB],Bvar [$80,$C0,$89,$C9] LCDOUT $FE,$C0+Bvar,"N/C" ; print to LCD ;LCDOUT $FE,Bvar," N/C " RETURN ;----[Read humidity sensor]------------------------------------------------- read_dht: for loopcount = 0 to 3 AM2302_Sensor_Num = loopcount+1 gosub AM2302_Read LOOKUP loopcount,[5,9,13,17],Bvar ; Find location [$80,$C0,$89,$C9] LCDOUT $fe,$94,"Hum" LCDOUT $fe,$94+Bvar,dec AM2302_Hum/10,"% "' ".",dec AM2302_Hum//10,"% " ; print to LCD LCDOUT $fe,$D4,"Cold" LCDOUT $fe,$D4+Bvar,dec AM2302_Temp/10 lcdout $DF next loopcount Return
Malc





Bookmarks