Sensirion SHT11 with a PIC16F628-20


View Poll Results: Have I included enough relevant material to make the problem clear?

Voters
1. You may not vote on this poll
  • YES. I see what you mean

    0 0%
  • COULD BE BETTER: Kind of understand what your trying to say

    1 100.00%
  • NO: What the heck are you talking about

    0 0%
Results 1 to 27 of 27

Threaded View

  1. #2
    Join Date
    Feb 2004
    Location
    Germany
    Posts
    762


    Did you find this post helpful? Yes | No

    Default

    attached is a working piece of code for the 16F628

    Code:
    ___________________
    
    ' Temperature, Relative Humidity and Dewpoint
    ' Processor : 16F628
    ' Sensor    : SHT1x / SHT7x
    ' Display   : 16x2
    
    '** Pin-Assingments
    
    dta     VAR PORTB.1     ' Sensor Data
    clk     VAR PORTB.0     ' 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 11   **"
    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 RHTC/10,".",DEC1 RHTC,"  ",DEC2 ABS DP/10,".",DEC1 ABS dp
    sleep 10
    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
    ___________________

    Regards

    Ralph
    Last edited by ScaleRobotics; - 6th April 2011 at 15:24. Reason: added code tags

Similar Threads

  1. Watchdog Timers
    By Squibcakes in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 27th August 2014, 18:03
  2. INT2 anomaly in DT_INTS-18??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 17th February 2010, 20:07
  3. capture/repeat data ?
    By Sam in forum Serial
    Replies: 44
    Last Post: - 27th November 2006, 03:19
  4. A little DTMF help
    By Travin77 in forum mel PIC BASIC Pro
    Replies: 48
    Last Post: - 30th May 2006, 01:31
  5. Serout PIC16F628 to PC R18iXL Board
    By Spindle in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 19th June 2005, 00:29

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts