SHT11 KULLANIMI

Başlatan kaganayanoglu, 28 Şubat 2019, 12:31:10

kaganayanoglu

ISIHESAP: 
    
    if HAM<4000 then 
    ISARET=1 'sıcaklık eksi değerde demek
    ISI_DEGER1= (HAM-4000) /100
    ISI_DEGER2= ((HAM-4000 )//100 )/10  
    endif
    
    if HAM>16384 then
    ISI_DEGER1=0 : ISI_DEGER2=0
    endif  
    return

Yukardaki ısı ölçüm hesabını anlamadım. Sensör digital olarak deger gönderiyorsa bu ham değer nasıl sayısal olabiliyor.

Bu formülle ısı değerini görüntüleyemiyorum. Kodların tamamı aşağıda.

Teşekkürler.

;----[16F887 Hardware Configuration]--------------------------------------------
#IF __PROCESSOR__ = "16F887"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _INTRC_OSC_NOCLKOUT    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
cfg1&= _WDT_OFF               ; WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_OFF             ; RE3/MCLR pin function is digital input, MCLR internally tied to VDD
cfg1&= _CP_OFF                ; Program memory code protection is disabled
cfg1&= _CPD_ON                ; Data memory code protection is enabled
cfg1&= _BOR_OFF               ; BOR disabled
cfg1&= _IESO_OFF              ; Internal/External Switchover mode is disabled
cfg1&= _FCMEN_OFF             ; Fail-Safe Clock Monitor is disabled
cfg1&= _LVP_OFF               ; RB3 pin has digital I/O, HV on MCLR must be used for programming
cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
  __CONFIG _CONFIG1, cfg1

cfg2 = _BOR40V                ; Brown-out Reset set to 4.0V
cfg2&= _WRT_OFF               ; Write protection off
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF


'*************************************
'ISLEMCI TANIMLAMALARI
DEFINE OSC 4       'KRİSTAL FREKANSI        
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 ' IC KRISTAL KULLANILIYOR 
DEFINE ADC_SAMPLEUS 20
'*************************************
ADCON1 = %10001001   'SAGA YASLANIK sonuç almak için

TRISA = %00000111  'ISI SENSOR GIRISLERI
TRISB = %00000000  'LCD UCLARI VE PROGRAMLAMA UCLARI
TRISC = %00110001  '
TRISD = %11100000  'BUTONLAR GIRIS
TRISE = %00000010  '
PORTD = %00000000  'HEPSI I/O PORT
ANSELH = 0         'AN8-9-10-11-12-13   DIGITAL GIRIS CIKIS OLACAK CUNKU ORADA LCD BAGLI
ANSEL = %00000111  'AN0-1-2 ANALOG OLACAK, AN3-4-5-6-7 DIGITAL GIRIS CIKIS OLACAK
PSTRCON = %00000000 'PULSE STEERING MODE kapalı


Pause 100 ' 100 ms AÇILIŞ GECİKMESİ


DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı? LCD nin D0 D1 D2 D3 
DEFINE LCD_DBIT 0          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 4         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4
'*************************************
PAUSE 1000
'*************************************

'PORT TANIMLAMALARI (DIGITAL PORTLAR)

ART             VAR PORTD.6   'GIRIS
AZAL            VAR PORTD.5   'GIRIS
SET             VAR PORTD.7   'GIRIS


DTA       VAR PORTC.0
CLK       VAR PORTC.1

'SHT 11 SENSÖR DEĞİŞKENLERİ değişkenler------------------------------
KOD         VAR     BYTE	          
NEM_DEGER1  VAR     BYTE         
NEM_DEGER2  VAR     BYTE
ISI_DEGER1  VAR     BYTE         
ISI_DEGER2  VAR     BYTE
HAM		VAR	    WORd
HAM0    VAR     HAM.BYTE0
HAM1    VAR     HAM.BYTE1
HAM2    VAR     HAM.BYTE0
HAM3    VAR     HAM.BYTE1
P1      VAR     WORD
P2      VAR     WORD
P3      VAR     WORD             
W       VAR     WORD     
HATA    var     BIT
DRM     VAR     BIT
NEM     VAR     BYTE
NEM1    VAR     BYTE
i       VAR     BYTE


'*************************************
'DEGISKEN TANIMLAMALARI
ISI           VAR WORD
ISI1          VAR WORD
ISI2          VAR WORD
ONDA          VAR WORD
ISARET        VAR BYTE
IC_ISI        VAR WORD
T             VAR BYTE
SIRA          VAR BYTE
ILK           VAR BYTE
DEGER         VAR WORD



READ 0,NEM
READ 1,NEM1 
READ 2,ISI
READ 3,ISI1 

DRM=0
GOSUB SENSOR_START

BASLA:
 IF SET=0 THEN 
        WHILE SET=0 : WEND
        PAUSE 100
        TOGGLE DRM
        ENDIF
        IF DRM=1 THEN  GOTO NEM_BTN_KNTRL     
         
      KOD=%00000101:HAM=0  'NEM OLCUM KODU      
        GOSUB OLCUMAL                      
        Gosub RUTHESAP
        PAUSE 1
        LCDOut $FE,1      
        LCDOut $FE,$80,"NEM : ", DEC2 NEM_DEGER1, ",", DEC1 NEM_DEGER2,"%Rh"
      KOD=%00000011:HAM=0  'ISI ÖLCUM KODU
        GOSUB OLCUMAL   
        Gosub ISIHESAP                 
       ' LCDOut $FE,1      
        LCDOut $FE,$C0,"ISI : ", DEC4 ISI_DEGER1, ",", DEC4 ISI_DEGER2,"'C" 
        pause 500
                                        
       IF  NEM>NEM_DEGER1 OR (NEM=NEM_DEGER1 AND NEM1>NEM_DEGER2) THEN 
       HIGH PORTA.3
       ELSE 
       LOW PORTA.3
       ENDIF                  
Goto BASLA

'*************************************
 NEM_BTN_KNTRL:
 PAUSE 200
  LCDOut $FE,1
  LCDOut $FE,$80,"ORTAM NEM:",DEC3 NEM_DEGER1 , ",", DEC1 NEM_DEGER2,"% rH"  
  LCDOUT $FE,$C0,"NEM AYAR :",DEC3 NEM,         ",", DEC1 NEM1,      "% rH" 
  i=0
  BUTTON ART,  0,100,100,i,1,NEM_ARTI
  PAUSE 1
  i=0
  BUTTON AZAL, 0,100,100,i,1,NEM_EKSI
  PAUSE 1
  i=0
  BUTTON SET,  0,100,100,i,1,ARA
  PAUSE 1
  GOTO NEM_BTN_KNTRL
  
 ARA:
  IF SET=0 THEN
  GOTO ISI_BTN_KNTRL
  ELSE
  GOTO NEM_BTN_KNTRL
  ENDIF
   
 ISI_BTN_KNTRL:
  PAUSE 200
  LCDOut $FE,1
  LCDOut $FE,$80,"ORTAM ISI:", DEC2 ISI_DEGER1, ",", DEC1 ISI_DEGER2," 'C"  
  LCDOUT $FE,$C0,"ISI   SET:", DEC2 ISI,        ",", DEC1 ISI1,      " 'C" 
  i=0
  BUTTON ART,  0,100,100,i,1,ISI_ARTI 
  PAUSE 1
  i=0
  BUTTON AZAL, 0,100,100,i,1,ISI_EKSI
  PAUSE 1
  i=0
  BUTTON SET,  0,100,100,i,1,SON
  PAUSE 1
  GOTO ISI_BTN_KNTRL  
  
SON:

IF SET=0 THEN
 WHILE SET=0 : WEND
 TOGGLE DRM
    IF DRM=0 THEN BASLA 
    ENDIF
        
NEM_ARTI:
  PAUSE 100
  NEM1=NEM1+1
IF NEM1=10 THEN NEM1=0:NEM=NEM+1
IF NEM=100 THEN NEM=0
  i=0
  WRITE 0,NEM
  WRITE 1,NEM1
  GOTO NEM_BTN_KNTRL :
 
ISI_ARTI:
  ISI1=ISI1+1
IF ISI1=10 THEN ISI1=0:ISI=ISI+1
IF ISI=100 THEN ISI=0
  i=0
  WRITE 2,ISI
  WRITE 3,ISI1
  GOTO ISI_BTN_KNTRL :

NEM_EKSI:
 PAUSE 100
 NEM1=NEM1-1
 IF NEM1=255 THEN NEM1=9:NEM=NEM-1
 IF NEM=255 THEN NEM=100:NEM1=0
  WRITE 0,NEM
  WRITE 1,NEM1
  i=0
 GOTO NEM_BTN_KNTRL

ISI_EKSI:  
 ISI1=ISI1-1
 IF ISI1=255 THEN ISI1=9:ISI=ISI-1
 IF ISI=255 THEN ISI=100:ISI1=0
  WRITE 2,ISI
  WRITE 3,ISI1
  i=0
 GOTO ISI_BTN_KNTRL

'*********************** 
SENSOR_START:
        OUTPUT DTA
        OUTPUT CLK
        
        HIGH DTA
        LOW  CLK
        PAUSE 1
        HIGH CLK
        LOW  DTA
        PAUSE 1
        LOW  CLK
        PAUSE 1
        HIGH CLK
        PAUSE 1
        HIGH DTA
        LOW  CLK
        RETURN 

'************************************* 
 '-----------------------------R E S E T -----------------------------------------------------------
RESET:  
        OUTPUT DTA
        OUTPUT CLK
        HIGH DTA
        FOR W=0 TO 9
        HIGH CLK
        pause 1
        LOW  CLK
        Next W
        Return
        '-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL: 
        GOSUB SENSOR_START
        SHIFTOUT DTA,CLK,1,[KOD]
        INPUT DTA
        PULSOUT CLK,10
        HATA=0
        FOR W=0 to 65500
           IF DTA=0 then OKU
        NEXT W
        HATA=1
        

OKU:  
       IF HATA=1 then 
       gosub ARIZA
       endif
       SHIFTIN DTA,CLK,0,[HAM]
       OUTPUT DTA
       LOW DTA
       PULSOUT CLK,10
       INPUT DTA
       SHIFTIN DTA,CLK,0,[HAM]
       PULSOUT CLK,10
       RETURN
          
'-------------------------RUTUBET HESAP ALT PROGRAMI-------------------------------------------------
 RUTHESAP: 
         
    p1=(26542-(54722**ham+ham))**ham-40     
    P2=655+(HAM*5)+(HAM**15917)	      
    P3=(P2**2480)-(P2**2730)+P1  
    NEM_DEGER1=p3/10:NEM_DEGER2=p3//10
    
    IF ham>3710 THEN
    NEM_DEGER1=0:NEM_DEGER2=0
    GOTO NEM_ARIZA
    ENDIF  
    return       
'-------------------------RUTUBET HESAP ALT PROGRAMI-------------------------------------------------
 ISIHESAP: 
    
    if HAM<4000 then 
    ISARET=1 'sıcaklık eksi değerde demek
    ISI_DEGER1= (HAM-4000) /100
    ISI_DEGER2= ((HAM-4000 )//100 )/10  
    endif
    
    if HAM>16384 then
    ISI_DEGER1=0 : ISI_DEGER2=0
    endif  
    return    
'----------------------------------------------------------------------------------  
          
NEM_ARIZA: LCDOUT $FE,1,"NEM OLCUM HATASI"
          PAUSE 1500               
           RETURN
        END   
        
ISI_ARIZA: LCDOUT $FE,1,"ISI OLCUM HATASI"
          PAUSE 1500               
           RETURN
        END 
        
ARIZA: LCDOUT $FE,1,"SENSOR ARIZASI"
          PAUSE 1500               
           RETURN
        END                   
 '----------------------------------------------------------------------------------------

END

Isı değeri Simulasyonda "0" gözüküyor.

mustafa_cmbz

Forumda araştır protonda yazılmış örnekler var o örneklerde çarpanlar vs olması lasım sen tanımlamışsın ama bunlara değer atamamışsın sanırım.

kaganayanoglu

ETE nin yazdığı kodu inceledim. Bunu çalıştırdığımda ise ısı değeri simulasyonda SHT11 üzerinden yükseltildiğinde nem değeride yükseliyor. Fakat nem değeri değiştirildiğinde ısı değerinde değişme olmuyor.

;----[16F887 Hardware Configuration]--------------------------------------------
#IF __PROCESSOR__ = "16F887"
  #DEFINE MCU_FOUND 1
#CONFIG
cfg1 = _INTRC_OSC_NOCLKOUT    ; INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
cfg1&= _WDT_OFF               ; WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_OFF             ; RE3/MCLR pin function is digital input, MCLR internally tied to VDD
cfg1&= _CP_OFF                ; Program memory code protection is disabled
cfg1&= _CPD_ON                ; Data memory code protection is enabled
cfg1&= _BOR_OFF               ; BOR disabled
cfg1&= _IESO_OFF              ; Internal/External Switchover mode is disabled
cfg1&= _FCMEN_OFF             ; Fail-Safe Clock Monitor is disabled
cfg1&= _LVP_OFF               ; RB3 pin has digital I/O, HV on MCLR must be used for programming
cfg1&= _DEBUG_OFF             ; In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
  __CONFIG _CONFIG1, cfg1

cfg2 = _BOR40V                ; Brown-out Reset set to 4.0V
cfg2&= _WRT_OFF               ; Write protection off
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

#ENDIF

;----[Verify Configs have been specified for Selected Processor]----------------
;       Note: Only include this routine once, after all #CONFIG blocks
#IFNDEF MCU_FOUND
  #ERROR "No CONFIGs found for [" + __PROCESSOR__ +"]"
#ENDIF


'*************************************
'ISLEMCI TANIMLAMALARI
DEFINE OSC 4       'KRİSTAL FREKANSI        
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 ' IC KRISTAL KULLANILIYOR 
DEFINE ADC_SAMPLEUS 20
'*************************************
ADCON1 = %10001001   'SAGA YASLANIK sonuç almak için

TRISA = %00000111  'ISI SENSOR GIRISLERI
TRISB = %00000000  'LCD UCLARI VE PROGRAMLAMA UCLARI
TRISC = %00110001  '
TRISD = %11100000  'BUTONLAR GIRIS
TRISE = %00000010  '
PORTD = %00000000  'HEPSI I/O PORT
ANSELH = 0         'AN8-9-10-11-12-13   DIGITAL GIRIS CIKIS OLACAK CUNKU ORADA LCD BAGLI
ANSEL = %00000111  'AN0-1-2 ANALOG OLACAK, AN3-4-5-6-7 DIGITAL GIRIS CIKIS OLACAK
PSTRCON = %00000000 'PULSE STEERING MODE kapalı


Pause 100 ' 100 ms AÇILIŞ GECİKMESİ


DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı? LCD nin D0 D1 D2 D3 
DEFINE LCD_DBIT 0          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 4         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 5          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 4
'*************************************
'---------------------------değişkenler------------------------------
    KONTROL VAR     BYTE	   
    ISI1    VAR     BYTE      
    ISI2    VAR     BYTE      
    U1      VAR     BYTE         
    U2      VAR     BYTE
    H0      VAR     HAM.BYTE0
    H1      VAR     HAM.BYTE1
    HAM		VAR	    WORD
    RAW     var     word
    ISI     VAR     WORD 
    P1      VAR     WORD
    P2      VAR     WORD
    P3      VAR     WORD             
    W       VAR     WORD
    DTA       VAR PORTC.0
    CLK       VAR PORTC.1 
    ISARET  VAR     BIT   'sensor değeri 0 ise artı, 1 ise eksi
    HATA    var     BIT

  '-----------------------------B A Ş L A N G I Ç ---------------------------    
 
   	
                     
    PAUSE 200: ISARET=0
    LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti dataları    
    LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0 
    LCDOut $FE,1
    gosub reset : GOSUB T_START
'-------------------------------------------------------------------------------    
BASLA:   
        KONTROL=%00000011: HAM=0   'SICAKLIK ÖLÇME
        GOSUB OLCUMAL
       'HAM=4000 sıfır dereceye tekabül ediyor, HAM=3000 -10 derece oluyor.
        Gosub ISIHESAP: GOSUB EKRAN1
        
        KONTROL=%00000101: HAM=0 'RUTUBET ÖLÇME
        GOSUB OLCUMAL
        'HAM=3710 bu değer %100 rutubete eşdeğerdir.
        GOSUB RUTHESAP: GOSUB EKRAN2
        
'--------BU ARAYA ISI VE RUTUBETE BAĞLI KONTROL RUTİNİ YERLEŞTİRİLECEK--------------------
GOTO BASLA
       
ATLA:    
        SLEEP 1
        GOTO BASLA			
'------------------------------------------------------------------
'---------------------------------------EKRANA YAZ ------------------------------------------------	
EKRAN1:	LCDOut $FE,2       
        if ISARET=1 THEN
        LCDOut "  ISI : -",DEC2 ISI1 , "," , DEC1 ISI2," ",0,"C ": RETURN  
        endIF 
        LCDOut "  ISI :  ",DEC2 ISI1 , "," , DEC1 ISI2," ",0,"C ": RETURN
        
EKRAN2:	LCDOut $FE,$C0:
'        LCDOUT "RAI=",#RAI,"HAM=",#HAM  'deneme için
    	LCDOut "  NEM : ",DEC2 U1 , "," , DEC1 U2,"  % "  : RETURN
				
'----------------------------------------------------------------------------------
        
'------------------------------- İŞLEM START ------------------------------------------------------
T_START:
        OUTPUT DTA: OUTPUT CLK
        HIGH DTA
        LOW CLK
        PAUSE 1
        HIGH CLK
        LOW DTA
        PAUSE 1
        LOW CLK
        PAUSE 1
        HIGH CLK
        PAUSE 1
        HIGH DTA
        LOW CLK
        RETURN

'-----------------------------R E S E T -----------------------------------------------------------
RESET:  OUTPUT DTA:OUTPUT CLK':TRISA.0=0:TRISA.1=0'
        high DTA=1
        FOR W=0 TO 9
        HIGH CLK
        pause 1
        LOW CLK
        Next W
        Return
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL: GOSUB T_Start
        SHIFTOUT DTA,CLK,1,[KONTROL]
        INPUT DTA
        PULSOUT CLK,10
        HATA=0
        FOR W=0 to 65500
           IF DTA=0 then EXID
        NEXT W
        HATA=1
        RETURN
        
EXID:  IF HATA=1 then 
         gosub SENSORYOK
       endif
       SHIFTIN DTA,CLK,0,[H1]
       OUTPUT DTA
       LOW DTA
       PULSOUT CLK,10
       INPUT DTA
       SHIFTIN DTA,CLK,0,[H0]
       PULSOUT CLK,10
       RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------      
ISIHESAP:  
           if ham<4000 then 
              ISARET=1 'sıcaklık eksi değerde demek
              ISI1= (4000-HAM)/100
              ISI2= ((4000-ham)//100)/10   
              goto ISISON
            endif
           ISI1= (HAM-4000)/100
           ISI2= ( (HAM-4000)//100)/10
ISISON:    if HAM>16384 then
             ISI1=0:ISI2=0
           endif  
    RETURN
'-------------------------RUTUBET HESAP ALT PROGRAMI-------------------------------------------------
 RUTHESAP:  
           ISI=ISI1*10+ISI2
           p1= (26542- (54722**ham+ham))**ham-40     
           P2=655+ (HAM*5)+ (HAM**15917)	      
           P3= (P2** (ISI+2480))- (P2**2730)+P1   ' kompanse edilmiş değer
           U1=p3/10:U2=p3//10
           IF ham>3710 THEN
              u1=0:U2=0
              GOTO SENSORYOK
           ENDIF  
           return       
'----------------------------------------------------------------------------------  
       
SENSORYOK: LCDOUT $FE,$02,"   SENSOR YOK   "
           LCDOUT $FE,$C0," LUTFEN TAKINIZ "  
           PAUSE 1000               
           RETURN
        END                     
       

ete

Bunun sebebi sensörün Bağıl nem hesabı yaması ve bunun için ortam sıcaklığını hesaba katmasıdır. Çünki bağıl nem (Relative Humidity) ortam sıcaklığına göre değişim gösterir. Sıcaklık arttıkça havanın nem taşıma kabiliyeti artar. 1 m3 havayı 20 derede iken neme doyurun yalnızca taşıyabileceği kadar (17,31 gr/m3) nem alır . Bu konumda nem değerini ölçünce size %100 nem gösterir. Aynı havayı 50 dereceye çıkartın gösterdiği nem %21 e düşer. Çünki 50 derecede 1 m3 hava 82,98 gr suyu nem olarak içine alabilir. 
Sonuçta bağıl nem hava sıcaklığına bağlı olarak değişir sensörde bunu hesaplamada kullanıyor.


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com