'{$STAMP BS2p} 'Saltwater Tank Monitor, Lighting System, And Topoff System = "ReefKeeper" 'Prgrammed By Samuel Hiatt, April 2005 Copyright 2005 Samuel Hiatt '________________________________________LCD Varibles And Commands____________________________________________ ESC CON 27 'LCD Command clrLCD CON 12 'LCD Clear Screen Command backon CON 14 'LCD Backlight On Command backoff CON 15 'LCD Backlight Off Command Baud CON 16624 Salinity VAR Byte SalinitySet VAR Byte y VAR Byte 'Number Of Times Tank Has Filled Since Cleared '________________________________________Outlet Varibles______________________________________________________ On3 VAR Byte Off3 VAR Byte On4 VAR Byte Off4 VAR Byte On5 VAR Byte Off5 VAR Byte On6 VAR Byte Off6 VAR Byte On7 VAR Byte Off7 VAR Byte On8 VAR Byte Off8 VAR Byte On9 VAR Byte Off9 VAR Byte On10 VAR Byte Off10 VAR Byte On11 VAR Byte Off11 VAR Byte On12 VAR Byte Off12 VAR Byte '25 '______________________________ADC Varibles, Constans, And Pin ID's____________________________________________ CS1 CON 5 'ADC Chip Select(ADC #1) CS2 CON 7 'ADC Chip Select(ADC #2) CLK1 CON 0 'ADC CLK Pin DIO_n1 CON 6 'ADC Data I/O Pin(ADC #1) DIO_n2 CON 8 'ADC Data I/O Pin(ADC #2) config1 VAR Nib 'ADC Data(ADC #1) config2 VAR Nib 'ADC Data(ADC #2) AD10 VAR Word 'ADC DEC Value(ADC #1 Channel #0) AD11 VAR Word 'ADC DEC Value(ADC #1 Channel #1) AD20 VAR Word 'ADC DEC Value(ADC #2 Channel #0) AD21 VAR Word 'ADC DEC Value(ADC #2 Channel #1) startB1 VAR config1.BIT0 'ADC #1 Data Conversion Varibles sglDif1 VAR config1.BIT1 oddSign1 VAR config1.BIT2 msbf1 VAR config1.BIT3 startB2 VAR config2.BIT0 'ADC #2 Data Conversion Varibles sglDif2 VAR config2.BIT1 oddSign2 VAR config2.BIT2 msbf2 VAR config2.BIT3 '______________________________DS1302 Clock Varibles, Constans, And Pin ID's___________________________________ DATA (49) RTCCmd VAR Byte Clk CON 0 Dta CON 1 RTCReset CON 2 Temp VAR Byte Seconds VAR Byte Minutes VAR Byte Hours VAR Byte Date VAR Byte Month VAR Byte Year VAR Byte I VAR Byte AmPm VAR Byte SecReg CON %00000 MinReg CON %00001 HrsReg CON %00010 DateReg CON %00011 MonReg CON %00100 YrReg CON %00110 CtrlReg CON %00111 BrstReg CON %11111 DIRS = %0000000000111111 OUTS = %0000000000000000 HIGH CS1 'Selects ADC #1 HIGH DIO_n1 'Enables Data Transfer PAUSE 100 'Pause For Proper Boot Boot: SEROUT 10,16468,[backon] 'Turns LCD Backlight On GOTO Again1 TopoffOn: IF Salinity > SalinitySet THEN Fresh IF Salinity < SalinitySet THEN Salt TopoffOff: AUXIO LOW 15 'Turns Topoff Pump Off LOW 14 MAINIO GOTO Again1 'Goes To ADC #1 Program Fresh: AUXIO HIGH 15 MAINIO GOTO Again1 'Goes To ADC #1 Program Salt: AUXIO HIGH 14 MAINIO GOTO Again1 Main: PAUSE 100 'Pause IF IN3 = 1 THEN off 'Checks Tank Fill Sensor IF IN4 = 1 THEN on 'Checks Tank Low Sensor(Time To Fill) '_________________________________________Outlet Control Program__________________________________________________ OutletControl: IF On3 = AMPM + Hours + Minutes THEN Outlet3On IF Off3 = AMPM + Hours + Minutes THEN Outlet3Off IF On4 = AMPM + Hours + Minutes THEN Outlet4On IF Off4 = AMPM + Hours + Minutes THEN Outlet4Off IF On5 = AMPM + Hours + Minutes THEN Outlet5On IF Off5 = AMPM + Hours + Minutes THEN Outlet5Off IF On6 = AMPM + Hours + Minutes THEN Outlet6On IF Off6 = AMPM + Hours + Minutes THEN Outlet6Off IF On7 = AMPM + Hours + Minutes THEN Outlet7On IF Off7 = AMPM + Hours + Minutes THEN Outlet7Off IF On8 = AMPM + Hours + Minutes THEN Outlet8On IF Off8 = AMPM + Hours + Minutes THEN Outlet8Off IF On9 = AMPM + Hours + Minutes THEN Outlet9On IF Off9 = AMPM + Hours + Minutes THEN Outlet9Off IF On10 = AMPM + Hours + Minutes THEN Outlet10On IF Off10 = AMPM + Hours + Minutes THEN Outlet10Off IF On11 = AMPM + Hours + Minutes THEN Outlet11On IF Off11 = AMPM + Hours + Minutes THEN Outlet11Off IF On12 = AMPM + Hours + Minutes THEN Outlet12On IF Off12 = AMPM + Hours + Minutes THEN Outlet12Off '___________________________________________ADC #1 Main Program___________________________________________________ Again1: 'ADC #1 Program GOSUB ReadRTCBurst DEBUG HOME, DEC Hours.HIGHNIB, DEC Hours.LOWNIB, ":", DEC Minutes.HIGHNIB DEBUG DEC Minutes.LOWNIB, ":", DEC Seconds.HIGHNIB, DEC Seconds.LOWNIB DEBUG " ", DEC Month.HIGHNIB, DEC Month.LOWNIB, "/" DEBUG DEC Date.HIGHNIB, DEC Date.LOWNIB, "/", DEC Year.HIGHNIB, DEC Year.LOWNIB, CR FOR oddSign1 = 0 TO 0 'Checks Data Form Channel #0 GOSUB Convert1 'Goes To Convert For Data Conversion DEBUG "Channel ",DEC oddSign1, ":", DEC AD1,CR 'Displays Channel #0 Data In Debug Window '_____________________________________________Display Program_____________________________________________________ SEROUT 10,16468,[ESC, "F"] 'LCD Font and Size Command SEROUT 10,16468,[CR,clrLCD] 'LCD Clear Screen Command SEROUT 10,16468,["Y=",DEC y," "] 'Displays Topoff Count On LCD SEROUT 10,16468,["Full=",BIN IN3," ","Low=",BIN IN4,CR] 'Displays Inputs 3 & 4 Status On LCD SEROUT 10,16468,["Channel ",DEC oddSign1, ":", DEC AD1,CR] 'Displays ADC #1 Channel Number And Channel Data ON LCD SEROUT 10,16468,["Voltage=", DEC x2, CR] 'Displays ADC #2 Channel #0 Data On LCD SEROUT 7,baud,[ESC, "F"] SEROUT 7,baud,[CR,CLRLCD,BACKON] SEROUT 7,baud,[DEC Hours.HIGHNIB, DEC Hours.LOWNIB, ":", DEC Minutes.HIGHNIB] SEROUT 7,baud,[DEC Minutes.LOWNIB, ":", DEC Seconds.HIGHNIB, DEC Seconds.LOWNIB] SEROUT 7,baud,[" ", DEC Month.HIGHNIB, DEC Month.LOWNIB, "/"] SEROUT 7,baud,[DEC Date.HIGHNIB, DEC Date.LOWNIB, "/", DEC Year.HIGHNIB, DEC Year.LOWNIB, CR] IF OUT8 = 1 THEN Display1 'Goes To Display1 If Output 8 Is On IF OUT8 = 0 THEN Display2 'Goes To Display2 If Output 8 Is Off Display1: 'Water Level Low SEROUT 10,16468,["Adding Water",CR] 'Displays If Water Level Is Low On LCD GOTO Start Display2: 'Water Level Full SEROUT 10,16468,["Tank Full",CR] 'Display If Water Level Is Full On LCD GOTO Start 'Goes To Check Input '______________________________________Varible Transfer And Button Program______________________________________________ Start: x1 = AD1 'Stores ADC1 Value In X1 x2 = AD2 'Stores ADC2 Value In X2 IF x1 > 3900 THEN button1 'Check If Button #1 Is Pressed IF x1 > 200 THEN first 'If Button Is NOT Pressed Checks Which Button Is Pressed GOTO moveon 'Check If Button Is No Longer Pressed first: IF x1 < 1200 THEN button5 'Checks If Button #5 Is Pressed second: IF x1 < 1700 THEN button4 'Checks If Button #4 Is Pressed third: IF x1 < 2400 THEN button3 'Checks If Button #3 Is Pressed forth: IF x1 < 3300 THEN button2 'Checks If Button #2 Is Pressed button1: 'Button #1 Program-Does What Is Below If Button #1 Is Pressed SEROUT 10,16468,["1",CR] 'Displays A 1 On LCD If Button #1 Is Pressed y = 0 'Reset Topoff Count GOTO moveon 'Goes To Check If Button Is No Longer Pressed button2: 'Button #2 Program-Does What Is Below If Button #2 Is Pressed SEROUT 10,16468,["2",CR] 'Displays A 2 On LCD If Button #2 Is Pressed SEROUT 10,16468,[backon] 'Turns LCD Backlight On GOTO moveon 'Goes To Check If Button Is No Longer Pressed button3: 'Button #3 Program-Does What Is Below If Button #3 Is Pressed SEROUT 10,16468,["3",CR] 'Displays A 3 On LCD If Button #3 Is Pressed SEROUT 10,16468,[backoff] 'Turns Backlight Off GOTO moveon 'Goes To Check If Button Is No Longer Pressed button4: 'Button #4 Program-Does What Is Below If Button #4 Is Pressed SEROUT 10,16468,["4",CR] 'Displays A 4 On LCD If Button #4 Is Pressed GOTO moveon 'Checks If Button Is No Longer Pressed button5: 'Button #5 Program-Does What Is Below If Button #5 Is Pressed SEROUT 10,16468,["5",CR] 'Displays A 5 On LCD If Button #5 Is Pressed GOTO moveon 'Goes To Check If Button Is Longer Pressed moveon: 'Checks Is Buttons Have Returned To Idle IF x1 > 25 THEN moveon2 moveon2: IF x1 < 200 THEN Main GOTO Main 'Goes To Check Inputs '____________________________________________ADC #1 Subroutines____________________________________________________________ Convert1: 'ADC #1 Data Transfer And Conversion Program config1 = config1 | %1011 LOW CS1 SHIFTOUT DIO_n1,CLK1,LSBFIRST,[config1\4] SHIFTIN DIO_n1,CLK1,MSBPOST,[AD1\12] HIGH CS1 HIGH CS2 'Selects ADC #2 HIGH DIO_n2 'Enables Data Transfer Again2: 'ADC #2 Program FOR oddSign2 = 0 TO 0 GOSUB Convert2 DEBUG "Voltage ",DEC oddSign2, ":", DEC AD2,CR '_____________________________________________ADC #2 Subroutines____________________________________________________________ Convert2: 'ADC #2 Data Transfer And Conversion Program config2 = config2 | %1011 LOW CS2 SHIFTOUT DIO_n2,CLK1,LSBFIRST,[config2\4] SHIFTIN DIO_n2,CLK1,MSBPOST,[AD2\12] HIGH CS2 RETURN '______________________________________DS1302 Clock Read/Write Subroutines__________________________________________________ WriteRTCRAM: HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [%0\1,RTCCmd\5, %11\2,Temp] LOW RTCReset RETURN WriteRTC: HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [%0\1, RTCCmd\5, %10\2,Temp] LOW RTCReset RETURN ReadRTCBurst: HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [%1\1,BrstReg\5, %10\2] SHIFTIN Dta, Clk, LSBPRE, [Seconds,Minutes,Hours,Date,Month,Year,Year] LOW RTCReset RETURN ReadRTCRAM: HIGH RTCReset SHIFTOUT Dta, Clk, LSBFIRST, [%1\1, RTCCmd\5, %11\2] SHIFTIN Dta, Clk, LSBPRE, [Temp] LOW RTCReset RETURN '________________________________________________Outlet On/Off Programs________________________________________________________ Outlet1On: AUXIO HIGH 15 MAINIO RETURN Outlet1Off: AUXIO LOW 15 MAINIO RETURN Outlet2On: AUXIO HIGH 14 MAINIO RETURN Outlet2Off: AUXIO LOW 14 MAINIO RETURN Outlet3On: AUXIO HIGH 13 MAINIO RETURN Outlet3Off: AUXIO LOW 13 MAINIO RETURN Outlet4On: AUXIO HIGH 12 MAINIO RETURN Outlet4Off: AUXIO LOW 12 MAINIO RETURN Outlet5On: AUXIO HIGH 11 MAINIO RETURN Outlet5Off: AUXIO LOW 11 MAINIO RETURN Outlet6On: AUXIO HIGH 10 MAINIO RETURN Outlet6Off: AUXIO LOW 10 MAINIO RETURN Outlet7On: AUXIO HIGH 9 MAINIO RETURN Outlet7Off: AUXIO LOW 9 MAINIO RETURN Outlet8On: AUXIO HIGH 8 MAINIO RETURN Outlet8Off: AUXIO LOW 8 MAINIO RETURN Outlet9On: AUXIO HIGH 7 MAINIO RETURN Outlet9Off: AUXIO LOW 7 MAINIO RETURN Outlet10On: AUXIO HIGH 6 MAINIO RETURN Outlet10Off: AUXIO LOW 6 MAINIO RETURN Outlet11On: AUXIO HIGH 5 MAINIO RETURN Outlet11Off: AUXIO LOW 5 MAINIO RETURN Outlet12On: AUXIO HIGH 4 MAINIO RETURN Outlet12Off: AUXIO LOW 4 MAINIO RETURN