'----------------------------------------------------------------------------------------- 'copyright : (c) 2008-2009, AVRprojects.info 'purpose : Bluetooth Smart Home '----------------------------------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 3686400 $baud = 115200 Load1 Alias Pinb.4 Load2 Alias Pinb.3 Load3 Alias Pinb.2 Load4 Alias Pinb.1 Load5 Alias Pinb.0 $prog &H00 , &H00 , &H00 , &H00 ' generated. Take care that the chip supports all fuse bytes. $PROG &H00,&H00,&H00,&H00' generated. Take care that the chip supports all fuse bytes. Pir Alias Pind.6 Declare Sub Read1820 Declare Sub Device_control Config Pir = Input Config Load1 = Output Config Load2 = Output Config Load3 = Output Config Load4 = Output Config Load5 = Output Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.1 , Db6 = Portc.0 , Db7 = Portb.5 , E = Portc.3 , Rs = Portc.4 Config Lcd = 16 * 2 'configure lcd screen Config Adc = Single , Prescaler = Auto , Reference = Internal 'The prescaler divides the internal clock by 2,4,8,16,32,64 or 128 'Because the ADC needs a clock from 50-200 KHz 'The AUTO feature, will select the highest clockrate possible Config 1wire = Portd.3 Dim Light As Integer 'Temp variables Dim Bd1 As Byte Dim Bd2 As Byte Dim Bd7 As Byte Dim Bd8 As Byte Dim W As Word Dim Tmp As Byte Dim T As Integer , T1 As Integer Dim T2 As Integer , T3 As Integer Dim Bd(9) As Byte Dim Devstat As Byte Dim Dsid1(8) As Byte 'Dallas ID 64 bits incl CRC Dim Dsid2(8) As Byte Devstat = 0 Portb = Devstat Cls 'Clear display Cursor Off Locate 1 , 3 'set cursor position Lcd "Welcome to" Lowerline 'second line Lcd "avrprojects.info" ' Wait 1 W = 1wirecount() ' Here I assume 2 sensors - no errorcontrol made, but would be easy to do with the "Err"-variable ' Getting the two sensors IDs. Dsid1(1) = 1wsearchfirst() Do Dsid2(1) = 1wsearchnext() Loop Until Err = 1 Start Adc Do Light = Getadc(5) Light = Light / 10 Light = Light - 10 1wreset ' reset the bus 1wwrite &HCC ' skip rom 1wwrite &H44 ' Convert T Waitms 400 1wverify Dsid1(1) 'Issues the "Match ROM " If Err = 0 Then 'lcd " Sensor found" Read1820 T2 = T T3 = T1 Lcd "T1:" ; T1 ; "." ; T End If 1wverify Dsid2(1) If Err = 0 Then ' lcd " Sensor found " Read1820 End If Print "X" Cls Lcd "Lig:" ; Light ; "%" Locate 1 , 9 If Pir = 0 Then Print "Pir:Normal" ; "Y" Lcd "PIR:Nor" Else Print "Pir:Ab-Normal" ; "Y" Lcd "PIR:ANor" End If Lowerline Lcd "T1:" ; T1 ; "." ; T ; " T2:" ; T3 ; "." ; T2 Print "Lig:" ; Light ; "Y" Print "Tp1:" ; T1 ; "." ; T ; "Y" Print "Tp2:" ; T3 ; "." ; T2 ; "Y" Print "Z" Device_control Waitms 300 Device_control Waitms 300 Device_control Waitms 400 Loop 'Read the DS1820 Sub Read1820 ' reads sensor ans calculate ' T for 0.1 C 1wwrite &HBE ' read 9 data bytest Bd(1) = 1wread(9) Bd1 = Bd(1) Bd2 = Bd(2) Bd7 = Bd(7) Bd8 = Bd(8) ' read bytes in array 1wreset ' reset the bus Tmp = Bd1 And 1 If Tmp = 1 Then Decr Bd1 ' 0.1C precision T = Bd1 T = T * 50 T = T - 25 T1 = Bd8 - Bd7 T1 = T1 * 100 T1 = T1 / Bd8 T = T + T1 T1 = T / 100 'store tens T = T Mod 100 'store decimal number End Sub Sub Device_control Tmp = Inkey() 'get ascii value from serial port If Tmp = 65 Then 'DEVICE 1 ON Set Devstat.4 Portb = Devstat Elseif Tmp = 66 Then 'DEVICE 1 Off Reset Devstat.4 Portb = Devstat Elseif Tmp = 67 Then 'we got something Set Devstat.3 Portb = Devstat Elseif Tmp = 68 Then 'we got something Reset Devstat.3 Portb = Devstat Elseif Tmp = 69 Then 'we got something Set Devstat.2 Portb = Devstat Elseif Tmp = 70 Then 'we got something Reset Devstat.2 Portb = Devstat Elseif Tmp = 71 Then 'we got something Set Devstat.1 Portb = Devstat Elseif Tmp = 72 Then 'we got something Reset Devstat.1 Portb = Devstat Elseif Tmp = 73 Then 'we got something Set Devstat.0 Portb = Devstat Elseif Tmp = 74 Then 'we got something Reset Devstat.0 Portb = Devstat Elseif Tmp = 75 Then 'we got something Devstat = &HFF Portb = Devstat Elseif Tmp = 76 Then 'we got something Devstat = &H0 Portb = Devstat End If End Sub End