' -----[ Title ]----------------------------------------------------------- ' Author.... Lynn Roth ' File...... MONITOR.BS2 ' Purpose... Check NUMROOMS DS1620s ,report temp, check for alarm. ' -----[ Program Description ]--------------------------------------------- ' BS2-IC Connections: ' ' ------\_/------ ' MODEM -| TX PWR |- +9V ' MODEM -| RX GND |- GND ' -| ATN RES |- RESET BUTTON ' -| GND +5V |- +5V ' RST-0 -| P0 P15 |- LCD ' RST-1 -| P1 P14 |- Up Button ' RST-2 -| P2 P13 |- Down Button ' RST-3 -| P3 P12 |- Left Button ' RST-4 -| P4 P11 |- Right Button ' RST-5 -| P5 P10 |- Menu Switch ' BUZZER -| P6 P9 |- DQ ' AC CHECK -| P7 P8 |- CLK ' --------------- ' '---------------[ Revision History ]--------------------------------------- ' 11-06-95 Version 1.0 started Reads one DS1620 ' 11-07-95 Version 1.2 Reads multiple 1620s ' 11-12-95 Version 1.3 Changes to edit mode ' 12-06-95 Version 1.4 Edit mode _really_ works ' AC check functional ' 12-19-95 Version 1.6 Menu system works: ' HI/LO, Pager ON/OFF ' Will Check 5 rooms and AC ' 12-19-95 Version 1.7 Menus work ' Sounds Alarm ' -----[ Constants ]------------------------------------------------------- ' True CON 1 False CON 0 DegSym CON 223 ' degrees symbol NumRooms CON 4 ' number of rooms - 1 SleepTime VAR byte MenuItems CON 5 ' number of Items on Main Menu ' Button pins UpB CON 14 DnB CON 13 LtB CON 12 RtB CON 11 EditSw CON 10 ACpin CON 7 ' Control pins ' LCD CON 15 BUZZ CON 6 ' LCD control characters ' I CON 254 ' Instruction Mode N96N CON $4054 ' Normal 9600 BAUD N24N CON 396 ClrLCD CON $01 ' clear the LCD CrsrHm CON $02 ' move cursor to home position CrsrLf CON $10 ' move cursor left CrsrRt CON $14 ' move cursor right DispLf CON $18 ' shift displayed chars left DispRt CON $1C ' shift displayed chars right ' DS1620 pins ' CS VAR nib ' DS1620.3 Clk CON 8 ' DS1620.2 DQ CON 9 ' DS1620.1 DQIn VAR In10 ' pin 10 input register DQOut VAR Out10 ' pin 10 output register ' DS1620 commands ' RTmp CON $AA ' read temperature WTHi CON $01 ' write TH (high temp register) WTLo CON $02 ' write TL (low temp register) RTHi CON $A1 ' read TH RTLo CON $A2 ' read TL Strt CON $EE ' start conversion StpC CON $22 ' stop conversion WCfg CON $0C ' write configuration register RCfg CON $AC ' read configuration register ' -----[ Variables ]------------------------------------------------------- ' menu VAR Nib ' Menu place loop VAR Byte ' loop counter btnvar VAR Byte ' Byte used by the button cmd btnvar2 VAR Byte ' Byte used by the button cmd btnvar3 VAR Byte ' Byte used by the button cmd btnvar4 VAR Byte ' Byte used by the button cmd tmpIn VAR Word ' 9-bit temp input from DS1620 inBit VAR tmpIn.Bit8 ' bit to shift in nFlag VAR tmpIn.Bit8 ' negative flag hlfBit VAR tmpIn.Bit0 ' half degree C bit temp VAR Word ' temperature to display sign VAR Byte ' sign of temperature check VAR Word ' scratch value TempHL VAR byte(2*NumRooms+1) ' High level for all rooms room VAR nib ' Keeps Track of Room pager VAR bit ' Pager on/off AlarmCode VAR byte ' String for Alarm Code ' ------------------------------------------------------------------------- ' -----[ Initialization ]-------------------------------------------------- ' Debug "Working.........." ' Init: DirL = %00000000 DirH = %11111100 Outs = $0000 ' all outputs off to start SleepTime = 1 ' Initialize all the DS1620s ' - use with CPU in free run mode I_1620: For CS = 0 to NumRooms HIGH CS ' alert the DS1620 SHIFTOUT DQ,Clk,LSBFIRST,[WCfg] ' write configuration ' use with CPU; free run mode SHIFTOUT DQ,Clk,LSBFIRST,[%00000010] LOW CS PAUSE 10 ' pause for EE write cycle HIGH CS SHIFTOUT DQ,Clk,LSBFIRST,[Strt] ' start temp conversions LOW CS Next CS = 0 'Initialize LCD low LCD pause 1000 GOSUB Clear serout LCD,N96N,["The Barn Monitor"] pause 1000 GOSUB HomeLCD serout LCD,N96N,[" Lynn A. Roth "] pause 1000 GOSUB Clear pause 1 input 10 ' -----[ Main Code ]------------------------------------------------------- ' Main: LOW BUZZ GOSUB CheckAC ' check AC line for loss of power GOSUB GotoSleep ' save power GOSUB GetTemp ' convert to fahrenheit ShowT: GOSUB ShowTemp ' display on LCD GOSUB CheckTemp ' check for hi/lo IF IN10 = 1 THEN EditMode GOSUB GotoSleep ' save power Main2: CS = (CS + 1)//(NumRooms + 1) GOTO Main ' -----[ Subroutines ]----------------------------------------------------- ' ------------------------------------------------------------------------- ' Sub GetTemp ' convert (1/2 degrees C) to fahenheit with rounding ' general equation (for whole degrees): F = C * 9 / 5 + 32 ' GetTemp:HIGH CS ' alert the DS1620 SHIFTOUT DQ,Clk,LSBFIRST,[RTmp] ' read temperature SHIFTIN DQ,Clk,LSBPRE,[tmpIn\9] ' get the temperature LOW CS sign = " " IF nFlag = 0 THEN FPos1 tmpIn = -tmpIn & $FF ' convert from negative IF tmpIn < 36 THEN FPos0 FNeg: sign = "-" temp = tmpIn * 9 / 10 + hlfBit - 32 GOTO FDone FPos0: temp = 32 - (tmpIn * 9 / 10 + hlfBit) GOTO FDone FPos1: temp = tmpIn * 9 / 10 + 32 + hlfBit FDone: RETURN '------------------------------------------------------------------------- ' Display Temperature on LCD ' ShowTemp: GOSUB Clear 'HomeLCD pause 1 serout LCD,N96N,["R", dec CS," ", dec temp,DegSym," H:",dec TempHL(CS*2)," L:",dec TempHL((CS*2)+1)] RETURN ' ------------------------------------------------------------------------- ' Check for loss of AC CheckAC: GOSUB Clear if in7 = 1 then ACoff ' serout LCD,N96N,["AC OK"] RETURN ACoff: ' serout LCD,N96N,["AC OFF--Alarm!!"] goto AlarmAC RETURN ' ------------------------------------------------------------------------- ' Check for variance on current room CheckTemp: If temp > TempHL(cs*2) then AlarmHi If temp < TempHL((cs*2)+1) then AlarmLo Return ' ------------------------------------------------------------------------- AlarmHi: AlarmCode=99 goto DialPhone AlarmLo: AlarmCode=11 goto DialPhone AlarmAC: AlarmCode=55 goto DialPhone DialPhone: HIGH BUZZ serout 16,N24N,["ATDT4462701,,,,,", dec AlarmCode,"00",CS] serout LCD,N96N,[dec AlarmCode,dec CS] Return ' ------------------------------------------------------------------------- ' Sleep for *Sleeptime* sec GotoSleep: SLEEP SleepTime RETURN ' ------------------------------------------------------------------------- ' LCD SUBROUTINES Clear: serout LCD,N96N,[I,ClrLCD,I] pause 1 RETURN HomeLCD: serout LCD,N96N,[I,CrsrHM,I] pause 1 RETURN ' ------------------------------------------------------------------------- ' -----------------------------Edit Mode----------------------------------- ' ------------------------------------------------------------------------- ' ------------------------------------------------------------------------- EditMode:' serout LCD,N96N,[I,ClrLCD,I] serout LCD,N96N,[I,128,I,"Edit-use buttons to change choice. "] pause 200 for loop = 1 to 20 serout LCD,N96N,[I,DispLf,I] pause 150 next pause 200 GOSUB Clear : GOSUB HomeLCD Btnvar = 0 menu = 0 btnvar=0:btnvar2=0:btnvar3=0 EditLoop: IF IN10 = 0 THEN Main2 GOSUB HomeLCD BUTTON UpB,0,255,100,btnvar,1,MenuUp BUTTON DnB,0,255,100,btnvar2,1,MenuDn BUTTON RtB,0,255,100,btnvar3,1,MenuSelect Button_Done: Branch Menu,[HiLo_Show,Pager_Show,Number_Show,Numroom_Show,SleepTime_Show] Edit_Done: goto EditLoop '----------------------------------------------------------------- MenuSelect: branch menu,[HiLo_Menu,Pager_Menu,Number_Menu,NumRoom_Menu,SleepTime_Menu] goto Button_Done MenuUp: Menu=(Menu+1)//MenuItems goto Button_Done MenuDn: Menu=(Menu+4)//MenuItems goto Button_Done '------------------------------------------------------------------------ ' Menu Disply Subroutines HiLo_Show: serout LCD,N96N,["High/Low Alarm "] Goto Edit_Done Pager_Show: serout LCD,N96N,["Pager On/Off "] Goto Edit_Done Number_Show: serout LCD,N96N,["Pager Number "] Goto Edit_Done Numroom_Show: serout LCD,N96N,["Number of Rooms "] Goto Edit_Done SleepTime_Show: serout LCD,N96N,["Sleep time "] Goto Edit_Done '------------------------------------------------------------------------ '------------------------------------------------------------------------ '------------------------- Sub-Menus ---------------------------------- '------------------------------------------------------------------------ '------------------------------------------------------------------------ HiLo_Menu: btnvar=0:btnvar2=0:btnvar3=0:btnvar4=0 HLLoop: IF IN10 = 0 THEN Main2 GOSUB HomeLCD BUTTON UpB,0,255,20,btnvar,1,RoomUp BUTTON DnB,0,255,20,btnvar2,1,RoomDn BUTTON RtB,0,40,5,btnvar3,1,AddTemp BUTTON LtB,0,40,5,btnvar4,1,SubTemp HLB_Done: 'Write to LCD if room//2 = 1 then Show_Lo Show_Hi: serout LCD,N96N,["Room:",dec Room/2," High:",dec TempHL(room)," " ] goto HL_Done Show_Lo: serout LCD,N96N,["Room:",dec Room/2," Low:",dec TempHL(room)," " ] HL_Done: goto HLLoop RoomUp: room=(room+1)//(NumRooms * 2 + 2 ) goto HLB_Done RoomDn: room=(room+(NumRooms*2)+1)//(NumRooms * 2 + 2 ) goto HLB_Done AddTemp: TempHL(room)=TempHL(room)+1 goto HLB_Done SubTemp: TempHL(room)=TempHL(room)-1 goto HLB_Done '----------------------------------------------------------------- WriteEEPROM: Goto Main2 '----------------------------------------------------------------- '----------------------------------------------------------------- Pager_Menu: serout LCD,N96N,["Pager_Menu" ] pause 600 GOSUB Clear btnvar=0 PagerLoop: IF IN10 = 0 THEN Main2 BUTTON UpB,0,255,255,btnvar,1,PagerChange Gosub Clear If pager = 0 then Pager_Off_D serout LCD,N96N,["Pager is ON"] Goto PagerLoop Pager_Off_D: serout LCD,N96N,["Pager is OFF"] Goto PagerLoop PagerChange: pager=pager+1 GOTO PagerLoop '----------------------------------------------------------------- '----------------------------------------------------------------- Number_Menu: serout LCD,N96N,["Number_Menu" ] IF IN10 = 0 THEN Main2 Goto Number_Menu '----------------------------------------------------------------- '----------------------------------------------------------------- NumRoom_Menu: serout LCD,N96N,["NumRoom_Menu" ] IF IN10 = 0 THEN Main2 Goto NumRoom_Menu '----------------------------------------------------------------- '----------------------------------------------------------------- SleepTime_Menu: serout LCD,N96N,["SleepTime_Menu" ] btnvar=0:btnvar2=0 STLoop: IF IN10 = 0 THEN Main2 GOSUB HomeLCD BUTTON UpB,0,40,5,btnvar,1,SleepUp BUTTON DnB,0,40,5,btnvar2,1,SleepDn STB_Done: 'Write to LCD serout LCD,N96N,["Sleep Time: ",dec SleepTime," " ] goto STLoop SleepUp: SleepTime=Sleeptime+1 goto STB_Done SleepDn: SleepTime=Sleeptime-1 goto STB_Done Goto SleepTime_Menu '-----------------------------------------------------------------