SHT20 Kullanımı Hakkında

Başlatan Elektronikprojem, 24 Şubat 2022, 00:11:38

Elektronikprojem

Merhaba, SHT20 sensörü proton veya picbasic ile kullanan oldu mu?
Yaklaşık 3 gündür uğraşıyorum sensörü okuyamadım. Proteusta simülasyonda sht21 çıkıyor. Kodlar SHT21 ile simülasyonda çalışıyor ama gerçek devrede sht20 var ve çalıştıramıyorum. Devre donanımsal olarak tüm özellikleri karşılıyor.

ete

aşağıda bir örnek veriyorum.

Ete

X VAR WORD
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
CLK VAR PORTA.1
DTA VAR PORTA.0
ISARET VAR BIT 'sensor değeri 0 ise artı, 1 ise eksi
HATA VAR BIT

CLEAR
ADCON1 = 7



TRISA=%111100
TRISB=%00001111
trisc=%11110001
TRISD=%00111100
TRISE=%111



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

KONTROL=%00000101:HAM=0 'RUTUBET ÖLÇME
GOSUB OLCUMAL
'HAM=3710 bu değer %100 rutubete eşdeğerdir.
GOSUB RUTHESAP

LCDOut $FE,1
LCDOut DEC2 ISI1,".",DEC1 ISI2,0,"C R=",DEC U1,".",DEC1 U2,"%"
pause 1000
goto basla

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 EXIT
Next W
HATA=1
EXIT: 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

DigMan

Ete hocam merhaba,

verdiğiniz örnek program SPI haberleşmeli SHT10-11-15(ShiftOut DTA,CLK,1,[KONTROL]) için değil mi?

SHT20; I2C(SDA,SCL) protokolüne sahip, bu şekilde de kullanabilir miyiz? Çalışır mı bu şekilde?

ete

#3
ESki sensirion sensörleri sanal I2C denilen ve standart I2C olmayan bir formatta çalışıyor idi.
Shift komutu bir seri haberleşme komutu olup I2C de seri haberleşme komutudur.
Ancak anladığım kadarı ile Sensirion firması bu sensörle birlikte standart I2C formatına dönmüş gözüküyor. Bunu SHT20 nin data sheet'ini inceleyince anladım.
Her ne kadar standart I2C ile haberleşsede yine START ve STOP uygulama konumlarını içeriyor diğer sensörleri gibi.
Start emri verildikten sonra cihaz koduna dikkat ederek standart I2C komutları ile çalışacağını düşünüyorum. ELimde sensör yok üstelik simulasyonda da model dosyası yok. Kısaca deneme imkanım yok. Sensörün Cihaz Kodu Yazma için %10000000 , %10000001 Okuma için olmalı. Ayrıca Sıcaklık ve Nem için adres bilgileri mevcut.

Sensörün iki farklı okuma modu bulunuyor. Birisi Hold Comm, diğeri no Hold Comm. No Hold Comm modunda işin idaresi az çok sensör tarafından yapılıyor. Okuma henüz bitmemiş ise ACK vermiyor ve işlemciyi o konumda tutuyor. Okuma işi tamamlanınca ACK yı vererek işlemciyi serbest bırakıyor. Bana bu çalışma şekli mantıklı geldi.

Okumaya başlamak için Önce bir start konumu sensöre verilmeli.
START :
HIGH SCL :Pause 15  'en az 15ms sensör high da tutulmalı diyor data sheet
HIGH SDA:pauseus 10:LOW SDA :LOW SCL

I2CWRITE SDA,SCL,%10000000,%11110011:pauseus 20
I2CREAD  SDA,SCL,%10000001,0,[THbyte,TLowbyte,Check]
STOP:
HIGH SCL:LOW SDA:pauseus 30:HIGH SDA

Normal Sıcaklık çevirme formülü , T=-46,85 + 175,2 * Ham_TOkunan /65536
Bunu Basic dilinde yapabilmek için şöyle bir formül kullanacağız.
T= -4685 + (685*/HamTOkunan)/10
ISI=T/100: Ondalık=T//100

Okuma emri olarak Rutubet okumayı verirseniz (%11110101 ) ki bu standart I2C haberleşmesinde Adres yerine kullanılıyor nem ham değerini okursunuz.
Buradan ne hesabı için stamdart formül,
Rh=-6 + 125 * (HamRhOkunan/65536)
Bunu basic de kullanabilmek için şöyle yapıyoruz.
Rh=-600 + (488 */HamRhOkunan)/10
Nem=Rh/100 : NemOndalık=Rh//100

ELinde sensör olan birisi varsa deneyebilir sonucu bildirirse sevinirim.

Ete


amatör

Sayın ete hocam merhabalar, ekibe yeni katıldım. Sizden bir konuda yardım istiyorum. Rica etsem, kuluçka makinası için hazır kod var elimde kod sht11'e göre yazılmış fakat benim elimde sht20 var ve sistemime takınca kararsız çalışmakta sht20 için nasıl kod düzenlenmeli nem ve sıcaklık için kod konusunda yardım ederseniz minnettar kalırım. Şimdiden teşekkürler

ete

Bir önceki mesajımda her şeyi açıklamışım. Oraya bakıp da bir şeyyapamıyorsan sana hazır kod lazım demektirki oda bana uymaz maalesef.

Ete

amatör

hocam sadece nasıl yazacagımı bıraz anlatırsanız yapabilecegime inanıyorum. yinede çok sağolun

ete

#7
Nasıl yazacağını soruyor isen bunu yazabşleceğini pek sanmıyorum.
İlk defa duydum bu soruyu nasıl yazacağım? Enteresan soru ve nasıl bir cevap verebileceğimi bilemiyorum. Önceki mesajımda aslında nasıl yazılacağını daha doğrusu nasıl yapılacağını anlatmıştım. Tekrar anlatayım. Bu sefer biraz daha program formatına uygun olsun umarım anlarsın.
Mevcut programda "sensor_oku" veya benzeri bir alt program olması gerekir. Oradaki yazılanları sileceksin. Sensor_Oku alt programı aşağıdaki gibi olacak.
Sensor_oku:
START :
HIGH SCL :Pause 15  'en az 15ms sensör high da tutulmalı diyor data sheet
HIGH SDA:pauseus 10:LOW SDA :LOW SCL
I2CWRITE SDA,SCL,%10000000,%11110011:pauseus 20 'sıcaklık okuma emrini verdik
I2CREAD  SDA,SCL,%10000001,0,[HAM.Hbyte,HAM.Lowbyte,Check] 'sıcaklığı okuduk 
STOP:
HIGH SCL:LOW SDA:pauseus 30:HIGH SDA
ISI= -4685 + (685*/Ham)/10
ISI=ISI/100: Ondalık=ISI//100

HIGH SCL :Pause 15  'en az 15ms sensör high da tutulmalı diyor data sheet
HIGH SDA:pauseus 10:LOW SDA :LOW SCL
I2CWRITE SDA,SCL,%10000000,%11110101:pauseus 20 'nem okuma emrini verdik
I2CREAD  SDA,SCL,%10000001,0,[HAM.Hbyte,HAM.Lowbyte,Check] 'nem okuduk :
HIGH SCL:LOW SDA:pauseus 30:HIGH SDA

NEM=-600 + (488 */Ham)/10
NEM=NEM/100 : NemOndalık=NEM//100
RETURN

Ete

amatör

#8
mazur görün sayın hocam, öğrenmekte istiyorum aslında hazırda elimde kod var deneme yanılma yolu ile birazda araştırmayla bir kaç şeyi düzeltip yazılımı çalıştırmıştım fakat kod işlerinden anlamam

elimde şu kod var sayın hocam bi bakarsanız sevinirim dogru mu yanlış mı
DEFINE OSC 4
@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF & _CP_OFF

TRISA=%111111
TRISB=%00000001
TRISC=%01110000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG        PORTB    
DEFINE LCD_DBIT        4        
DEFINE LCD_RSREG    PORTB    
DEFINE LCD_RSBIT    2    
DEFINE LCD_EREG        PORTB    
DEFINE LCD_EBIT        3        
DEFINE LCD_BITS        4    
DEFINE LCD_LINES    4
ADCON1 = 7      
'---------------------------değişkenler----------------------------------------- 
    A        VAR    BYTE
    D        VAR    BYTE
    E        var    byte 
    SYC      VAR    BYTE
    AY      var    byte
    YIL      var    byte
    SN      VAR    BYTE
    DAK      VAR    BYTE
    SAAT    VAR    BYTE
    HAFTA    VAR    BYTE
    GUN      VAR    BYTE
    MEM      var    byte 
    ONLAR    VAR    BYTE
    BIRLER  VAR    BYTE
    GN      VAR    BYTE
    ZAMAN    VAR    BYTE
    Y        VAR    BIT
    UPC      VAR    BIT
    AYR      VAR    BIT
    SAYI    VAR    BYTE 
    SAYAC    VAR    BYTE
    AYAR    VAR    BYTE
    TERM    VAR    BYTE
    NEM      VAR    BYTE
    KONTROL  VAR    BYTE
    ORTAK    VAR    BYTE
    CNY      VAR    BYTE      
    ISI1    VAR    BYTE      
    ISI2    VAR    BYTE      
    U1      VAR    BYTE        
    U2      VAR    BYTE
    C0      VAR    BYTE
    Z        VAR    BYTE
    K        VAR    BYTE
    SAY      VAR    BYTE
    ZAM      VAR    BYTE
    DX      VAR    BYTE
    H0      VAR    HAMISI.BYTE0
    H1      VAR    HAMISI.BYTE1
    HAMISI    VAR    WORD
    RAW      var    word
    ISISHT  VAR    WORD 
    RUT      VAR    WORD
    P1      VAR    WORD
    P2      VAR    WORD
    P3      VAR    WORD            
    C        VAR    WORD
    B        VAR    WORD
    W        VAR    WORD
    ORTAISI  VAR    WORD
    FARK    VAR    WORD
    DUR      VAR    BYTE 
    SCK    VAR    PORTA.5
    DTA    VAR    PORTA.3  
    ISARETSHT  VAR    BIT  'sensor değeri 0 ise artı, 1 ise eksi
    SIGN    VAR    BIT      'ısı isareti 0 ise artı 1 ise eksi
    HATA    var    BIT
    MENU    VAR    PORTA.0
    YUKARI  VAR    PORTA.1
    ASAGI  VAR    PORTA.2
    
        'ISI
