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)
</bt)+(bt>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




Bookmarks