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.
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.
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
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