Busy        VAR BIT        ' Busy Status-Bit
HAM        VAR    WORD        ' Sensör HAM okuma değeri
ISI        VAR WORD        ' Hesaplanmış ISI değeri
Float      VAR WORD        ' Holds remainder for + temp C display
X          VAR WORD      
ISARET_BITI  VAR HAM.Bit11  '  +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI  CON 1          ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE    CON 223        ' ° işareti
ISARET    VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE      ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1  ' One-wire Data-Pin "DQ" PortB.0 da

    
    symbol ROLE1=PORTC.0
    symbol ROLE2=PORTC.1
    symbol ROLE3=PORTC.2
    SYMBOL ROLE4=PORTC.3
    SYMBOL BUZER=PORTE.0
    
    RTC_RST    var PORTC.5
    RTC_CLK    var PORTC.6
    RTC_DTA    var PORTC.4
'-----------------------------B A Ş L A N G I Ç ------------------------------    
          LOW ROLE1
          LOW ROLE2
          LOW ROLE3
          LOW ROLE4
        PAUSE 20
    '    CLEAR: 'TRISA=%00111111:TRISB=0
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
        PAUSE 500: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,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
        LCDOUT $FE,$58,16,8,4,2,4,8,16,0    'LCD 3. KARAKTER HAFIZASI YON İŞARETİ    
GIRIS: 
        LCDOUT $FE,$82,""                
        lcdout $FE,$C3,""
        lcdout $FE,$95,"  "
        lcdout $FE,$D9," "
        PAUSE 5000
        LCDOUT $FE,1 
        
'-------------------------------------------------------------------------------
BASLANGIC:
SYC=0 
AYAR=1
READ $07,GN:IF GN=255 THEN GN=1
READ $01,TERM:IF TERM=255 THEN TERM=0
READ $02,NEM:IF NEM=255 THEN NEM=0
READ $09,DUR:IF DUR=255 THEN DUR=0
READ $10,ZAM:IF ZAM=255 THEN ZAM=0
READ $11,A:IF A=255 THEN A=1
READ $06,UPC
READ $13,AYR
gosub ZAMAN_OKU 
                    
BASLA:  
              KONTROL=%00000011:HAMISI=0  'SICAKLIK ÖLÇME
        GOSUB OLCUMAL
        Gosub ISIHESAP
              KONTROL=%00000101:HAMISI=0  'RUTUBET ÖLÇME
        GOSUB OLCUMAL
        GOSUB RUTHESAP:GOSUB SENSOROKU
        GOSUB ORTISI
        GOSUB ZAMAN_OKU
        GOSUB GUNEBAK
        GOSUB EKRAN1
        GOSUB ISIKONTROL
        GOSUB RUTKONTROL
        IF AYR=0 THEN
        GOSUB HAVAKONTROL
        ELSE
        LOW ROLE4
        ENDIF
        IF UPC=1 THEN 
        GOSUB DONUSEBAK
        ENDIF
        IF MENU=1 THEN  GOTO AYAR_MENUSU

goto BASLA      
'---------------------------------------EKRANA YAZ -----------------------------    
EKRAN1:    
        lcdout $FE,$80,2,"=",DEC2 ISI1,",",DEC1 ISI2," A=",DEC2 ISI,",",DEC1 (FLOAT)," S=",DEC2 TERM,",",DEC1 A
        lcdout $FE,$C0,"ORTISI=",DEC2 ORTAISI,",",DEC1 CNY,0,"C NEM%",DEC2 U1
        LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN," ",DEC2 GN,".GUN"
        LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
            IF SN=DUR THEN LOW ROLE3
        IF SAAT=0 AND DAK=0 AND SN=0 THEN 
              GN=GN+1
            IF GN=31 THEN GN=1
            WRITE $07,GN
        ENDIF
        RETURN
