I found this code posted by NavMicroSystems, made some SLIGHT changes, and it works perfectly. Cheers to everyone. This works for both the SHT1x and the SHT7x sensors. I have pasted the code below for everyone to see, and play with should the need arise. Thanks again to everyone who spent time trying to make my little project work. Beers are on me (sorry, no delivery outside of my local area)
Code:
'** Pin-Assingments
DEFINE xtal 4
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 1
Define LCD_EREG PORTB
Define LCD_EBIT 3
portB.2=0
output portb.2
dta VAR PORTD.0 ' Sensor Data
clk VAR PORTD.1 ' Sensor Clock
'** Constants
cmdtr CON %00000011 ' Command "read temperature"
cmdhr CON %00000101 ' Command "read humitity"
'** Variables
result VAR WORD ' RAW Data from Sensor
chksum VAR BYTE ' Checksum
cmd VAR WORD ' Sensor Command
RHlin VAR WORD ' Rel. Humidity (RH) Linear (% *10)
RHtc VAR WORD ' Rel. Humidity (RH) temp. compensated (% *10)
Temp VAR WORD ' Temperature (°C *100)
DP VAR WORD ' Dewpiont (°C *10)
'** Temp variables used in div. calculations
TempDP VAR WORD
Rchk VAR BYTE
logEW VAR WORD
sign VAR BIT
wy VAR WORD
wz VAR WORD
wj VAR WORD
wx VAR WORD
i VAR BYTE
ix VAR BYTE
bt VAR BIT
Pause 500
LCDOut $FE,1,"** SHT 71 **"
PAUSE 1000
main:
GoSub init
cmd = cmdtr
GoSub readsensor
Temp=result-3995
GoSub init
cmd = cmdhr
GoSub readsensor
RHlin=(26542-(54722**result+result))**result-40 ' RH linear
RHtc=655+(result*5)+(result**15917)
RHtc=(RHtc**(Temp/10+2480))-(RHtc**2730)+RHlin ' RH temp. compensated
'GoSub dewpoint
LCDOut $FE,$80," ",$DF,"C"," ",$25,"RH"," DP "
LCDOut $FE,$C0,DEC2 (TEMP/100),".",DEC1 (temp/10)," ",DEC2 RHlin/10,".",DEC1 RHLin'," ",DEC2 ABS DP/10,".",DEC1 ABS dp
pause 1000
GoTo main
'** Init Sensor
init:
High dta
Low clk
For i=1 to 10
High clk
Pause 1
Low clk
Pause 1
Next i
Call tstart
Return
'** start transfer
tstart:
High clk
Pause 1
Low dta
Pause 1
Low clk
Pause 1
High clk
Pause 1
High dta
Pause 1
Low clk
Return
'** get Data from Sensor
readsensor:
GoSub tstart
GoSub WaitSensor
ShiftOut dta,clk,1,[cmd\8] ' send command
Input dta ' wait acknowledge
Low clk
While dta=1
Wend
PulsOut clk,10 ' send ack
While dta=0
Wend
While dta=1 ' wait for conversion to complete
Wend
Low clk
ShiftIn dta,clk,0,[result.highbyte\8] ' get first byte
Low dta
PulsOut clk,10 ' send ack
ShiftIn dta,clk,0,[result.lowbyte\8] ' get second byte
Low dta
PulsOut clk,10 ' send ack
ShiftIn dta,clk,0,[chksum\8] ' get third byte (checksum)
High dta
PulsOut clk,10 ' send ack
Input dta ' End of Transmission
Input clk
Return
'** Dewpoint Calculation
' See: SENSIRION Application Note "Dewpoint Calculation"
' logEW = (0.66077+7.5*T/(237.3+T)+(log(RH)-2)
' DP = ((0.66077-logEW)*237.3)/(logEW-8.16077)
DewPoint:
TempDP=Temp/10
logEW=6608
sign=TempDP.bit15
wz=ABS TempDP
wx=(7*wz)+(wz/2)
wy=2373+wz
wj=wx/wy
For ix=15 to 0 step -1
wx=(wx//wy)<<1
wz.bit0(ix)=wx/wy
Next
wx=(-sign^((wj*10000)+(wz**10000)))+sign
logEW=wx+logEW
wx=RHtc
wj=(NCD wx) - 1
wx=wx<<(15-wj)
wz=0
For ix=14 to 0 step -1
wy=wx**wx
wz.bit0(ix)=wy.bit15
bt=~wy.bit15
wx=(wy<<bt)+(bt &&="" wx.bit15)="">
Next
wx=((wj*4000)**49321)+(wz**6021)
logEW=wx+logEW-30000
sign=logEW.bit15
logEW=(-sign^(((ABS logEW)+2)/4))+sign
wx=1652-logEW
sign=~wx.bit15
wx=ABS wx
wy=20402-logEW
wj=wx/wy
For ix=15 to 0 step -1
wx=(wx//wy)<<1
wz.bit0(ix)=wx/wy
Next
DP=((23730**wz)+5)/10
DP=(-sign^DP)+sign
Return
WaitSensor:
result=4096
Loop:
result=result-1
IF dta && result.bit11 Then Loop
Return
End
</bt)+(bt>
Bookmarks