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