'''''''''''''''''MOTOR ÇALIŞ ''''''''''''''''' 
DONUSEBAK:
'HER SAAT BAŞI ÇEVİR 
                IF ZAM=1 AND DAK=0 AND SN=0 THEN
                HIGH ROLE3
                ENDIF

        IF ZAM=2 THEN 'İKİ SAATTE BİR ÇEVİR
                
              
                IF SAAT=0 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF              
                
                IF SAAT=2 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIf                
                
                IF SAAT=4 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                
                
                IF SAAT=6 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                

                IF SAAT=8 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF

                IF SAAT=10 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF              

                IF SAAT=12 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF              

                IF SAAT=14 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF          

                IF SAAT=16 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF                

                IF SAAT=18 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF              

                IF SAAT=20 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF

                IF SAAT=22 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF
        ENDIF
        
        IF ZAM=3 THEN  '3 SAATTE BİR ÇEVİR
                IF SAAT=0 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF              
                
                IF SAAT=3 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIf                
                
                IF SAAT=6 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                
                
                IF SAAT=9 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                
                  
                IF SAAT=12 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF
                  
                IF SAAT=15 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF              
                  
                IF SAAT=18 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF              
                
                IF SAAT=21 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF
        ENDIF 
                          
        IF ZAM=4 THEN '4 SAATTE BİR ÇEVİR
                IF SAAT=0 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF              
                
                IF SAAT=4 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIf                
                
                IF SAAT=8 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                
                
                IF SAAT=12 AND DAK=0 AND sn=0 THEN 
                HIGH ROLE3
                ENDIF                
                  
                IF SAAT=16 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF
                
                IF SAAT=20 AND DAK=0 AND sn=0 THEN  
                HIGH ROLE3
                ENDIF          
        ENDIF 
    
RETURN            

GUNEBAK:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN
  
SENSOROKU: 
          OWOUT  Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
          OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
          IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
          OWOUT  Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
          OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
          GOSUB  Hesapla
          RETURN
Hesapla:                ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
      ISARET  = "-"  
      ham=~ham+2
    endif
    float = (HAM*10)/16        ' 
    ISI=FLOAT/10  
    RETURN  
'------------------------------- İŞLEM START -----------------------------------
T_START:
      OUTPUT SDA:OUTPUT CLK
        HIGH SDA
        LOW CLK
      PAUSE 1
        HIGH CLK
        LOW SDA
      PAUSE 1
        LOW CLK
      PAUSE 1
        HIGH CLK
      PAUSE 1
        HIGH SDA
        LOW CLK
RETURN
'-----------------------SENSORE KOMUT GÖNDER -----------------------------------
OLCUMAL:
          GOSUB T_Start
        SHIFTOUT SDA,CLK,1,[KONTROL]
          INPUT SDA
        PULSOUT CLK,10
                HATA=0
            FOR W=0 to 65500
              IF SDA=0 then GIT
            NEXT W
                HATA=1
GIT:        
              IF HATA=1 then 
          endif
        SHIFTIN SDA,CLK,0,[H1]
          OUTPUT SDA
            LOW SDA
        PULSOUT CLK,10
          INPUT SDA
        SHIFTIN SDA,CLK,0,[H0]
        PULSOUT CLK,10
RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------    
ISIHESAP:  
          If HAMISI<4000 then 
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/100
              ISI2=((4000-HAMISI)//100)/10  
        goto ISISON
        endif
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
ISISON:    
          
          ISI1=(HAMISI-4000)/100
          ISI2=((HAMISI-4000)//100)/10
RETURN      
'-------------------------RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP: 
              'ISI=ISI1*10+ISI2
              p1=(26542-(54722**HAMISI+hamISI))**HAMISI-25    
              P2=655+(HAMISI*5)+(HAMISI**15917)          
              P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1  
              U1=p3/10:U2=p3//10
          IF HAMISI>3710 THEN
              U1=0:U2=0
        ENDIF  
return 

ORTISI:
ORTAISI=((ISI1*10+ISI2)+FLOAT)/20
CNY=((ISI1*10+ISI2)+FLOAT)/2
RETURN
'----------------------------ISI KONTROL----------------------------------------
ISIKONTROL:

        if TERM<ORTAISI-0 then  
          LOW Role1
        ENDIF
        if ORTAISI+0<TERM+0 then          
        HIGH ROLE1              
      Endif
      IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN 
'----------------------------RUTKONTROL-----------------------------------------        
RUTKONTROL:
          if NEM<U1 then  
        HIGH Role2
        ELSE              
          LOW ROLE2
        ENDIF
        IF MENU=1 THEN  GOTO AYAR_MENUSU
RETURN

HAVAKONTROL:
FARK=ISI1-ISI
IF FARK.Bit15=1 then FARK=~FARK 
IF FARK>1 then 
  ROLE4=1
ELSE
  ROLE4=0
ENDIF
RETURN
BIP:
    HIGH buzer  
pause 50
    LOW buzer  
  RETURN
BIPBIP:
    HIGH buzer  
    PAUSE 50
      LOW buzer 
    PAUSE 100
    HIGH BUZER
    PAUSE 50
      LOW BUZER 
RETURN
'-------------------------------------------------------------------------------
AYAR_MENUSU:
GOSUB BIP
WHILE MENU=1:WEND
GOSUB TEMIZLE
SYC=0
AYARLAR:
IF YUKARI=1 THEN 
GOSUB BIP
WHILE YUKARI=1:WEND
SYC=SYC+1
  IF SYC=8 THEN SYC=0
ENDIF

IF ASAGI=1 THEN
GOSUB BIP
WHILE ASAGI=1:WEND
SYC=SYC-1
  IF SYC=255 THEN SYC=7
ENDIF
GOSUB DURUM
GOTO AYARLAR

DURUM:
SELECT CASE SYC
CASE 0
lcdout $fe,$c0,"  ISITICI AYARLARI  "
LCDOUT $FE,$94,"                    "
IF MENU=1 then 
WHILE MENU=1:WEND
GOSUB BIP 
GOTO TERM_KONTROL
ENDIF
CASE 1
lcdout $fe,$c0,"    NEM AYARLARI    " 
LCDOUT $FE,$94,"                    "
IF MENU=1 then
WHILE MENU=1:WEND
GOSUB BIP 
GOTO NEM_KONTROL
ENDIF
CASE 2
lcdout $fe,$c0,"  CEViRiCi MOTOR  "
LCDOUT $FE,$94,"      AYARI      "
IF MENU=1 then 
WHILE MENU=1:WEND
GOSUB BIP
GOTO MOT_AYAR
ENDIF
CASE 3
lcdout $fe,$c0,"  SAAT-TARiH-GUN  "
LCDOUT $FE,$94,"        AYARI      "  
IF MENU=1 then 
GOSUB BIP
WHILE MENU=1:WEND
GOTO ZAMANAYARI
ENDIF
CASE 4
lcdout $fe,$C0,"  MANUEL OLARAK    "
lcdout $fe,$94,"  MOTORU CEVIRME  "
IF MENU=1 theN
GOSUB BIP
WHILE MENU=1:WEND
GOTO MANUEL
ENDIF
CASE 5
lcdout $fe,$c0,"    GUN AYARI      " 
LCDOUT $FE,$94,"                    "    
IF MENU=1 then
GOSUB BIP 
WHILE MENU=1:WEND
GOTO GUNAYARI
ENDIF
CASE 6
lcdout $fe,$c0,"SICAKLIK DENGELEYiCi" 
LCDOUT $FE,$94,"    FAN AYARI      "
IF MENU=1 then 
WHILE MENU=1:WEND
GOSUB BIP
GOTO FANKONTROL
ENDIF 
CASE 7
lcdout $fe,$c0,"    MENUDEN CIKIS  " 
LCDOUT $FE,$94,"                    "  
IF MENU=1 THEN AYARLANDI
END SELECT
RETURN

MANUEL:
GOSUB TEMIZLE 
MANU:
lcdout $fe,$80,"MOTORU CALISTIRMAK "
LCDOUT $FE,$C0,"iCiN YUKARIYA    " 
LCDOUT $FE,$94,"BASINIZ...          "
      IF MENU=1 then
      GOTO AYAR_MENUSU  
      ENDIF        
        
        IF YUKARI=1 THEN
        lcdout $fe,$D4,"MOTOR CALISIYOR  " 
        HIGH ROLE3
        ELSE 
        lcdout $fe,$D4,"MOTOR KAPALI    " 
        LOW ROLE3
        ENDIF
        
GOTO MANU

GUNAYARI:
      WHILE MENU=1:WEND
      GOSUB TEMIZLE
      READ $07,GN
GUNA:      
    LCDOUT $FE,$80,"GUNU AYARLA"  
    lcdout $FE,$C0,"GUN:",DEC2 GN
    IF MENU=1 THEN
      WRITE $07,GN:PAUSE 2
      GOTO AYAR_MENUSU 
      ENDIF
    
        IF YUKARI=1 THEN 
        GN=GN+1
        IF GN=31 THEN GN=1
        WHILE YUKARI=1:WEND
        ENDIF
        
        IF ASAGI=1 THEN 
        GN=GN-1
        IF GN=0 THEN GN=30
        WHILE ASAGI=1:WEND
        ENDIF
            
    GOTO GUNA 
    
FANKONTROL:
GOSUB TEMIZLE:
FANKONT:
      lcdout $fe,$80,"FAN DURUMUNU"
      LCDOUT $FE,$C0,"SECINIZ..."
      lcdout $FE,$94,"  KAPALI"
      LCDOUT $FE,$D4,"  ACIK"
      IF MENU=1 THEN
          WRITE $13,AYR:PAUSE 2
          GOTO AYAR_MENUSU
      ENDIF
          IF YUKARI=1 THEN AYR=1
          IF ASAGI=1 THEN AYR=0
          
          SELECT CASE AYR
          CASE 0
          LCDOUT $FE,$D4,3
          CASE 1
          LCDOUT $FE,$94,3
      END SELECT    
GOTO FANKONT
    
            
''''''''''''''''''''''''''''''''''''''''        
MOT_AYAR:
        WHILE MENU=1:WEND
        GOSUB TEMIZLE
        READ $06,UPC
MOTOR_AYAR:
      lcdout $fe,$80,"MOTOR DURUMUNU"
      LCDOUT $FE,$C0,"SECINIZ..."
      lcdout $FE,$94,"  ACIK"
      LCDOUT $FE,$D4,"  KAPALI"
          IF MENU=1 THEN
          WRITE $06,UPC:PAUSE 2
          GOTO M_ZAMANI
          ENDIF
          IF YUKARI=1 THEN UPC=1
          IF ASAGI=1 THEN UPC=0
            
          SELECT CASE UPC
          CASE 0
          LCDOUT $FE,$D4,3
          CASE 1
          LCDOUT $FE,$94,3
          END SELECT        
        GOTO MOTOR_AYAR        
M_CALISMA:
        GOSUB TEMIZLE
        WHILE MENU=1:WEND
        READ $09,DUR
MOTO_CALISMA:
          IF MENU=1 THEN 
          WRITE $09,DUR:PAUSE 2
          GOTO AYAR_MENUSU  
          ENDIF
      lcdout $fe,$C0,"MOTOR CALISMA SURESi " 
      lcdout $FE,$94,"SURE :",DEC2 DUR," SANIYE"
      
          IF YUKARI=1 THEN 
          DUR=DUR+1
          WHILE YUKARI=1:WEND
          ENDIF  
          IF DUR=60 THEN DUR=0
          IF ASAGI=1 THEN 
          DUR=DUR-1
          WHILE ASAGI=1:WEND
          ENDIF
          IF DUR=255 THEN DUR=59
        GOTO MOTO_CALISMA                          
M_ZAMANI:
        GOSUB TEMIZLE
        WHILE MENU=1:WEND
        READ $10,ZAM
MOTO_ZAMANI:
        IF ZAM=255 THEN ZAM=1
        IF YUKARI=1 THEN
        ZAM=ZAM+1
        WHILE YUKARI=1:WEND
        ENDIF
        IF ZAM=5 THEN ZAM=4 
        IF ASAGI=1 THEN
        ZAM=ZAM-1
        WHILE ASAGI=1:WEND
        ENDIF
        IF ZAM=0 THEN ZAM=1      
        IF MENU=1 THEN
        WRITE $10,ZAM:PAUSE 2
        GOTO M_CALISMA
        ENDIF

        lcdout $fe,$C0,"MOTORU ",DEC1 ZAM," SAATTE BiR"
        lcdout $FE,$94,"CEVRiLSiN.."
GOTO MOTO_ZAMANI
                                                                                
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  
AYARLANDI:
          IF MENU=1 then AYARLANDI
      lcdout $fe,1
      LCDOUT $FE,$C0,"AYARLAR KAYDEDiLDi.." 
      GOSUB BIPBIP
      AYAR=1
      SYC=0
      PAUSE 800
        
        GOSUB TEMIZLE
        goto BASLANGIC      
TEMIZLE:
        lcdout $fe,1
RETURN        
'-------------------------------------------------------------------------------
TERM_KONTROL:
      GOSUB TEMIZLE 
      READ $01,TERM:READ $11,A      
SET_AYAR:  
LCDOUT $FE,$C0,"ISI LiMiTiNi SECIN"
LCDOUT $FE,$94,"AYAR:",DEC2 TERM,",",DEC1 A          
          IF YUKARI=1 then 
              A=A+1
                IF A=10 THEN 
                A=0:TERM=TERM+1
                ENDIF
              IF TERM=100 THEN TERM=0
              PAUSE 150
          ENDIF
          IF ASAGI=1 then 
              A=A-1
                IF A=255 then 
                A=9:TERM=TERM-1
                ENDIF
              IF TERM=255 THEN TERM=99
              PAUSE 150
          ENDIF 
                
        IF MENU=1 THEN 
        WRITE $01,TERM:PAUSE 2
        WRITE $11,A:PAUSE 2
        GOTO AYAR_MENUSU
        ENDIF 
                      
GOTO SET_AYAR      
'-------------------------------------------------------------------------------
NEM_KONTROL:
      GOSUB TEMIZLE
      READ $02,NEM
NEM_KONT:  
      lcdout $fe,$C0,"NEM LiMiT"
      lcdout $FE,$94,"AYARI: %",DEC2 NEM
        
          IF YUKARI=1 then NEM=NEM+1
        WHILE YUKARI=1:WEND 
          IF NEM=01 then NEM=121
          
          IF ASAGI=1 then NEM=NEM-1
        WHILE ASAGI=1:WEND
          IF NEM=121 then NEM=01        
            IF MENU=1 THEN 
            WRITE $02,NEM:PAUSE 2
            GOTO AYAR_MENUSU  
            ENDIF                
        GOTO NEM_KONT    
      RETURN
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''      
ZAMANAYARI:
WHILE MENU=1:WEND
GOSUB TEMIZLE
AYAR=1
ZAMANAYAR:
IF MENU=1 THEN 
AYAR=AYAR+1
WHILE MENU=1:WEND
ENDIF
GOSUB BUTONOKU
        LCDOUT $FE,$80,"    ZAMAN AYARI    "      
        LCDOUT $FE,$94,"SAAT ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
        LCDOUT $FE,$D4,"TARIH ",DEC2 GUN,"/",DEC2 AY,"/",DEC2 YIL
GOSUB GUNYAZ
IF AYAR=7 THEN ZAMAN_B
GOTO ZAMANAYAR

GUNYAZ:
SELECT CASE HAFTA
CASE 1
LCDOUT $FE,$E3,"PTESI"
CASE 2
LCDOUT $FE,$E3," SALI"
CASE 3
LCDOUT $FE,$E3," CARS"
CASE 4
LCDOUT $FE,$E3," PERS"
CASE 5
LCDOUT $FE,$E3," CUMA"
CASE 6
LCDOUT $FE,$E3,"CTESI"
CASE 7
LCDOUT $FE,$E3," PAZR"
END SELECT
RETURN

BUTONOKU:
SELECT CASE AYAR
CASE 1
LCDOUT $FE,$C0,"SAAT    "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
SAAT=SAAT+1
IF SAAT=24 THEN SAAT=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND
SAAT=SAAT-1
IF SAAT=255 THEN SAAT=23
ENDIF 

CASE 2
LCDOUT $FE,$C0,"DAKIKA"
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
DAK=DAK+1
IF DAK=60 THEN DAK=0
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND 
DAK=DAK-1
IF DAK=255 THEN DAK=59
ENDIF

CASE 3
LCDOUT $FE,$C0,"GUN    "  
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
GUN=GUN+1
IF GUN=31 THEN GUN=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND 
GUN=GUN-1
IF GUN=0 THEN GUN=30 
ENDIF

CASE 4
LCDOUT $FE,$C0,"AY    "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND
AY=AY+1
IF AY=13 THEN AY=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND 
AY=AY-1
IF AY=0 THEN AY=12
ENDIF

CASE 5
LCDOUT $FE,$C0,"YIL      "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND 
YIL=YIL+1
IF YIL=51 THEN YIL=5
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND 
YIL=YIL-1
IF YIL=4 THEN YIL=50
ENDIF

CASE 6
LCDOUT $FE,$C0,"HAFTA    "
IF YUKARI=1 THEN
WHILE YUKARI=1:WEND 
HAFTA=HAFTA+1
IF HAFTA=8 THEN HAFTA=1
ENDIF
IF ASAGI=1 THEN
WHILE ASAGI=1:WEND 
HAFTA=HAFTA-1
IF HAFTA=0 THEN HAFTA=7
ENDIF
END SELECT
RETURN


ZAMAN_B:
        IF MENU=1 then ZAMAN_B
        gosub ZAMAN_YAZ
goto AYAR_MENUSU      
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ZAMAN_OKU:
    high RTC_RST:OUTPUT RTC_DTA
shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, HAFTA, YIL, MEM]  'OKU
        MEM=SN:GOSUB CEVIR:SN=SAYI
        MEM=DAK:GOSUB CEVIR:DAK=SAYI
        MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
        MEM=GUN:GOSUB CEVIR:GUN=SAYI
        MEM=AY:GOSUB CEVIR:AY=SAYI
        MEM=YIL:GOSUB CEVIR:YIL=SAYI
        MEM=HAFTA:GOSUB CEVIR:HAFTA=SAYI
    low RTC_RST 
  return

ZAMAN_YAZ:
        MEM=sn:gosub TERSCEVIR:sn=SAYI
        MEM=DAK:gosub TERSCEVIR:DAK=SAYI
        MEM=SAAT:gosub TERSCEVIR:SAAT=SAYI
        MEM=GUN:gosub TERSCEVIR:GUN=SAYI
        MEM=AY:gosub TERSCEVIR:AY=SAYI
        MEM=YIL:gosub TERSCEVIR:YIL=SAYI
        MEM=HAFTA:GOSUB TERSCEVIR:HAFTA=SAYI

    high  RTC_RST
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
    low RTC_RST:PAUSEUS 10 
    high RTC_RST          
SHIFTOUT RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, HAFTA, YIL, 128]  'YAZ
    low RTC_RST
PAUSEUS 10
  return

CEVIR:
        ONLAR=MEM & %01110000
        ONLAR=ONLAR>>4
        BIRLER=MEM & %00001111
        SAYI=ONLAR*10+BIRLER
  return

TERSCEVIR:
        ONLAR=MEM DIG 1
        ONLAR=ONLAR<<4
        BIRLER=MEM DIG 0
        SAYI=ONLAR+BIRLER
  return 
  

END
   
   




ete

#9
Böyle bir kodun doğruluğunu ancak çalıştırınca anlarsın. Yoksa göz kontrolü sadece yazımda bir hata varmı onu belirler.
Asıl olan mantık yani algoritma kontrolüdür ve sistemi çalıştırmadan önce pek anlaşılmaz. Her program için geçerli değil söylediklerim ama böyle kapsamlı işlerde benim dediğim gibi olur.
Programa baktım zaten pek çok yeri benim kodlardan alımış. Yinede anlamsız gelen yerler var.
Bir tanesi,
GIRIS:
         LCDOUT $FE,$82,""               
         lcdout $FE,$C3,""
         lcdout $FE,$95,"   "
         lcdout $FE,$D9," "
         PAUSE 5000
         LCDOUT $FE,1 
Yanlış değil ama anlamsız.
İlk 4 satır LCD deki satırları silmeye yarıyor. LCDOUT $FE,1 komutu ise tek komut olarak LCD yi silmeye yarıyor. Anlayacağın yukarıdaki 4 satırın orada olmasının bir anlamı yok en sondaki zaten bu işi yapıyor. İlk 4 satırdaki silme işleminin tek farkı var her satırda ilk bir iki karekteri silmiyor buda anlamsız geldi bana zaten 5 sn sonra hepsini siliyorsun neden o satırlar orada anlayamadım doğrusu.

Devrede hem SHTxx sensör olarak kullanılmış ki hem sıcaklık hemde nem ölçebiliyor. Ayrıca DS18B20 sıcaklık sensörüde kullanılmış. Çift ısı sensörü neden acaba. ? bir mantığı yok benim açımdan.
Tek sebebi olabilir nem ölçtüğü nokta ile sıcaklık ölçülen nokta farklı yerlerde olması gerekiyor olabilir. Bir kuluçka makinasında buda pek mantıklı gelmedi bana. İşin (kuluçka makinasının) uzmanı değilim sadece mantık yürütüyorum.

Kod yazmak işin senaryosuna göre her kesin farklı yollardan giderek aynı işi yaptırdıkları bir iş tir. Bunlardan daima birisi en iyi ve kusursuz çalışır. Bu nedenle yazmadan önce Algoritma denilen çalışma mantığı ve çözümleri üretilip bir senaryoya bağlanmalıdır.

Sonuç olarak kodun doğruluğu yanlışlığını burada koda bakarak test etmek zor ve yapılabilse bile epeyce vakit alan bir işlemdir. Saatlerce sürebilir hatta bütün bir gününü alabilir. Kimsenin o kadar vakti olamaz. Buna vakit ayıracak tek kişi olabilir oda sen. Sana lazım bu iş sen bakacaksın. Aksayan noktalarda yardım isteyebilirsin ama işin bütünü için kimse yardımcı olmaz olamaz da.

Ete

amatör

anlıyorum sayın hocam gerçekten çok teşekkür ederim. İlginiz ve yardımlarınız için, devreyi yaptım çalıştırdım. Sayın hocam işte tek sorun, sht20 ile çalışıyor ama kararsız çalışıyor sistem, sıcaklığı ve nemi ölçüyor fakat kararsız gibi nem birden yükseliyor sıcaklık ise normal seyirde, ds 18b20 sensörü arasında 3 veya 4 ısı farkı oluyor olmasını istemediğim şey, bu şekilde oluncada hava kontrol sürekli devreye giyiyor. sizin vermiş olduğunuz kodu bi deneme yaptım dediğiniz gibi uyulama yaptım fakat hex dosyası alamadm hep hata verdi yanlış satır veya eşleşmeyeyen gibi,

ete

#11
Programını SHT20 ye göre değiştirdim. Olup olmadığını ancak devresinde deneyerek anlamak mümkün olur sanırım.

Ete

amatör

sayın hocam cok cok tesekkur ederım. en kısa zamanda deneyip size bilgi vereceğim hocam

amatör

Sayın ete hocam selamlar allah rağzı olsun uğraşıp kodu düzenlemişsiniz ne kadar teşekkür etsem azdır. verdiğiniz kodu önce smülasyonda denedim fakat ekrana hiçbir şey gelmiyor. adımı soyadımı falan yazdırıp tekrar hex dosyası aldım ekrana ilk önce adım soyadım yazdıktan sonra geçiş yapıp ekran kararıyor ve hiçbirşey gelmiyor hocam, normal çalışıyor gibi görünüyor. Ama ekrana yazmıyor sanırım verdiğiniz kod işe yaramış gibi görünüyor hocam, simülasyonda sht20 yerine sht10 taktığımda şu şekilde uyarı veriyor. arayüz bağlantı koptu yeni bir sıfırlama sırası bekleyin simülasyonda tekrar sht20 takınca uyarı yok ama dediğim gibi hocam ekrana hiçbirşey yazımıyor sorun nerede olabilir sayın hocam tekrar teşekkür ederim saygılarımla

ete

sorun nerede bilemem. Ancak simule ederek çözüm bulunabilir. Dosyaları buraya koyarsan bakarım.
Ete

Powered by EzPortal